Seifteanna le haghaidh próiseála méadrach i Kapacitor

Is dócha, lá atá inniu ann ní iarrann aon duine cén fáth go bhfuil sé riachtanach méadracht seirbhíse a bhailiú. Is é an chéad chéim loighciúil eile ná foláireamh a chur ar bun maidir leis na méadrachtaí a bhailítear, a thabharfaidh fógra faoi aon diallais sna sonraí ar chainéil atá áisiúil duit (post, Slack, Telegram). Sa tseirbhís áirithinte óstán ar líne Ostrovok.ru déantar gach méadracht dár seirbhísí a dhoirteadh isteach in InfluxDB agus a thaispeáint i Grafana, agus tá foláireamh bunúsach cumraithe ansin freisin. Le haghaidh tascanna ar nós “ní mór duit rud éigin a ríomh agus comparáid a dhéanamh leis,” úsáidimid Kapacitor.

Seifteanna le haghaidh próiseála méadrach i Kapacitor
Is cuid den chruach TICK é Kapacitor atá in ann méadracht a phróiseáil ó InfluxDB. Is féidir leis roinnt tomhais a nascadh le chéile (ceangal), rud éigin úsáideach a ríomh ó na sonraí a fuarthas, an toradh a scríobh ar ais chuig InfluxDB, foláireamh a sheoladh chuig Slack/Teileagram/mail.

Tá an stack iomlán fionnuar agus mionsonraithe doiciméadú, ach beidh rudaí úsáideacha ann i gcónaí nach gcuirtear in iúl go sainráite sna lámhleabhair. San Airteagal seo, chinn mé roinnt leideanna úsáideacha, neamhshoiléire den sórt sin a bhailiú (cuirtear síos ar chomhréir bhunúsach TICKscipt anseo) agus a thaispeáint conas is féidir iad a chur i bhfeidhm ag baint úsáide as sampla de cheann dár bhfadhbanna a réiteach.

A ligean ar dul!

snámhphointe & slánuimhir, earráidí ríofa

Fadhb atá fíorchaighdeánach, réitithe trí chaiséid:

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

Ag úsáid réamhshocraithe()

Mura bhfuil clib/réimse líonta isteach, tarlóidh earráidí ríofa:

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

líon isteach páirt (inmheánach vs seachtrach)

De réir réamhshocraithe, déanfaidh an t-aontú pointí a scriosadh nuair nach bhfuil aon sonraí ann (inmheánach).
Le líonadh('null'), déanfar páirtiú seachtrach, agus ina dhiaidh sin ní mór duit réamhshocrú () a dhéanamh agus na luachanna folamh a líonadh:

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

Tá nuance fós anseo. Sa sampla thuas, má tá ceann amháin den tsraith (res1 nó res2) folamh, beidh an tsraith (sonraí) mar thoradh air sin folamh freisin. Tá roinnt ticéid ar an ábhar seo ar Github (1633, 1871, 6967) – táimid ag fanacht le réitigh agus ag fulaingt beagán.

Coinníollacha a úsáid i ríomhanna (más i lambda)

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

Cúig nóiméad caite ón bpíblíne don tréimhse

Mar shampla, ní mór duit luachanna na gcúig nóiméad deiridh a chur i gcomparáid leis an tseachtain roimhe sin. Is féidir leat dhá bhaisc sonraí a ghlacadh in dhá bhaisc ar leith nó cuid de na sonraí a bhaint as tréimhse níos mó:

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

Rogha eile le haghaidh na gcúig nóiméad deiridh ná BarrierNode a úsáid, a ghearrann sonraí roimh an am sonraithe:

|barrier()
        .period(5m)

Samplaí de theimpléid Go a úsáid sa teachtaireacht

Comhfhreagraíonn teimpléid don fhormáid ón bpacáiste téacs.teimpléadSeo thíos roinnt puzail a gcastar orthu go minic.

más rud é eile

Cuirimid rudaí in ord agus ní spreagaimid daoine le téacs arís:

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

Dhá dhigit tar éis an phointe dheachúil sa teachtaireacht

Inléiteacht na teachtaireachta a fheabhsú:

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

Athróga sa teachtaireacht a mhéadú

Taispeánaimid tuilleadh eolais sa teachtaireacht chun an cheist “Cén fáth a bhfuil sé ag béicíl” a fhreagairt?

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

Aitheantóir foláirimh uathúil

Tá sé seo riachtanach nuair a bhíonn níos mó ná grúpa amháin sna sonraí, nó ní ghinfear ach foláireamh amháin:

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

Láimhseálaí saincheaptha

Áirítear ar an liosta mór de na láimhseálaithe exec, a ligeann duit a fhorghníomhú do script leis na paraiméadair a ritheadh ​​​​(stdin) - cruthaitheacht agus rud ar bith níos mó!

Ar cheann dár gcustaim tá script bheag Python chun fógraí a sheoladh chuig slack.
Ar dtús, theastaigh uainn pictiúr grafana faoi chosaint údaraithe a sheoladh i dteachtaireacht. Ina dhiaidh sin, scríobh OK sa snáithe chuig an bhfoláireamh roimhe seo ón ngrúpa céanna, agus ní mar theachtaireacht ar leith. Beagán níos déanaí - cuir leis an teachtaireacht an botún is coitianta sna X nóiméad deireanach.

Ábhar ar leith is ea cumarsáid le seirbhísí eile agus aon ghníomhartha a thionscnaíonn foláireamh (ach amháin má oibríonn do mhonatóireacht sách maith).
Sampla de chur síos láimhseálaí, áit a bhfuil slack_handler.py ár script féinscríofa:

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

Conas dífhabhtú a dhéanamh?

Rogha le haschur logáil

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

Faire (cli): kapacitor -url ósta-nó-ip:9092 logs lvl=earráid

Rogha le httpOut

Taispeánann sé sonraí sa phíblíne reatha:

|httpOut('something')

Féach (faigh): ósta-nó-ip:9092/kapacitor/v1/tasks/task_name/rud éigin

Léaráid fhorghníomhaithe

  • Tugann gach tasc crann forghníomhaithe ar ais le huimhreacha úsáideacha san fhormáid graffviz.
  • Tóg bloc ponc.
  • Greamaigh isteach sa lucht féachana é, taitneamh a bhaint as.

Cá háit eile ar féidir leat ráca a fháil?

stampa ama i sní isteach db ar aisscríobh

Mar shampla, chuireamar foláireamh ar bun maidir le suim na n-iarratas in aghaidh na huaire (groupBy(1h))) agus ba mhaith linn an foláireamh a tharla in influxdb a thaifeadadh (chun fírinne na faidhbe a thaispeáint go hálainn ar an ngrafán).

scríobhfaidh influxDBOut() an luach ama ón bhfoláireamh go dtí an stampa ama; dá réir sin, scríobhfar an pointe ar an gcairt níos luaithe/níos déanaí ná mar a tháinig an foláireamh.

Nuair a bhíonn cruinneas ag teastáil: oibrímid timpeall na faidhbe seo trí ghlao a chur ar láimhseálaí saincheaptha, a scríobhfaidh sonraí chuig influxdb leis an stampa ama reatha.

docker, tógáil agus imscaradh

Ag am tosaithe, is féidir le kapacitor tascanna, teimpléid agus láimhseálaithe a luchtú ón eolaire atá sonraithe sa chumraíocht sa bhloc [load].

Chun tasc a chruthú i gceart, beidh na rudaí seo a leanas uait:

  1. Ainm an chomhaid – leathnaithe isteach i ID/ainm scripte
  2. Cineál – sruth/baisc
  3. dbrp – eochairfhocal chun a chur in iúl cén bunachar sonraí + polasaí a ritheann an script (dbrp “soláthraí.” “autogen”)

Mura bhfuil líne le dbrp ag baint le tasc baisc éigin, diúltóidh an tseirbhís iomlán tosú agus scríobhfaidh sé go hionraic mar gheall air sa logáil.

I chronograf, ar a mhalairt, níor cheart go mbeadh an líne seo ann; ní ghlactar leis tríd an gcomhéadan agus gineann sé earráid.

Hack nuair a bhíonn coimeádán á thógáil: Fágann Dockerfile amach le -1 má tá línte le //.+dbrp ann, rud a ligfidh duit an chúis leis an teip a thuiscint láithreach agus an tógáil á chur le chéile.

páirt a ghlacadh le go leor

Tasc samplach: ní mór duit an 95ú peircintíl d’am oibriúcháin na seirbhíse a ghlacadh ar feadh seachtaine, déan comparáid idir gach nóiméad den 10 deiridh leis an luach seo.

Ní féidir leat páirt a ghlacadh aon-le-go leor, iompaíonn an pointe deireanach/meán/meán thar ghrúpa pointí an nód ina sruth, cuirfear ar ais an earráid “ní féidir imill mhímheaitseála an linbh a chur leis: baisc -> sruth”.

Ní chuirtear toradh bhaisc, mar athróg i slonn lambda, in ionad freisin.

Tá rogha ann na huimhreacha riachtanacha a shábháil ón gcéad bhaisc go comhad trí udf agus an comhad seo a luchtú trí sideload.

Cad a réitigh muid leis seo?

Tá thart ar 100 soláthróir óstán againn, is féidir le naisc éagsúla a bheith ag gach ceann acu, cuirimis cainéal air. Tá thart ar 300 de na cainéil seo, is féidir le gach ceann de na bealaí titim amach. As na méadrachtaí taifeadta go léir, déanfaimid monatóireacht ar an ráta earráide (iarratais agus earráidí).

Cén fáth nach grafana?

Tá roinnt míbhuntáistí ag baint le foláirimh earráide atá cumraithe i Grafana. Tá cuid acu ríthábhachtach, cuid eile ar féidir leat do shúile a dhúnadh dóibh, ag brath ar an gcás.

Níl a fhios ag Grafana conas idir thomhais + foláirimh a ríomh, ach teastaíonn ráta (iarrataí-earráidí)/iarratais.

Breathnaíonn na hearráidí olc:

Seifteanna le haghaidh próiseála méadrach i Kapacitor

Agus níos lú olc nuair a bhreathnaítear air le hiarratais rathúla:

Seifteanna le haghaidh próiseála méadrach i Kapacitor

Ceart go leor, is féidir linn an ráta sa tseirbhís a réamh-ríomh roimh grafana, agus i gcásanna áirithe oibreoidh sé seo. Ach ní inár linne, mar... do gach cainéal meastar gur “gnáth” a chóimheas féin, agus oibríonn foláirimh de réir luachanna statacha (féachaimid orthu lenár súile, athraigh iad má bhíonn foláirimh ann go minic).

Is samplaí iad seo de “gnáth” do chainéil éagsúla:

Seifteanna le haghaidh próiseála méadrach i Kapacitor

Seifteanna le haghaidh próiseála méadrach i Kapacitor

Déanaimid neamhaird den phointe roimhe seo agus glacaimid leis go bhfuil an pictiúr “gnáth” cosúil le gach soláthraí. Anois tá gach rud ceart go leor, agus is féidir linn a fháil trí le foláirimh i grafana?
Is féidir linn, ach ní theastaíonn uainn i ndáiríre, mar ní mór dúinn ceann de na roghanna a roghnú:
a) déan go leor graf do gach cainéal ar leithligh (agus gabháil leo go pianmhar)
b) fág cairt amháin le gach cainéal (agus dul amú sna línte ildaite agus foláirimh shaincheaptha)

Seifteanna le haghaidh próiseála méadrach i Kapacitor

Conas a rinne tú é?

Arís, tá sampla tosaigh maith sa doiciméadú (Rátaí a ríomh trasna na sraithe comhcheangailte), is féidir iad a peeked ag nó a ghlacadh mar bhonn i fadhbanna den chineál céanna.

Cad a rinne muid sa deireadh:

  • páirt a ghlacadh i dhá shraith i gceann cúpla uair an chloig, grúpáil de réir cainéil;
  • líon isteach an tsraith de réir grúpa mura raibh aon sonraí ann;
  • comparáid a dhéanamh idir airmheán na 10 nóiméad dheireanacha agus sonraí roimhe seo;
  • scairtimid má aimsímid rud éigin;
  • scríobhaimid na rátaí ríofa agus na foláirimh a tharla in influxdb;
  • seol teachtaireacht úsáideach chun slack.

I mo thuairimse, d'éirigh linn gach rud a theastaigh uainn a fháil ag an deireadh (agus fiú beagán níos mó le láimhseálaithe saincheaptha) a bhaint amach chomh hálainn agus is féidir.

Is féidir leat breathnú ar github.com sampla cód и ciorcad íosta (graphviz) an script mar thoradh air.

Sampla den chód mar thoradh air:

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)

Cad é an tátal?

Tá Kapacitor iontach ag déanamh monatóireachta-rabhaidh le dornán de ghrúpálacha, ag déanamh ríomhanna breise bunaithe ar mhéadracht taifeadta cheana féin, ag déanamh gníomhartha saincheaptha agus ag rith scripteanna (udf).

Níl an bacainn iontrála an-ard - déan iarracht é mura sásaíonn grafana nó uirlisí eile do mhianta go hiomlán.

Foinse: will.com

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster