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 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.

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 , 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 ) 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 (, , ) – 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 Seo 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 :9092 logs lvl=earráid
Rogha le httpOut
Taispeánann sé sonraí sa phíblíne reatha:
|httpOut('something')
Féach (faigh): :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 .
- Tóg bloc .
- Greamaigh isteach sa lucht féachana é, .
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:
- Ainm an chomhaid – leathnaithe isteach i ID/ainm scripte
- Cineál – sruth/baisc
- 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:

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

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:


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)

Conas a rinne tú é?
Arís, tá sampla tosaigh maith sa doiciméadú (), 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 и 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
