Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Inta badan, maanta qofna ma waydiiyo sababta ay lagama maarmaanka u tahay in la ururiyo cabbirrada adeegga. Tallaabada xigta ee macquulka ah waa in la dejiyo digniinta cabbirrada la soo ururiyey, taas oo ogeysiin doonta wixii ku saabsan leexashada xogta kanaalada kugu habboon (mail, Slack, Telegram). Adeegga ballansashada huteelka ee onlaynka ah Ostrovok.ru Dhammaan cabirrada adeegyadeena waxaa lagu shubaa InfluxDB waxaana lagu muujiyaa Grafana, iyo digniinta aasaasiga ah ayaa sidoo kale lagu habeeyey halkaas. Hawlaha sida "waxaad u baahan tahay inaad xisaabiso wax oo aad barbar dhigto," waxaan isticmaalnaa Kapacitor.

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor
Kapacitor waa qayb ka mid ah xirmada TICK ee ka shaqayn kara cabbirada InfluxDB. Waxay isku xiri kartaa dhowr cabbir (ku biir), xisaabi wax faa'iido leh xogta la helay, natiijada dib ugu qor InfluxDB, u dir digniin Slack/Telegram/mail.

Xidhmada oo dhan waa qabow oo faahfaahsan dukumeenti, laakiin had iyo jeer waxaa jiri doona waxyaabo faa'iido leh oo aan si cad loogu sheegin buug-gacmeedyada. Maqaalkan, waxaan go'aansaday inaan ururiyo tiro ka mid ah talooyinka waxtarka leh, ee aan caddaynta (qoraalka aasaasiga ah ee TICKscipt ayaa lagu sifeeyay halkan) oo tus sida loogu dhaqmi karo iyadoo la adeegsanayo tusaale xallinta mid ka mid ah mashaakilkeenna.

Aan tagno!

sabayn & int, khaladaadka xisaabinta

Dhibaato caadi ah, oo lagu xalliyo jibooyin:

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

Isticmaalka default()

Haddii calaamad/goob aan la buuxin, khaladaad xisaabeed ayaa dhici doona:

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

buuxi ku biirista (gudaha vs dibadda)

Sida caadiga ah, ku biirku waxa uu tuurayaa dhibco meesha aanay wax xog ah ka jirin (gudaha).
Marka la buuxiyo ('null'), ku biiritaanka dibadda ayaa la samayn doonaa, ka dib markaa waxaad u baahan tahay inaad sameyso default() oo aad buuxiso qiimayaasha madhan:

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

Weli waxaa jira nuance halkan. Tusaalaha kore, haddii mid ka mid ah taxanaha (res1 ama res2) uu madhan yahay, taxanaha ka soo baxay (xogta) sidoo kale way madhnaan doonaan. Waxa jira dhawr tigidh oo mawduucan ku saabsan Github (1633, 1871, 6967) – Waxaan sugeynaa hagaajin iyo dhib yar.

Isticmaalka shuruudaha xisaabinta (haddii lambda)

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

Shanta daqiiqo ee ugu dambeeya dhuumaha muddada

Tusaale ahaan, waxaad u baahan tahay inaad is barbar dhigto qiyamka shantii daqiiqo ee ugu dambeysay iyo usbuucii hore. Waxaad u qaadan kartaa laba qaybood oo xog ah laba qaybood oo kala duwan ama waxaad ka soo saari kartaa qayb ka mid ah xogta muddo dheer:

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

Beddelka shanta daqiiqo ee ugu dambeeya waxay noqon doontaa in la isticmaalo BarrierNode, kaas oo jaraya xogta ka hor wakhtiga la cayimay:

|barrier()
        .period(5m)

Tusaalooyinka isticmaalka qaabka Go ee fariinta

Qaababku waxay u dhigmaan qaabka xirmada qoraalka.habkaHoos waxaa ah qaar ka mid ah xujooyinka inta badan lala kulmo.

haddii-kale

Arrimuhu waanu nidaaminay oo ma kicin dadka qoraalka mar kale:

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

Laba nambar ka dib barta tobanlaha ee fariinta

Hagaajinta akhrinta fariinta:

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

Kordhinta doorsoomayaasha fariinta

Waxaan ku soo bandhignaa macluumaad dheeraad ah fariinta si aan uga jawaabno su'aasha "Waa maxay sababta ay u qaylinayso"?

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

Aqoonsiga digniinta gaarka ah

Tani waa shay lagama maarmaan ah marka ay jiraan wax ka badan hal koox oo xogta ah, haddii kale hal digniin ayaa la soo saari doonaa:

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

Maamulaha gaarka ah

Liistada weyn ee maamulayaasha waxaa ka mid ah exec, kaas oo kuu oggolaanaya inaad ku fuliso qoraalkaaga cabirrada la soo dhaafay (stdin) - hal-abuur iyo wax kale ma jiraan!

Mid ka mid ah caadooyinkayaga ayaa ah qoraal yar oo Python ah oo loogu diro ogeysiisyada caajisnimo.
Markii hore, waxaan rabnay inaan fariinta ku dirno sawirka grafana ee oggolaansho-ilaaliye. Dabadeed, ku qor OK dunta digniintii hore ee isla kooxda, hana ahaan fariin gooni ah. Wax yar ka dib - ku dar fariinta qaladka ugu badan ee daqiiqadaha X ee ugu dambeeyay.

Mawduuc gaar ah ayaa ah la xidhiidhka adeegyada kale iyo ficil kasta oo uu bilaabay digniin (kaliya haddii la socodkaagu si fiican u shaqeeyo).
Tusaalaha sharraxaadda maamulaha, halka slack_handler.py uu yahay qoraalkeenna is-qoritaanka:

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"]

Sida loo saxo?

Ikhtiyaarka leh wax soo saarka log

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

Daawo (cli): kapacitor -url host-ama-ip:9092 logs lvl= khalad

Ikhtiyaarka leh httpOut

Waxay ku tusaysaa xogta dhuumaha hadda:

|httpOut('something')

Daawo (hel): host-ama-ip:9092/kapacitor/v1/tasks/task_name/thing

Nidaamka fulinta

  • Hawl kastaa waxay soo celisaa geedka fulinta oo leh tirooyin faa'iido leh oo qaabka ah garaafis.
  • Qaado block dhibic.
  • Ku dheji daawadayaasha ku raaxayso.

Xagee kale oo aad ka heli kartaa rake?

timestamp in influxdb on backback

Tusaale ahaan, waxaanu dejinay digniin wadarta codsiyada saacaddii (groupBy(1h)) waxaanan rabnaa inaan duubno digniinta ka dhacday influxdb (si aan si qurux badan u muujino xaqiiqda dhibaatada garaafka grafana).

influxDBOut() waxay qori doontaa qiimaha wakhtiga digniinta ilaa shaambadaha wakhtiga; sidaas awgeed, barta shaxanka waxa la qori doonaa ka hor/ka dib marka digniintu timaado.

Marka saxnaanta loo baahan yahay: waxaanu ka shaqaynaa sidii aanu dhibkan uga shaqaynayna anagoo wacnayna maamule caado ah, kaas oo u qori doona xog si uu ugu soo qulqulo shaambada wakhtiga hadda jirta.

docker, dhis oo geyn

Bilawga, kapacitor waxa uu ku shuban karaa hawlaha, habyaalada iyo maamulayaasha hagaha ku qeexan qaabaynta [load] block.

Si aad si sax ah u abuurto hawl, waxaad u baahan tahay waxyaabaha soo socda:

  1. Magaca faylka - waxaa lagu balaariyay aqoonsiga/magaca qoraalka
  2. Nooca - durdurrada / dufcada
  3. dbrp – kelmad muhiim ah oo lagu muujinayo xogta xogta + siyaasada qoraalku ku socdo (dbrp β€œsadde.”

Haddii hawsha dufcadda qaarkood aysan ku jirin xariiq leh dbrp, adeegga oo dhan ayaa diidi doona inuu bilaabo oo si daacad ah ayuu wax uga qori doonaa log.

Chronograf, liddi ku ah, khadkani waa inuusan jirin; laguma aqbalo interface-ka wuxuuna abuuraa qalad.

Hack marka la dhisayo weel: Dockerfile wuxuu la baxaa -1 haddii ay jiraan xariiqyo leh //.+dbrp, taas oo kuu ogolaan doonta inaad isla markiiba fahamto sababta fashilka marka la ururinayo dhismaha.

ku biir mid badan

Hawsha tusaale: waxaad u baahan tahay inaad qaadato boqolkiiba 95 ee wakhtiga shaqada ee adeega muddo todobaad ah, barbar dhig daqiiqad kasta oo ka mid ah 10 ka ugu dambeeya qiimahan.

Ma samayn kartid ku biirista hal-ilaa-badan, u dambeeya/macnaha/dhexdhexaadinta koox-dhibcood ah waxay u rogaan noodhka durdur, khaladka "kuma dari karo cidhifyada ilmahu is-qaban: dufcaddii -> qulqulka" waa la soo celin doonaa.

Natiijada dufcadda, sida doorsoome ee tibaaxaha lambda, sidoo kale lama beddelo.

Waxaa jira ikhtiyaar lagu badbaadinayo tirooyinka lagama maarmaanka ah ee laga bilaabo dufcaddii ugu horreysay oo loo diro fayl iyada oo loo sii marayo udf oo lagu shubo faylkan iyada oo la adeegsanayo sideload.

Maxaan ku xalinay tan?

Waxaan leenahay ilaa 100 alaab-qeybiyeyaal hoteel ah, mid kasta oo iyaga ka mid ah wuxuu yeelan karaa dhowr xiriir, aan ugu yeerno kanaalka. Waxaa jira ku dhawaad ​​300 oo kanaaladan ah, mid kasta oo ka mid ah kanaalada ayaa dhici kara. Dhammaan cabbirada la duubay, waxaanu la socon doonaa heerka khaladka (codsiyada iyo khaladaadka).

Waa maxay sababta grafana?

Ogeysiisyada khaladka ah ee lagu habeeyay Grafana waxay leeyihiin faa'iidooyin badan. Qaar baa halis ah, qaarna waxaad isku qaban kartaa indhahaaga, iyadoo ku xiran xaaladda.

Grafana ma garanayo sida loo xisaabiyo inta u dhaxaysa cabbirada + feejignaanta, laakiin waxaan u baahanahay qiime (codsi-qaladaad)/codsiyada.

Khaladaadka ayaa u muuqda kuwo xun:

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Oo shar yar marka lagu eego codsiyada lagu guulaystay:

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Hagaag, waxaan horay u xisaabin karnaa qiimaha adeega kahor grafana, xaaladaha qaarkoodna tani way shaqayn doontaa. Laakin anaga maaha, sababtoo ah... kanaal kasta saamiga u gaar ah waxaa loo arkaa "caadi", iyo digniinuhu waxay u shaqeeyaan si waafaqsan qiyamka taagan (waxaan ku raadinaynaa indhahayaga, beddelo haddii ay jiraan digniino soo noqnoqda).

Kuwani waa tusaalayaal "caadi" ee kanaalada kala duwan:

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Waxaan iska indha tirnaa qodobkii hore waxaanan u qaadaneynaa in sawirka "caadiga ah" uu la mid yahay dhammaan alaab-qeybiyeyaasha. Hadda wax walba waa hagaagsan yihiin, waxaana ku heli karnaa ogeysiisyada grafana?
Waan awoodnaa, laakiin dhab ahaantii ma rabno, sababtoo ah waa inaan dooranaa mid ka mid ah fursadaha:
a) kanaal kasta u samee garaafyo badan si gaar ah (oo si xanuun leh ula soco)
b) Ka tag hal jaantus oo leh dhammaan kanaalada (oo ku lunto xariiqyada midabka leh iyo digniinaha la habeeyey)

Khiyaamooyinka lagu farsameeyo cabbirada Kapacitor

Sidee u samaysay?

Mar labaad, waxaa jira tusaale wanaagsan oo bilow ah dukumeentiyada (Xisaabinta qiimayaasha taxanaha ku biiray), waxaa lagu eegi karaa ama loo qaadan karaa iyada oo saldhig u ah dhibaatooyinka la midka ah.

Waxaan samaynay ugu dambeyntii:

  • ku biir laba taxane dhowr saacadood gudahood, adoo kooxaynaya kanaalada;
  • koox koox u buuxi taxanaha haddii aanay jirin xog;
  • is barbar dhig dhex dhexaadkii 10kii daqiiqo ee ugu dambeeyay xogtii hore;
  • waanu qaylinaa haddaynu wax helno;
  • waxaan qoreynaa heerarka la xisaabiyay iyo digniinaha ka dhacay influxdb;
  • fariin waxtar leh u dir caajis.

Fikradayda, waxaan ku guuleysanay inaan gaarno wax kasta oo aan rabno inaan helno dhamaadka (iyo xitaa wax yar oo dheeraad ah oo leh maamulayaasha gaarka ah) sida ugu quruxda badan ee suurtogalka ah.

Waxaad ka eegi kartaa github.com tusaale code ΠΈ wareegga ugu yar (graphviz) qoraalka ka soo baxay.

Tusaalaha koodka soo baxay:

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)

Waa maxay gunaanad?

Kapacitor wuxuu ku fiican yahay fulinta ogeysiisyada la socodka koox kooxeedyo badan, samaynta xisaabin dheeraad ah oo ku salaysan qiyaasaha hore loo duubay, fulinta ficilada gaarka ah iyo socodsiinta qoraallada (udf).

Caqabadda gelitaanka maaha mid aad u sareysa - isku day haddii grafana ama qalabyada kale aysan si buuxda u qancin rabitaankaaga.

Source: www.habr.com

Add a comment