Nga tinihanga mo te tukatuka inenga i Kapacitor

Ko te mea pea, i tenei ra kaore tetahi e patai he aha te mea e tika ana ki te kohi inenga ratonga. Ko te mahi arorau e whai ake nei ko te whakarite matohi mo nga inenga kua kohia, ka whakamohio atu mo nga rereketanga o nga raraunga i roto i nga hongere e waatea ana mo koe (mēra, Slack, Telegram). I roto i te ratonga pukapuka hotera ipurangi Ostrovok.ru Ko nga inenga katoa o a maatau ratonga ka ringihia ki roto i te InfluxDB ka whakaatuhia ki roto i te Grafana, ka whirihorahia ano te matohi taketake ki reira. Mo nga mahi penei "me tatau koe i tetahi mea me te whakataurite ki taua mea," ka whakamahia e matou te Kapacitor.

Nga tinihanga mo te tukatuka inenga i Kapacitor
Ko te Kapacitor tetahi waahanga o te puranga TICK ka taea te mahi inenga mai i InfluxDB. Ka taea e ia te hono tahi i etahi inenga (hono), tatauhia tetahi mea whai hua mai i nga raraunga kua riro, tuhia te hua ki InfluxDB, tukuna he matohi ki a Slack/Waea/mēra.

He hauhautanga me te kiko o te puranga katoa tuhinga, engari ka mau tonu nga mea whai hua kaore i te tino tohuhia i roto i nga pukapuka. I roto i tenei tuhinga, i whakatau ahau ki te kohi i te maha o nga tohutohu whaihua, kore-marama (kua whakaahuatia te wetereo taketake o TICKscipt konei) me te whakaatu me pehea te whakamahi ma te whakamahi i tetahi tauira o te whakaoti i tetahi o o tatou rapanga.

Haere tatou!

mānu & int, hapa tātai

He raruraru tino paerewa, ka whakatauhia ma nga castes:

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

Whakamahi taunoa()

Ki te kore e whakakiia tetahi tohu/apure, ka puta nga hapa o te tatauranga:

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

whakakiia te hono (roto me waho)

Ma te taunoa, ka whakakorehia e te hono nga tohu kaore he raraunga (roto).
Ki te whakakī('null'), ka mahia he hononga o waho, ka mutu me mahi he taunoa() ka whakakiia nga uara putua:

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

He ahua ano kei konei. I roto i te tauira i runga ake nei, mena kei te putua tetahi o nga raupapa (res1, res2) ka puta ano nga raupapa (raraunga). He maha nga tikiti mo tenei kaupapa i runga i Github (1633, 1871, 6967) - kei te tatari matou mo nga whakatika me te mamae iti.

Te whakamahi tikanga i roto i nga tatauranga (mehemea kei te lambda)

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

E rima meneti mai i te paipa mo te wa

Hei tauira, me whakarite e koe nga uara o nga meneti e rima kua hipa me te wiki o mua. Ka taea e koe te tango i nga puranga raraunga e rua i roto i nga roopu motuhake e rua, te tango ranei i tetahi waahanga o nga raraunga mai i te waa nui ake:

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

Ko tetahi atu mo nga meneti e rima whakamutunga ko te whakamahi i te BarrierNode, ka tapahia nga raraunga i mua i te waa kua tohua:

|barrier()
        .period(5m)

He tauira mo te whakamahi tauira Haere i roto i te karere

He rite nga tauira ki te whakatakotoranga mai i te kete tuhinga.tauiraKei raro nei etahi panga e kitea ana.

mena-mena

Ka whakatikahia e matou nga mea, karekau e whakararu i nga tangata ki te tuhinga:

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

E rua nga mati i muri i te ira ira i roto i te karere

Te whakapai ake i te panui o te karere:

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

Te whakawhānui i nga taurangi i roto i te karere

Ka whakaatuhia e matou etahi atu korero i roto i te karere hei whakautu i te patai "He aha te mea e tangi ana"?

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

Kaitohu matohi ahurei

He mea tika tenei ina neke atu i te kotahi roopu kei roto i nga raraunga, ki te kore ka puta he matohi kotahi:

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

Ritenga kaihautu's

Kei roto i te rarangi nui o nga kaihautu he exec, ka taea e koe te mahi i to tuhinga me nga tawhā kua paahitia (stdin) - te mahi auaha me te kore ke atu!

Ko tetahi o a maatau tikanga he tuhinga Python iti mo te tuku panui kia mangere.
I te tuatahi, i pirangi matou ki te tuku pikitia grafana kua parea-whakamana ki roto i te karere. Muri iho, tuhia te OK ki te miro ki te matohi o mua mai i te roopu kotahi, kaua hei karere motuhake. He iti nei i muri mai - taapirihia ki te karere te hapa nui i roto i nga meneti X whakamutunga.

Ko te kaupapa motuhake ko te whakawhitiwhiti korero me etahi atu ratonga me nga mahi i timatahia e te matohi (mehemea ka pai to mahi tirotiro).
He tauira o te whakamaarama kaihautu, kei hea te slack_handler.py ko ta maatau tuhinga tuhi whaiaro:

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

Me pehea te patuiro?

Kōwhiringa me te putanga rangitaki

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

Matakitaki (cli): kapacitor -url ope-or-ip:9092 rangitaki lvl=hapa

Kōwhiringa me httpOut

Ka whakaatu raraunga i roto i te paipa onāianei:

|httpOut('something')

Matakitaki (tiki): ope-or-ip:9092/kapacitor/v1/tasks/task_name/something

Kaupapa mahi

  • Ka whakahokia e ia mahi he rakau whakamate me nga nama whai hua ki te whakatakotoranga graphviz.
  • Tangohia he poraka ira.
  • Whakapiri ki te kaititiro, pārekareka.

Kei hea atu ka taea e koe te tiki rake?

tohuwā i roto i te influxdb i te tuhi hoki

Hei tauira, ka whakarite matou i te matohi mo te maha o nga tono mo ia haora (groupBy(1h)) me te hiahia ki te tuhi i te matohi i puta i roto i te influxdb (hei whakaatu ataahua i te meka o te raru i runga i te kauwhata i te grafana).

influxDBOut() ka tuhi i te uara wa mai i te matohi ki te tohu wa; no reira, ka tuhia te tohu i runga i te tūtohi i mua ake/i muri mai i te taenga mai o te matohi.

Ina hiahiatia te tika: ka mahi maatau i tenei raru ma te waea atu ki tetahi kaihautu ritenga, ka tuhia nga raraunga ki te influxdb me te tohu waahi o naianei.

docker, hanga me te tuku

I te tiimatanga, ka taea e te kapacitor te uta i nga mahi, tauira me nga kaikawe mai i te raarangi kua tohua ki te whirihora i te poraka [uta].

Hei hanga tika i tetahi mahi, me hiahia koe ki enei mea:

  1. Ingoa kōnae – kua whakawhänuihia ki te id/ingoa tuhinga
  2. Momo - roma / puranga
  3. dbrp – kupu matua hei tohu ko wai te papaaarangi + kaupapa here kei roto te tuhinga (dbrp “kaiwhakarato.” “autogen”)

Mena karekau he raina me te dbrp i roto i etahi mahi puranga, ka kore te ratonga katoa e pai ki te tiimata ka tuhi pono ki te raarangi.

I roto i te chronograf, engari, kaore tenei raina e noho; kaore e whakaaetia ma te atanga ka puta he hapa.

Taumata i te wa e hanga ana he ipu: Ka puta te Dockerfile me te -1 mena he raina me //.+dbrp, ka taea e koe te mohio tonu ki te take o te koretake i te wa e huihui ana te hanga.

hono tetahi ki te maha

He tauira mahi: me tango e koe te 95 ōrau o te wā mahi o te ratonga mo te wiki, whakaritea ia meneti o te 10 whakamutunga me tenei uara.

Kaore e taea e koe te whakauru kotahi-ki-maha, whakamutunga/mean/tauwaenga i runga i te roopu o nga tohu ka huri te node ki te awa, ko te hapa "kaore e taea te taapiri i nga taha o te tamaiti: puranga -> awa" ka whakahokia.

Ko te hua o te puranga, hei taurangi i roto i te whakaaturanga lambda, kaore ano kia whakakapihia.

He whiringa ki te penapena i nga tau e tika ana mai i te puranga tuatahi ki tetahi konae ma te udf ka utaina tenei konae ma te taha taha.

He aha ta matou i whakaoti me tenei?

Tata ki te 100 nga kaiwhakarato hotera, he maha nga hononga o ia tangata, me kii he hongere. Tata ki te 300 o enei hongere, ka taka ia o nga hongere. Mai i nga inenga kua tuhia, ka aroturukihia e matou te reiti hapa (tono me nga hapa).

He aha e kore ai e grafana?

Ko nga matohi hapa i whirihorahia i Grafana he maha nga ngoikoretanga. Ko etahi he tino nui, ko etahi ka taea e koe te kati i ou kanohi, i runga i te ahuatanga.

Karekau a Grafana e mohio ki te tatau i waenga i nga inenga + matohi, engari me reeti (tono-hapa)/tono.

He ahua kino nga hapa:

Nga tinihanga mo te tukatuka inenga i Kapacitor

Ka iti ake te kino ka tirohia me nga tono angitu:

Nga tinihanga mo te tukatuka inenga i Kapacitor

Kaati, ka taea e taatau te tatau i mua i te reeti i roto i te ratonga i mua i te grafana, a i etahi wa ka pai tenei. Engari kaore i roto i a maatau, na te mea ... mo ia hongere ko tana ake ōwehenga ka kiia he "noa", ka mahi nga matohi i runga i nga uara tuuturu (ka rapua e o tatou kanohi, ka huri mena he matohi tonu).

He tauira enei o te "noa" mo nga hongere rereke:

Nga tinihanga mo te tukatuka inenga i Kapacitor

Nga tinihanga mo te tukatuka inenga i Kapacitor

Ka warewarehia e matou te waahi o mua me te whakaaro he rite te pikitia "noa" mo nga kaiwhakarato katoa. Inaianei kei te pai nga mea katoa, a ka taea e taatau ma te matohi i te grafana?
Ka taea e matou, engari kaore matou e hiahia, na te mea me whiriwhiri tetahi o nga whiringa:
a) kia maha nga kauwhata mo ia hongere motuhake (me te haere tahi me te mamae)
b) waiho tetahi tūtohi me nga hongere katoa (ka ngaro ki nga raina karakara me nga matohi kua whakaritea)

Nga tinihanga mo te tukatuka inenga i Kapacitor

I pehea koe i mahi ai?

Ano, he tauira timatanga pai kei roto i nga tuhinga (Te tātai reiti puta noa i te raupapa hono), ka taea te tiro, te tango ranei hei turanga mo nga raruraru rite.

He aha ta matou i mahi i te mutunga:

  • uru atu ki nga raupapa e rua i roto i etahi haora, whakarōpūhia ma nga hongere;
  • whakakiia te raupapa ma te roopu mena karekau he raraunga;
  • whakatairitehia te tau waenga o nga meneti 10 whakamutunga me nga raraunga o mua;
  • ka hamama tatou ki te kitea e tatou tetahi mea;
  • ka tuhia e matou nga reeti tatau me nga matohi i puta i roto i te influxdb;
  • tukuna he karere whai hua ki te mangere.

Ki taku whakaaro, i taea e matou te whakatutuki i nga mea katoa e hiahia ana matou ki te whiwhi i te mutunga (me etahi atu iti ake me nga kaikawe ritenga) me te tino ataahua.

Ka taea e koe te titiro ki github.com tauira waehere и iahiko iti (graphviz) te tuhinga ka puta.

He tauira o te waehere ka puta:

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)

He aha te whakatau?

He pai a Kapacitor ki te mahi i nga mahi tirotiro-matohi me te maha o nga whakarōpūtanga, te mahi i nga tatauranga taapiri i runga i nga ine kua oti te rekoata, te mahi ritenga me te whakahaere i nga tuhinga (udf).

Ko te arai ki te urunga kaore i te tino teitei - whakamatauria mena karekau te grafana me etahi atu taputapu e tino makona i o hiahia.

Source: will.com

Tāpiri i te kōrero