Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Azo inoana fa amin'izao fotoana izao dia tsy misy manontany hoe nahoana no ilaina ny manangona metrika serivisy. Ny dingana lojika manaraka dia ny fametrahana fampandrenesana ho an'ireo metrika voaangona, izay hampandrenesina momba ny fiviliana amin'ny angon-drakitra amin'ny fantsona mety aminao (mailaka, Slack, Telegram). Ao amin'ny serivisy famandrihana hotely an-tserasera Ostrovok.ru arotsaka ao amin'ny InfluxDB ny metrika rehetra amin'ny serivisinay ary aseho amin'ny Grafana, ary misy koa ny fanairana fototra ao. Ho an'ny asa toy ny "mila manao kajy zavatra ianao ary mampitaha azy", dia mampiasa Kapacitor izahay.

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor
Kapacitor dia ampahany amin'ny stack TICK izay afaka manodina metrika avy amin'ny InfluxDB. Afaka mampifandray fandrefesana maromaro miaraka (mikambana), manao kajy zavatra mahasoa avy amin'ny angon-drakitra voaray, manoratra ny valiny amin'ny InfluxDB, mandefa fanairana amin'ny Slack/Telegram/mail.

Mangatsiatsiaka sy feno antsipiriany ny stack manontolo tahirin-kevitra, fa hisy foana ny zavatra mahasoa izay tsy voalaza mazava ao amin'ny boky torolalana. Ato amin'ity lahatsoratra ity dia nanapa-kevitra ny hanangona toro-hevitra mahasoa sy tsy mazava toy izany aho (famaritana ny fehezanteny fototra amin'ny TICKscipt eto) ary asehoy ny fomba azo ampiharina amin’ny fampiasana ohatra iray amin’ny famahana ny iray amin’ireo zava-manahirana antsika.

Andao handeha!

float & int, fahadisoana kajy

Olana manara-penitra tanteraka, voavaha amin'ny alalan'ny castes:

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

Mampiasa default()

Raha tsy fenoina ny tenifototra/saha iray dia hisy lesoka amin'ny kajy:

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

mameno ny fidirana (anatiny vs ivelany)

Amin'ny alàlan'ny default, ny fidirana dia hanary ireo teboka tsy misy data (anatiny).
Miaraka amin'ny fill('null'), dia hisy fidirana ivelany, aorian'izay dia mila manao default() ianao ary fenoy ny sanda foana:

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

Mbola misy nuance eto. Ao amin'ny ohatra etsy ambony, raha tsy misy ny iray amin'ireo andian-dahatsoratra (res1 na res2), dia ho foana koa ny andiany (angona) vokatra. Misy tapakila maromaro momba ity lohahevitra ity ao amin'ny Github (1633, 1871, 6967) – miandry fanamboarana sy fijaliana kely izahay.

Mampiasa fepetra amin'ny kajy (raha amin'ny lambda)

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

Dimy minitra farany avy amin'ny fantsona ho an'ny fe-potoana

Ohatra, mila mampitaha ny sandan'ny dimy minitra farany amin'ny herinandro teo aloha ianao. Azonao atao ny maka angon-drakitra roa amin'ny andiany roa misaraka na maka ampahany amin'ny angona amin'ny vanim-potoana lehibe kokoa:

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

Ny safidy hafa mandritra ny dimy minitra farany dia ny fampiasana BarrierNode, izay manapaka ny angona alohan'ny fotoana voafaritra:

|barrier()
        .period(5m)

Ohatra amin'ny fampiasana ny maodely Go amin'ny hafatra

Mifanaraka amin'ny endrika avy amin'ny fonosana ny maodely text.templateIreto ambany ireto ny piozila hita matetika.

raha tsy izany

Mandamina zavatra izahay ary tsy mandrisika olona amin'ny alalan'ny lahatsoratra indray:

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

Isa roa aorian'ny teboka decimal amin'ny hafatra

Fanatsarana ny fahafaha-mamaky ny hafatra:

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

Manitatra ny fari-pitsipika amin'ny hafatra

Mampiseho fampahalalana bebe kokoa ao amin'ny hafatra izahay mba hamaliana ny fanontaniana hoe "Nahoana no mivazavaza"?

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

Famantarana fanairana tokana

Ilaina izany rehefa misy vondrona mihoatra ny iray ao amin'ny angona, raha tsy izany dia fanairana iray ihany no hatsangana:

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

Custom handler's

Ny lisitra lehibe amin'ny mpitantana dia misy exec, izay ahafahanao manatanteraka ny scripto miaraka amin'ireo mari-pamantarana nandalo (stdin) - famoronana ary tsy misy hafa!

Ny iray amin'ireo fomba amam-panaontsika dia script Python kely handefasana fampandrenesana amin'ny tsy fahampiana.
Tamin'ny voalohany, te-handefa sary grafana voaaro amin'ny alàlan'ny hafatra izahay. Aorian'izay, soraty ny OK ao amin'ny kofehy mankany amin'ny fanairana teo aloha avy amin'ny vondrona iray ihany, fa tsy ho hafatra misaraka. Fotoana fohy taty aoriana - ampio amin'ny hafatra ny fahadisoana mahazatra indrindra ao anatin'ny minitra X farany.

Ny lohahevitra mitokana dia ny fifandraisana amin'ny serivisy hafa sy ny hetsika rehetra natomboky ny fanairana (raha tsy mandeha tsara ny fanaraha-maso anao).
Ohatra iray amin'ny famariparitana mpandrindra, izay ahitana ny slack_handler.py ny script nosoratantsika manokana:

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

Ahoana no debug?

Safidy miaraka amin'ny famoahana log

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

Jereo (cli): kapacitor -url mpampiantrano-na-ip:9092 logs lvl=error

Safidy miaraka amin'ny httpOut

Mampiseho angona ao amin'ny fantsona ankehitriny:

|httpOut('something')

Jereo (mahazo): mpampiantrano-na-ip:9092/kapacitor/v1/tasks/task_name/something

Kisary famonoana

  • Ny asa tsirairay dia mamerina hazo famonoana misy isa mahasoa amin'ny endrika grafviz.
  • Makà sakana teboka.
  • Apetaho amin'ny mpijery, ANKAFIZO.

Aiza koa no mety hahazoana rake?

timestamp amin'ny influxdb amin'ny fanoratana

Ohatra, nanangana fanairana ho an'ny fitambaran'ny fangatahana isan'ora (groupBy(1h)) izahay ary te-hirakitra ny fanairana nitranga tao amin'ny influxdb (mba hanehoana tsara ny zava-misy amin'ny grafana amin'ny grafana).

influxDBOut() dia hanoratra ny sandan'ny fotoana avy amin'ny fampandrenesana mankany amin'ny fe-potoana mifanaraka amin'izany, ny teboka eo amin'ny tabilao dia hosoratana mialoha / aoriana noho ny fahatongavan'ny fanairana.

Rehefa ilaina ny fahitsiana: miasa amin'ity olana ity izahay amin'ny fiantsoana mpandrindra mahazatra, izay hanoratra angona amin'ny influxdb miaraka amin'ny fe-potoana ankehitriny.

docker, fananganana ary fametrahana

Amin'ny fanombohana, ny kapacitor dia afaka mampiditra asa, môdely ary mpitantana avy amin'ny lahatahiry voatondro ao amin'ny config ao amin'ny sakana [load].

Mba hamoronana asa tsara dia mila ireto zavatra manaraka ireto ianao:

  1. Anaran'ny fisie – nitarina ho script id/name
  2. Karazana - stream / batch
  3. dbrp - teny fanalahidy hanondroana ny angon-drakitra + politikan'ny script (dbrp "mpamatsy." "autogen")

Raha tsy misy tsipika miaraka amin'ny dbrp ny asa andiany sasany, dia handà ny hanomboka ny serivisy manontolo ary hanoratra momba izany ao anaty log.

Amin'ny chronograf, ny mifanohitra amin'izany, ity tsipika ity dia tsy ekena amin'ny alàlan'ny interface ary miteraka fahadisoana.

Hack rehefa manangana container: Mivoaka miaraka amin'ny -1 ny Dockerfile raha misy andalana miaraka amin'ny //.+dbrp, izay ahafahanao mahazo avy hatrany ny anton'ny tsy fahombiazana rehefa manangona ny fananganana.

manambatra ny iray amin'ny maro

Asa ohatra: mila maka ny 95 isan-jato amin'ny fotoana fiasan'ny serivisy ianao mandritra ny herinandro, ampitahao ny minitra tsirairay amin'ny 10 farany amin'ity sanda ity.

Tsy afaka manao fiarahana iray amin'ny maro ianao, ny farany/midika/median amin'ny vondron'olona iray dia mamadika ny node ho renirano, ny fahadisoana "tsy afaka manampy sisiny tsy mifanandrify amin'ny ankizy: batch -> stream" dia haverina.

Tsy azo soloina ihany koa ny vokatry ny andiany iray, toy ny fari-pitenenana lambda.

Misy safidy hitahiry ny isa ilaina avy amin'ny andiany voalohany mankany amin'ny rakitra amin'ny alàlan'ny udf ary hampiditra ity rakitra ity amin'ny alàlan'ny sideload.

Inona no novahantsika tamin'izany?

Manana mpamatsy trano fandraisam-bahiny 100 eo ho eo izahay, ny tsirairay amin'izy ireo dia afaka manana fifandraisana maromaro, andao hatao hoe fantsona. Misy 300 eo ho eo amin'ireo fantsona ireo, ny tsirairay amin'ireo fantsona dia mety hianjera. Amin'ireo metrika voarakitra rehetra dia hanara-maso ny tahan'ny fahadisoana (fangatahana sy fahadisoana).

Nahoana no tsy grafana?

Ny fampandrenesana lesoka voarindra ao amin'ny Grafana dia manana fatiantoka maromaro. Ny sasany dia manakiana, ny sasany azonao akimpiana ny masonao, arakaraka ny zava-misy.

Tsy hain'i Grafana ny manao kajy eo anelanelan'ny fandrefesana + fanairana, fa mila taham-pahavitrihana (fangatahana-diso)/fangatahana.

Toa ratsy ny fahadisoana:

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Ary tsy dia ratsy loatra raha jerena amin'ny fangatahana mahomby:

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Eny ary, azontsika atao ny manao kajy mialoha ny tahan'ny serivisy alohan'ny grafana, ary amin'ny tranga sasany dia mety izany. Tsy ny antsika anefa, satria... ho an'ny fantsona tsirairay ny tahan'ny azy dia heverina ho "ara-dalàna", ary ny fanairana dia miasa araka ny soatoavina static (mitady azy ireo amin'ny masontsika isika, manova azy ireo raha misy fanairana matetika).

Ireto misy ohatra amin'ny "ara-dalàna" ho an'ny fantsona samihafa:

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Tsy miraharaha ny teboka teo aloha izahay ary mihevitra fa ny sary "ara-dalàna" dia mitovy amin'ny mpamatsy rehetra. Ankehitriny dia milamina ny zava-drehetra, ary afaka mahazo fanairana amin'ny grafana isika?
Afaka, saingy tsy te hanao izany isika, satria tsy maintsy misafidy ny iray amin'ireo safidy:
a) manaova sary maromaro ho an'ny fantsona tsirairay misaraka (ary ampiarahany amin'izy ireo)
b) avelao ny tabilao iray miaraka amin'ny fantsona rehetra (ary very amin'ny tsipika miloko sy fanairana namboarina)

Tricks amin'ny fanodinana metrika ao amin'ny Kapacitor

Ahoana no nataonao?

Averina indray, misy ohatra fanombohana tsara ao amin'ny antontan-taratasy (Fikajiana ny sarany amin'ny andiam-pikambanana), azo tsidihina na raisina ho fototry ny olana mitovy.

Ny nataonay tamin'ny farany:

  • manatevin-daharana andiany roa ao anatin'ny ora vitsivitsy, mivondrona araka ny fantsona;
  • fenoy ny andiany isaky ny vondrona raha tsy misy angona;
  • ampitahao ny median'ny 10 minitra farany amin'ny angona teo aloha;
  • mikiakiaka isika raha mahita zavatra;
  • manoratra ny tahan'ny kajy sy ny fanairana izay nitranga tao amin'ny influxdb;
  • mandefasa hafatra mahasoa ho an'ny malaina.

Raha ny hevitro dia nahavita nahatratra izay rehetra tiana ho azo tamin'ny farany izahay (ary na dia kely kokoa aza miaraka amin'ireo mpikarakara mahazatra) araka izay azo atao.

Azonao atao ny mijery ny github.com ohatra code и faritra kely indrindra (graphviz) ny script vokatra.

Ohatra amin'ny kaody vokarina:

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)

Inona no fehin-kevitra?

Kapacitor dia mahay manao fanairana-fanaraha-maso miaraka amin'ny vondron'olona maromaro, manao kajy fanampiny mifototra amin'ny metrika efa voarakitra, manao hetsika manokana ary script mandeha (udf).

Ny sakana amin'ny fidirana dia tsy dia avo loatra - andramo raha tsy mahafa-po tanteraka ny fanirianao ny grafana na fitaovana hafa.

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS 🔥 Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster