Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript
Tikhon Uskov, innealtóir foirne comhtháthú Zabbix

Is ardán customizable é Zabbix a úsáidtear chun monatóireacht a dhéanamh ar aon chineál sonraí. Ó na leaganacha is luaithe de Zabbix, bhí sé de chumas ag riarthóirí monatóireachta scripteanna éagsúla a rith trí gníomhartha le haghaidh seiceálacha ar nóid líonra sprice. Ag an am céanna, tháinig roinnt deacrachtaí le seoladh scripteanna, lena n-áirítear an gá atá le tacú le scripteanna, a seachadadh chuig nóid chumarsáide agus seachvótálaithe, chomh maith le tacaíocht do leaganacha éagsúla.

Javascript le haghaidh zabbix

I mí Aibreáin 2019, tugadh isteach Zabbix 4.2 le réamhphróiseáil JavaScript. Bhí sceitimíní ar go leor daoine faoin smaoineamh scripteanna a scríobh a thógann sonraí áit éigin, iad a dhíleá agus a chur ar fáil i bhformáid a thuigeann Zabbix a thréigean, agus seiceálacha simplí a dhéanamh a gheobhaidh sonraí nach bhfuil réidh le haghaidh stórála agus próiseála ag Zabbix, agus ansin próiseáil an sruth sonraí seo ag baint úsáide as uirlisí Zabbix agus JavaScript. I gcomhar le fionnachtain íseal-leibhéal agus míreanna cleithiúnacha a bhí le feiceáil i Zabbix 3.4, fuair muid coincheap sách solúbtha chun na sonraí a fuarthas a shórtáil agus a bhainistiú.

In Zabbix 4.4, mar leanúint loighciúil den réamhphróiseáil i JavaScript, tá modh fógra nua le feiceáil - Webhook, ar féidir a úsáid chun fógraí Zabbix a chomhtháthú go héasca le hiarratais tríú páirtí.

JavaScript agus Duktapes

Cén fáth ar roghnaíodh JavaScript agus Duktape? Breathnaíodh ar roghanna éagsúla maidir le teangacha agus innill:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python leabaithe
  • Perl Leabaithe

Ba iad na príomhchritéir roghnúcháin ná leitheadúlacht, éascaíocht comhtháthú an innill isteach sa táirge, tomhaltas íseal acmhainní agus feidhmíocht fhoriomlán an innill, agus sábháilteacht an chóid sa teanga seo a thabhairt isteach sa mhonatóireacht. Bunaithe ar an meascán táscairí, bhuaigh JavaScript ar an inneall Duktape.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript

Critéir roghnúcháin agus tástáil feidhmíochta

Gnéithe Duktape:

— Caighdeán ECMAScript E5/E5.1
- modúil Zabbix le haghaidh Duktape:

  • Zabbix.log() - ligeann sé duit teachtaireachtaí le leibhéil éagsúla sonraí a scríobh go díreach isteach sa logáil Freastalaí Zabbix, rud a fhágann gur féidir earráidí, mar shampla, i Webhook, a chomhghaolú le staid an fhreastalaí.
  • CurlHttpRequest() - is féidir leat iarratais HTTP a dhéanamh ar an líonra, ar a bhfuil úsáid Webhook bunaithe.
  • atob() agus btoa() - ligeann sé duit teaghráin a ionchódú agus a dhíchódú i bhformáid Base64.

NÓTA. Comhlíonann Duktape caighdeáin ACME. Úsáideann Zabbix leagan 2015 den script. Is mionathruithe iad ina dhiaidh sin, mar sin is féidir neamhaird a dhéanamh díobh..

Draíocht javascript

Tá draíocht JavaScript ar fad i gclóscríobh dinimiciúil agus i gcineáil réitigh: teaghrán, uimhriúil agus Boole.

Ciallaíonn sé seo nach gá a dhearbhú roimh ré cén cineál ar cheart don athróg luach a thabhairt ar ais.

In oibríochtaí matamaitice, déantar na luachanna a fhilleann oibreoirí feidhme a thiontú go huimhreacha. Is é an t-eisceacht d’oibríochtaí den sórt sin suimiú, mar más teaghrán é ceann amháin ar a laghad de na téarmaí, cuirtear comhshó teaghrán i bhfeidhm ar gach téarma.

NÓTA. Is iondúil go gcuirtear na modhanna atá freagrach as claochluithe den sórt sin i bhfeidhm i bhfréamhshamhlacha tuismitheora an ruda, i.e. luachOf и goString. luachOf ar a dtugtar le linn chomhshó uimhriúil agus i gcónaí roimh an modh goString. Modh luachOf Ní mór ar ais luachanna primitive, ar shlí eile tá a thoradh neamhaird.

Tugtar modh ar réad luachOF. Mura bhfuarthas é nó mura dtugann sé luach primitive ar ais, tugtar an modh goString. Má tá an modh goString ní bhfuarthas, cuardach luachOf i fhréamhshamhail an ruda, agus déantar gach rud arís agus arís eile go dtí go gcríochnófar próiseáil an luacha agus go ndéantar gach luach sa abairt a chaitheamh ar an gcineál céanna. Má chuireann an réad modh i bhfeidhm goString, a thugann luach primitive ar ais, ansin is é a úsáidtear le haghaidh comhshó teaghrán. Mar sin féin, ní gá gur teaghrán é toradh an mhodha seo a chur i bhfeidhm.

Mar shampla, más le haghaidh réad 'obj' sainítear modh goString,

`var obj = { toString() { return "200" }}` 

Modh goString filleann teaghrán go díreach, agus nuair a chuirtear téad le huimhir leis, faigheann muid téad greamaithe:

`obj + 1 // '2001'` 

`obj + 'a' // ‘200a'`

Ach má athscríobhann tú goString, ionas go dtabharfaidh an modh uimhir ar ais, nuair a chuirtear an réad leis, déanfar oibríocht matamaitice le tiontú uimhriúil agus gheobhaidh an toradh breise matamaitice.

`var obj = { toString() { return 200 }}` 

`obj + 1 // '2001'`

Sa chás seo, má dhéanaimid suimiú le téad, déantar tiontú teaghrán, agus faigheann muid teaghrán greamaithe.

`obj + 'a' // ‘200a'`

Is é seo an chúis le líon mór de na botúin ag úsáideoirí JavaScript novice.

An modh goString is féidir leat feidhm a scríobh a mhéadóidh luach reatha an réada faoi 1.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript
Forghníomhú na scripte, ar choinníoll go bhfuil an athróg cothrom le 3, agus tá sé comhionann le 4 freisin.

Nuair a chuirtear i gcomparáid le teilgthe (==), déantar an modh a fhorghníomhú gach uair goString le feidhm méadú luach. Dá réir sin, le gach comparáid ina dhiaidh sin, méadaíonn an luach. Is féidir é seo a sheachaint trí úsáid a bhaint as comparáid neamhtheilgthe (===).

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript
Comparáid gan cineál réitigh

NÓTA. Ná Úsáid Comparáid Teilgthe Gan ghá.

I gcás scripteanna casta, mar Webhooks le loighic chasta, a éilíonn comparáid le cineál-réitigh, moltar seiceálacha a réamh-scríobh do na luachanna a thugann athróga ar ais agus a láimhseálann neamhréireachtaí agus earráidí.

Meáin Ghréasáin

Go déanach i 2019 agus go luath i 2020, tá foireann comhtháthú Zabbix ag forbairt go gníomhach Webhooks agus comhtháthú lasmuigh den bhosca a thagann le dáileadh Zabbix.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript
Nasc le doiciméadú

Réamhphróiseáil

  • Le teacht na réamhphróiseála i JavaScript bhíothas in ann an chuid is mó de na scripteanna seachtracha a thréigean, agus faoi láthair in Zabbix is ​​féidir leat aon luach a fháil agus é a thiontú go luach iomlán difriúil.
  • Cuirtear réamhphróiseáil i Zabbix i bhfeidhm le cód JavaScript, a thiontaítear, nuair a chuirtear le chéile é i seachchód, go feidhm a ghlacann luach aonair mar pharaiméadar luach mar theaghrán (is féidir digit agus uimhir a bheith i dtéad).
  • Ós rud é gur feidhm é an t-aschur, tá gá ag deireadh na scripte ar ais.
  • Is féidir macraí saincheaptha a úsáid sa chód.
  • Is féidir acmhainní a theorannú ní hamháin ar leibhéal an chórais oibriúcháin, ach freisin ar leibhéal an chláir. Leithdháiltear 10 meigeavata RAM ar a mhéad don chéim réamhphróiseála agus teorainn ama rite 10 soicind.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript

NÓTA. Is é an luach teorainn ama de 10 soicind ná go leor, mar go bhféadfadh Zabbix moill a chur ar Zabbix agus na mílte míreanna sonraí coinníollach a bhailiú i soicind amháin de réir cás réamhphróiseála sách “trom”. Dá bhrí sin, ní mholtar réamhphróiseáil a úsáid chun scripteanna JavaScript lán-chuimsitheach a fhorghníomhú trí na heilimintí scáth-sonraí (míreanna caochadán), a reáchtáiltear ach amháin chun réamhphróiseáil a dhéanamh..

Is féidir leat do chód a sheiceáil tríd an tástáil réamhphróiseála nó trí úsáid a bhaint as an bhfóntas zabbix_js:

`zabbix_js -s *script-file -p *input-param* [-l log-level] [-t timeout]`

`zabbix_js -s script-file -i input-file [-l log-level] [-t timeout]`

`zabbix_js -h`

`zabbix_js -V`

Tascanna praiticiúla

Tasc 1

Cuir réamhphróiseáil in ionad an mhír ríofa.

Coinníoll: Faigh an teocht i Fahrenheit ón braiteoir a stóráil i Celsius.

Roimhe seo, chruthaimis mír a bhailíonn an teocht i gcéimeanna Fahrenheit. Tar éis sin, ítim sonraí eile (ríofa) a thiontódh Fahrenheit go Celsius ag baint úsáide as foirmle.

Fadhbanna:

  • Is gá eilimintí sonraí a dhúbailt agus gach luach a stóráil sa bhunachar sonraí.
  • Ní mór duit aontú ar na heatraimh don mhír sonraí "tuismitheoir" a ríomhtar agus a úsáidtear san fhoirmle, agus don mhír sonraí ríofa. Seachas sin, féadfaidh an mhír ríofa dul isteach i stát gan tacaíocht nó luach roimhe seo a ríomh, rud a dhéanfaidh difear d'iontaofacht na dtorthaí monatóireachta.

Ba é réiteach amháin ná bogadh ar shiúl ó eatraimh seiceála solúbtha i bhfabhar eatraimh sheasta chun a chinntiú go ndéantar meastóireacht ar an mír ríomh tar éis an mhír a fhaigheann na sonraí (inár gcás, an teocht i gcéimeanna Fahrenheit).

Ach más rud é, mar shampla, úsáidimid an teimpléad chun líon mór feistí a sheiceáil, agus déantar an seiceáil uair amháin gach 30 soicind, Zabbix "hacks" ar feadh 29 soicind, agus ag an dara ceann deireanach tosaíonn sé a sheiceáil agus a ríomh. Cruthaíonn sé seo scuaine agus cuireann sé isteach ar fheidhmíocht. Dá bhrí sin, moltar eatraimh sheasta a úsáid ach amháin má tá sé riachtanach i ndáiríre.

Sa fhadhb seo, is é an réiteach is fearr ná réamhphróiseáil JavaScript aonlíne a athraíonn céimeanna Fahrenheit go céimeanna Celsius:

`return (value - 32) * 5 / 9;`

Tá sé tapa agus éasca, ní gá duit míreanna sonraí gan ghá a chruthú agus stair a choinneáil orthu, agus is féidir leat eatraimh solúbtha a úsáid le haghaidh seiceálacha freisin.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript

`return (parseInt(value) + parseInt("{$EXAMPLE.MACRO}"));`

Ach, más rud é i staid hipitéiseach is gá an eilimint sonraí a fuarthas a chur leis, mar shampla, le haon tairiseach a shainítear sa mhacra, ní mór a chur san áireamh go bhfuil an paraiméadar luach leathnaíonn isteach i teaghrán. In oibríocht bhreise téad, ní dhéantar dhá theaghrán a chomhcheangal go simplí i gceann amháin.

Réitímid fadhbanna praiticiúla i Zabbix ag baint úsáide as JavaScript

`return (value + "{$EXAMPLE.MACRO}");`

Chun toradh oibríochta matamaitice a fháil, is gá cineálacha na luachanna a fhaightear a thiontú go formáid uimhriúil. Chun seo is féidir leat an fheidhm a úsáid parseInt(), a tháirgeann slánuimhir, feidhm parseFloat(), a tháirgeann deachúil, nó feidhm uimhir, a thugann slánuimhir nó deachúlach ar ais.

Tasc 2

Faigh an t-am i soicindí go dtí deireadh an deimhnithe.

Coinníoll: eisíonn seirbhís dáta éaga deimhnithe san fhormáid "12 Feabhra 12:33:56 2022 GMT".

In ECMAScript5 dáta.parse() glacann sé le dáta i bhformáid ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). Is gá sreangán a chaitheamh chuige san fhormáid MMM LL BBBB HH:mm:ss ZZ

fadhb: Cuirtear luach na míosa in iúl mar théacs, ní mar uimhir. Ní ghlacann Duktape le sonraí san fhormáid seo.

Sampla Réiteach:

  • Ar an gcéad dul síos, dearbhaítear athróg a thógann luach (is é an script iomlán dearbhú athróg atá liostaithe scartha le camóga).

  • Sa chéad líne a fháil againn ar an dáta sa pharaiméadar luach agus é a scaradh le spásanna ag baint úsáide as an modh scoilt. Mar sin, faigheann muid eagar, ina gcomhfhreagraíonn gach eilimint den eagar, ag tosú ag innéacs 0, d'eilimint dáta amháin roimh spás agus ina dhiaidh. scoilt(0) - mí, scoilt(1) - uimhir, scoilt(2) - teaghrán le ham, etc. Ina dhiaidh sin, is féidir rochtain a fháil ar gach eilimint den dáta trí innéacs san eagar.

`var split = value.split(' '),`

  • Freagraíonn gach mí (in ord cróineolaíoch) leis an innéacs a seasamh san eagar (ó 0 go 11). Chun luach téacs a thiontú go luach uimhriúil, cuirtear ceann amháin leis an innéacs míonna (toisc go bhfuil míonna uimhrithe ag tosú ag 1). Sa chás seo, tógtar an slonn le ceann amháin a shuimiú idir lúibíní, mar ar shlí eile gheobhaidh tú sreang, ní uimhir. Ag an deireadh a dhéanann muid slisne() - gearr an t-eagar ón deireadh chun dhá charachtar a fhágáil (rud atá tábhachtach ar feadh míonna le huimhir dhá dhigit).

`MONTHS_LIST = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],`

`month_index = ('0' + (MONTHS_LIST.indexOf(split[0]) + 1)).slice(-2),`

  • Déanaimid teaghrán i bhformáid ISO ó na luachanna a fhaightear trí ghnáth-theaghráin a chur leis san ord cuí.

`ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],`

Is iad na sonraí san fhormáid a eascraíonn as seo ná líon na soicind ó 1970 go pointe éigin sa todhchaí. Tá sé beagnach dodhéanta sonraí san fhormáid faighte a úsáid i dtruiceoirí, toisc go gceadaíonn Zabbix duit oibriú le macraí amháin {Dáta} и {Am}, a sheolann an dáta agus an t-am ar ais i bhformáid atá éasca le húsáid.

  • Is féidir linn an dáta reatha a fháil i JavaScript ansin i bhformáid Unix Timestamp agus é a dhealú ón dáta éaga an deimhnithe a bheidh mar thoradh air chun líon na milleasoicindí a fháil as seo go dtí go dtéann an deimhniú in éag.

`now = Date.now();`

  • Roinnimid an luach faighte ar mhíle chun soicind a fháil in Zabbix.

`return parseInt((Date.parse(ISOdate) - now) / 1000);`

Sa truicear, is féidir leat an slonn 'seo caite' ina dhiaidh sin tacar digití a fhreagraíonn do líon na soicind sa tréimhse a bhfuil tú ag iarraidh freagairt dó, mar shampla, i seachtainí. Mar sin, cuirfear in iúl don truicear go rachaidh an deimhniú in éag i gceann seachtaine.

NÓTA. Tabhair aird ar an úsáid parseInt() i bhfeidhm ar aischun an uimhir codánach a eascraíonn as roinnt na milleasoicindí a thiontú go slánuimhir. Is féidir leat úsáid a bhaint freisin parseFloat() agus sonraí codánacha a stóráil.

Féach tuairisc

Foinse: will.com

Add a comment