Maqheka a ho sebetsa metrics ho Kapacitor

Ho ka etsahala hore ebe kajeno ha ho motho ea botsang hore na ke hobane'ng ha ho hlokahala ho bokella metrics ea litšebeletso. Mohato o latelang o utloahalang ke ho theha tlhokomeliso bakeng sa metrics e bokelletsoeng, e tla tsebisa ka phapano efe kapa efe ea data ho liteishene tse u loketseng (mail, Slack, Telegraph). Ts'ebeletso ea phepelo ea hotele ea inthaneteng Ostrovok.ru metrics eohle ea lits'ebeletso tsa rona e tšeloa ho InfluxDB mme e hlahisoa Grafana, 'me tlhokomeliso ea mantlha le eona e lokiselitsoe moo. Bakeng sa mesebetsi e kang "o hloka ho bala ho hong le ho bapisa le eona," re sebelisa Kapacitor.

Maqheka a ho sebetsa metrics ho Kapacitor
Kapacitor ke karolo ea TICK stack e ka sebetsanang le metrics ho tsoa ho InfluxDB. E ka hokahanya litekanyo tse 'maloa hammoho (ho kopanya), bala ntho e sebetsang ho tsoa ho data e amohetsoeng, ngola sephetho ho InfluxDB, romella tlhokomeliso ho Slack/Telegram/mail.

Sekhahla sohle se pholile ebile se na le lintlha litokomane, empa ho tla lula ho e-na le lintho tse molemo tse sa bontšoang ka ho hlaka libukeng tsa litaelo. Sengoliloeng sena, ke nkile qeto ea ho bokella malebela a bohlokoa joalo, a sa totobalang (syntax ea mantlha ea TICKscipt e hlalositsoe. mona) le ho bontša hore na li ka sebelisoa joang ho sebelisoa mohlala oa ho rarolla bo bong ba mathata a rōna.

A re tsamaee!

float & int, liphoso tsa lipalo

Bothata bo tloaelehileng, bo rarolloa ka li-castes:

var alert_float = 5.0
var alert_int = 10
data|eval(lambda: float("value") > alert_float OR float("value") < float("alert_int"))

Ho sebelisa kamehla ()

Haeba tag/tšimo e sa tlatsoa, ​​liphoso tsa lipalo li tla etsahala:

|default()
        .tag('status', 'empty')
        .field('value', 0)

tlatsa ho kopanya (ka hare vs kantle)

Ka kamehla, ho ikopanya ho tla lahla lintlha moo ho se nang data (ka hare).
Ka tlatsa('null'), ho tla etsoa kopano ea kantle, ka mor'a moo o hloka ho etsa default() ebe o tlatsa boleng bo se nang letho:

var data = res1
    |join(res2)
        .as('res1', 'res2)
        .fill('null')
    |default()
        .field('res1.value', 0.0)
        .field('res2.value', 100.0)

Ho ntse ho na le nuance mona. Mohlala o ka holimo, haeba e 'ngoe ea letoto (res1 kapa res2) e se na letho, letoto le hlahang (data) le lona le tla be le se na letho. Ho na le litekete tse 'maloa sehloohong sena ho Github (1633, 1871, 6967) - re emetse litokiso le mahlomola hanyenyane.

Ho sebelisa maemo lipalo (haeba ho lambda)

|eval(lambda: if("value" > 0, true, false)

Metsotso e mehlano ea ho qetela ho tloha peiping ea nako

Mohlala, o hloka ho bapisa boleng ba metsotso e mehlano e fetileng le bekeng e fetileng. U ka nka lihlopha tse peli tsa data ka lihlopha tse peli tse arohaneng kapa ua ntša karolo ea data ho tloha nakong e kholoanyane:

 |where(lambda: duration((unixNano(now()) - unixNano("time"))/1000, 1u) < 5m)

Mokhoa o mong bakeng sa metsotso e mehlano e fetileng e ka ba ho sebelisa BarrierNode, e fokotsang data pele ho nako e behiloeng:

|barrier()
        .period(5m)

Mehlala ea ho sebelisa Go templates molaetsa

Lithempleite li lumellana le sebopeho sa sephutheloana mongolo.templateKa tlase ke tse ling tsa lipuzzle tse atisang ho kopana le tsona.

haeba-ho seng joalo

Re beha lintho ka tatellano 'me ha re bake batho ka mongolo hape:

|alert()
    ...
    .message(
        '{{ if eq .Level "OK" }}It is ok now{{ else }}Chief, everything is broken{{end}}'
    )

Linomoro tse peli ka mor'a ntlha ea decimal molaetseng

Ho ntlafatsa ho baloa ha molaetsa:

|alert()
    ...
    .message(
        'now value is {{ index .Fields "value" | printf "%0.2f" }}'
    )

Ho atolosa diphapano tsa molaetsa

Re hlahisa lintlha tse ling molaetseng ho araba potso "Hobaneng ho hoeletsa"?

var warnAlert = 10
  |alert()
    ...
    .message(
       'Today value less then '+string(warnAlert)+'%'
    )

Sekhetho se ikhethileng sa tlhokomeliso

Sena ke ntho e hlokahalang ha ho na le lihlopha tse fetang bonngoe ho data, ho seng joalo ho tla hlahisoa temoso e le 'ngoe feela:

|alert()
      ...
      .id('{{ index .Tags "myname" }}/{{ index .Tags "myfield" }}')

Custom handler's

Lethathamo le leholo la ba sebetsang le kenyelletsa exec, e u lumellang hore u phethe sengoloa sa hau ka li-parameter tse fetisitsoeng (stdin) - boqapi mme ha ho letho le leng hape!

E 'ngoe ea litloaelo tsa rona ke sengoloa se senyenyane sa Python bakeng sa ho romella litsebiso ho thella.
Qalong, re ne re batla ho romella senepe sa grafana se sirelelitsoeng ka tumello ka molaetsa. Ka mor'a moo, ngola OK ka khoele ho temoso e fetileng ho tsoa sehlopheng se le seng, eseng joalo ka molaetsa o arohaneng. Nakoana hamorao - eketsa molaetsa phoso e atileng haholo metsotsong e fetileng ea X.

Sehlooho se arohaneng ke puisano le lits'ebeletso tse ling le liketso life kapa life tse qalisoang ke tlhokomeliso (ha feela tlhahlobo ea hau e sebetsa hantle ka ho lekana).
Mohlala oa tlhaloso ea sebatli, moo slack_handler.py e leng mongolo oa rona o ngotseng:

topic: slack_graph
id: slack_graph.alert
match: level() != INFO AND changed() == TRUE
kind: exec
options:
  prog: /sbin/slack_handler.py
  args: ["-c", "CHANNELID", "--graph", "--search"]

Mokhoa oa ho lokisa?

Khetho e nang le tlhahiso ea log

|log()
      .level("error")
      .prefix("something")

Sheba (cli): kapacitor -url moamoheli-kapa-ip: 9092 logs lvl=phoso

Khetho ka httpOut

E bonts'a lintlha tse hlahang hajoale:

|httpOut('something')

Sheba (fumana): moamoheli-kapa-ip:9092/kapacitor/v1/tasks/task_name/something

Leano la ho phethahatsa

  • Mosebetsi o mong le o mong o khutlisa sefate sa ho bolaoa se nang le linomoro tsa bohlokoa ka sebopeho lenapal.
  • Nka boloko letheba.
  • E manehe ho seshebelli, thabela.

U ka fumana rake kae hape?

timestamp influxdb on writeback

Mohlala, re theha tlhokomeliso bakeng sa kakaretso ea likopo ka hora (groupBy(1h)) mme re batla ho hatisa tlhokomeliso e etsahetseng ho influxdb (ho bonts'a hantle bothata ba graph ho grafana).

influxDBOut() e tla ngola boleng ba nako ho tloha tlhokomelisong ho isa setempeng sa nako; ka hona, ntlha e chate e tla ngoloa pejana/morao ho feta tlhokomeliso e fihlileng.

Ha ho hlokeha ho nepahala: re rarolla bothata bona ka ho letsetsa motho ea sebetsang, ea tla ngola lintlha ho influxdb ka setempe sa nako sa hajoale.

docker, ho aha le ho tsamaisa

Ha e qala, kapacitor e ka kenya mesebetsi, litempele le li-handers ho tsoa bukeng e boletsoeng ho config ho [load] block.

Ho etsa mosebetsi hantle, o hloka lintho tse latelang:

  1. Lebitso la faele - le atolosoa ho script id/name
  2. Mofuta – stream/batch
  3. dbrp - lentsoe la sehlooho ho bonts'a hore na sengoloa se kena ho database efe + leano (dbrp "mofani.""autogen")

Haeba mosebetsi o mong oa batch o se na mola o nang le dbrp, tšebeletso eohle e tla hana ho qala 'me e tla ngola ka botšepehi ka eona ho log.

Ho chronograf, ho fapana le hoo, mohala ona ha oa lokela ho ba teng; ha o amoheloe ka sehokelo mme o hlahisa phoso.

Hack ha u haha ​​​​setshelo: Dockerfile e tsoa ka -1 haeba ho na le mela e nang le // +dbrp, e tla u lumella ho utloisisa hang-hang lebaka la ho hlōleha ha u kopanya mohaho.

kopanya e le 'ngoe ho tse ngata

Mohlala oa mosebetsi: o hloka ho nka karolo ea 95 lekholong ea nako ea ts'ebetso ea ts'ebeletso bakeng sa beke, bapisa motsotso o mong le o mong oa 10 ea ho qetela le boleng bona.

Ha o khone ho kopanya motho a le mong ho isa ho ba bangata, ho qetela/ho bolela/bohareng ho feta sehlopha sa lintlha ho fetola node hore e be molatsoana, phoso "e ke ke ea eketsa lipheletso tse sa tsamaisaneng tsa bana: batch -> stream" e tla khutlisoa.

Sephetho sa sehlopha, joalo ka phetoho polelong ea lambda, le sona ha se nkeloe sebaka.

Ho na le khetho ea ho boloka linomoro tse hlokahalang ho tloha sehlopheng sa pele ho ea faeleng ka udf le ho kenya faele ena ka lehlakoreng le leng.

Re ile ra rarolla eng ka see?

Re na le barekisi ba lihotele ba ka bang 100, e mong le e mong oa bona a ka ba le likhokahano tse 'maloa, ha re e bitse mocha. Ho na le likanale tse ka bang 300, e 'ngoe le e 'ngoe ea likanale e ka oa. Har'a metrics eohle e rekotiloeng, re tla beha leihlo sekhahla sa liphoso (likopo le liphoso).

Ke hobane'ng ha grafana?

Litlhokomeliso tsa liphoso tse hlophisitsoeng Grafana li na le mathata a 'maloa. Tse ling li bohlokoa, tse ling u ka koala mahlo ho tsona, ho latela maemo.

Grafana ha e tsebe ho bala lipakeng tsa litekanyo + ho lemosa, empa re hloka sekhahla (likopo-liphoso)/requests.

Liphoso li shebahala li le mpe:

Maqheka a ho sebetsa metrics ho Kapacitor

Le bobe bo fokolang ha bo talingoa ka likopo tse atlehileng:

Maqheka a ho sebetsa metrics ho Kapacitor

Ho lokile, re ka bala esale pele sekhahla sa ts'ebeletso pele ho grafana, 'me maemong a mang sena se tla sebetsa. Empa eseng ho tsa rona, hobane ... bakeng sa mocha o mong le o mong karo-karolelano ea eona e nkoa e le "tloaelehileng", 'me litlhokomeliso li sebetsa ho latela litekanyetso tse tsitsitseng (re li batla ka mahlo, re li fetole haeba ho na le litlhokomeliso khafetsa).

Ena ke mehlala ea "tloaelehileng" bakeng sa likanale tse fapaneng:

Maqheka a ho sebetsa metrics ho Kapacitor

Maqheka a ho sebetsa metrics ho Kapacitor

Re hlokomoloha ntlha e fetileng mme re nka hore setšoantšo se "tloaelehileng" se tšoana le bafani bohle. Joale ntho e 'ngoe le e' ngoe e hantle, 'me re ka khona ho feta ka litemoso ka grafana?
Re ka khona, empa ha re batle, hobane re tlameha ho khetha e 'ngoe ea likhetho:
a) etsa li-graph tse ngata bakeng sa mocha ka mong ka thoko ('me u tsamaee le tsona ka bohloko)
b) siea chate e le 'ngoe e nang le liteishene tsohle ('me u lahlehe meleng e mebala-bala le litlhokomeliso tse ikhethileng)

Maqheka a ho sebetsa metrics ho Kapacitor

U e entse joang?

Hape, ho na le mohlala o motle oa ho qala litokomaneng (Ho bala litefiso ho pholletsa le letoto le kopaneng), e ka shejoa kapa ea nkoa e le motheo oa mathata a tšoanang.

Seo re se entseng qetellong:

  • kopanya lihlopha tse peli ka lihora tse 'maloa, li arola ka likanale;
  • tlatsa letoto ka sehlopha haeba ho ne ho se na data;
  • bapisa bohareng ba metsotso e 10 e fetileng le data e fetileng;
  • re hoeletsa ha re fumana ho hong;
  • re ngola litefiso tse baloang le litemoso tse etsahetseng ho influxdb;
  • romella molaetsa oa bohlokoa ho khoehlisa.

Ka maikutlo a ka, re khonne ho fihlela ntho e 'ngoe le e' ngoe eo re neng re batla ho e fumana qetellong (esita le ho feta ka batšoasi ba tloaelo) ka bokhabane kamoo ho ka khonehang.

U ka sheba github.com mohlala oa khoutu и potoloho e nyane (graphviz) mongolo o hlahang.

Mohlala oa sephetho sa khoutu:

dbrp "supplier"."autogen"
var name = 'requests.rate'
var grafana_dash = 'pczpmYZWU/mydashboard'
var grafana_panel = '26'
var period = 8h
var todayPeriod = 10m
var every = 1m
var warnAlert = 15
var warnReset = 5
var reqQuery = 'SELECT sum("count") AS value FROM "supplier"."autogen"."requests"'
var errQuery = 'SELECT sum("count") AS value FROM "supplier"."autogen"."errors"'

var prevErr = batch
    |query(errQuery)
        .period(period)
        .every(every)
        .groupBy(1m, 'channel', 'supplier')

var prevReq = batch
    |query(reqQuery)
        .period(period)
        .every(every)
        .groupBy(1m, 'channel', 'supplier')

var rates = prevReq
    |join(prevErr)
        .as('req', 'err')
        .tolerance(1m)
        .fill('null')
    // заполняем значения нулями, если их не было
    |default()
        .field('err.value', 0.0)
        .field('req.value', 0.0)
    // if в lambda: считаем рейт, только если ошибки были
    |eval(lambda: if("err.value" > 0, 100.0 * (float("req.value") - float("err.value")) / float("req.value"), 100.0))
        .as('rate')

// записываем посчитанные значения в инфлюкс
rates
    |influxDBOut()
        .quiet()
        .create()
        .database('kapacitor')
        .retentionPolicy('autogen')
        .measurement('rates')

// выбираем данные за последние 10 минут, считаем медиану
var todayRate = rates
    |where(lambda: duration((unixNano(now()) - unixNano("time")) / 1000, 1u) < todayPeriod)
    |median('rate')
        .as('median')

var prevRate = rates
    |median('rate')
        .as('median')

var joined = todayRate
    |join(prevRate)
        .as('today', 'prev')
    |httpOut('join')

var trigger = joined
    |alert()
        .warn(lambda: ("prev.median" - "today.median") > warnAlert)
        .warnReset(lambda: ("prev.median" - "today.median") < warnReset)
        .flapping(0.25, 0.5)
        .stateChangesOnly()
        // собираем в message ссылку на график дашборда графаны
        .message(
            '{{ .Level }}: {{ index .Tags "channel" }} err/req ratio ({{ index .Tags "supplier" }})
{{ if eq .Level "OK" }}It is ok now{{ else }}
'+string(todayPeriod)+' median is {{ index .Fields "today.median" | printf "%0.2f" }}%, by previous '+string(period)+' is {{ index .Fields "prev.median" | printf "%0.2f" }}%{{ end }}
http://grafana.ostrovok.in/d/'+string(grafana_dash)+
'?var-supplier={{ index .Tags "supplier" }}&var-channel={{ index .Tags "channel" }}&panelId='+string(grafana_panel)+'&fullscreen&tz=UTC%2B03%3A00'
        )
        .id('{{ index .Tags "name" }}/{{ index .Tags "channel" }}')
        .levelTag('level')
        .messageField('message')
        .durationField('duration')
        .topic('slack_graph')

// "today.median" дублируем как "value", также пишем в инфлюкс остальные филды алерта (keep)
trigger
    |eval(lambda: "today.median")
        .as('value')
        .keep()
    |influxDBOut()
        .quiet()
        .create()
        .database('kapacitor')
        .retentionPolicy('autogen')
        .measurement('alerts')
        .tag('alertName', name)

Qeto ke efe?

Kapacitor o motle ha a etsa litemoso tsa ho shebella ka lihlopha tse ngata, a etsa lipalo tse eketsehileng ho latela metrics e seng e tlalehiloe, ho etsa liketso tse tloaelehileng le ho tsamaisa mangolo (udf).

Tšitiso ea ho kena ha e phahame haholo - e leke haeba grafana kapa lisebelisoa tse ling li sa khotsofatse litakatso tsa hau ka botlalo.

Source: www.habr.com

Eketsa ka tlhaloso