Við leysum hagnýt vandamál í Zabbix með JavaScript

Við leysum hagnýt vandamál í Zabbix með JavaScript
Tikhon Uskov, verkfræðingur Zabbix samþættingarteymi

Zabbix er sérhannaðar vettvangur sem er notaður til að fylgjast með hvers kyns gögnum. Frá fyrstu útgáfum af Zabbix hafa eftirlitsstjórnendur haft getu til að keyra ýmsar forskriftir í gegnum Aðgerðir til að athuga með hnúta netkerfisins. Jafnframt leiddi uppsetning forskrifta til fjölda erfiðleika, þar á meðal þörfina á að styðja forskriftir, sendingu þeirra til samskiptahnúta og umboðsmanna, svo og stuðning við mismunandi útgáfur.

JavaScript fyrir Zabbix

Í apríl 2019 var Zabbix 4.2 kynnt með JavaScript forvinnslu. Margir urðu spenntir fyrir hugmyndinni um að hætta að skrifa forskriftir sem taka gögn einhvers staðar, melta þau og útvega þau á sniði sem Zabbix skilur og framkvæma einfaldar athuganir sem munu taka við gögnum sem eru ekki tilbúin til geymslu og vinnslu hjá Zabbix, og vinna síðan úr þessum gagnastraumi með Zabbix og JavaScript verkfærum. Í tengslum við lágstig uppgötvun og háð atriði sem birtust í Zabbix 3.4, fengum við nokkuð sveigjanlegt hugtak til að flokka og stjórna mótteknum gögnum.

Í Zabbix 4.4, sem rökrétt framhald af forvinnslu í JavaScript, hefur ný tilkynningaaðferð birst - Webhook, sem hægt er að nota til að samþætta Zabbix tilkynningar auðveldlega við forrit þriðja aðila.

JavaScript og Duktapes

Af hverju voru JavaScript og Duktape fyrir valinu? Ýmsir valkostir fyrir tungumál og vélar voru skoðaðir:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Innbyggt Python
  • Innbyggð Perl

Helstu valviðmiðin voru algengi, auðveld samþætting vélarinnar í vöruna, lítil auðlindanotkun og heildarafköst vélarinnar og öryggi þess að innleiða kóða á þessu tungumáli í vöktun. Byggt á samsetningu vísanna vann JavaScript á Duktape vélinni.

Við leysum hagnýt vandamál í Zabbix með JavaScript

Valviðmið og frammistöðupróf

Duktape eiginleikar:

— Standard ECMAScript E5/E5.1
— Zabbix einingar fyrir Duktape:

  • Zabbix.log() - gerir þér kleift að skrifa skilaboð með mismunandi smáatriðum beint inn í Zabbix Server log, sem gerir það mögulegt að tengja villur, til dæmis í Webhook, við stöðu miðlarans.
  • CurlHttpRequest() - gerir þér kleift að gera HTTP beiðnir til netsins, sem notkun Webhook er byggð á.
  • atob() og btoa() - gerir þér kleift að umrita og afkóða strengi á Base64 sniði.

ATH. Duktape er í samræmi við ACME staðla. Zabbix notar 2015 útgáfuna af handritinu. Síðari breytingar eru smávægilegar, svo hægt er að hunsa þær..

JavaScript galdur

Allur galdurinn við JavaScript liggur í kraftmikilli vélritun og tegundarsteypu: strengi, tölustafi og boolean.

Þetta þýðir að ekki er nauðsynlegt að gefa upp fyrirfram hvaða tegund breytan á að skila gildi.

Í stærðfræðilegum aðgerðum er þeim gildum sem aðgerðaraðilar skila umreiknað í tölur. Undantekningin frá slíkum aðgerðum er viðbót, því ef að minnsta kosti eitt af hugtakunum er strengur, er strengjabreyting beitt á öll hugtök.

ATH. Aðferðirnar sem bera ábyrgð á slíkum umbreytingum eru venjulega útfærðar í frumgerð hlutarins, gildi Af и til String. gildi Af kallað við tölulega umbreytingu og alltaf á undan aðferðinni til String. Aðferð gildi Af verður að skila frumstæðum gildum, annars er niðurstaða hennar hunsuð.

Aðferð er kölluð á hlut gildiOF. Ef það finnst ekki eða skilar ekki frumgildi er aðferðin kölluð til String. Ef aðferðin til String fannst ekki, leitar gildi Af í frumgerð hlutarins, og allt er endurtekið þar til vinnslu gildisins er lokið og öll gildi í tjáningu eru steypt í sömu tegund. Ef hluturinn útfærir aðferð til String, sem skilar frumgildi, þá er það það sem er notað til að breyta strengjum. Hins vegar er niðurstaðan af því að beita þessari aðferð ekki endilega strengur.

Til dæmis, ef fyrir fyrir hlut 'obj' aðferð er skilgreind til String,

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

метод til String skilar nákvæmlega streng og þegar strengur með tölu er bætt við fáum við límdan streng:

`obj + 1 // '2001'` 

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

En ef þú endurskrifar til String, þannig að aðferðin skilar tölu, þegar hlutnum er bætt við verður gerð stærðfræðileg aðgerð með tölulegri umbreytingu og niðurstaða stærðfræðilegrar samlagningar fengin.

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

`obj + 1 // '2001'`

Í þessu tilfelli, ef við framkvæmum samlagningu með streng, er strengjabreyting gerð og við fáum límdan streng.

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

Þetta er ástæðan fyrir miklum fjölda mistaka nýliða JavaScript notenda.

Aðferðin til String þú getur skrifað fall sem hækkar núverandi gildi hlutarins um 1.

Við leysum hagnýt vandamál í Zabbix með JavaScript
Framkvæmd handrits, að því gefnu að breytan sé jöfn 3, og hún sé einnig jöfn 4.

Þegar borið er saman við kast (==) er aðferðin framkvæmd í hvert skipti til String með virðisaukningaraðgerð. Í samræmi við það, með hverjum síðari samanburði, eykst verðmæti. Þetta er hægt að forðast með því að nota samanburðarlausan samanburð (===).

Við leysum hagnýt vandamál í Zabbix með JavaScript
Samanburður án tegundarsteypu

ATH. Ekki nota leikarasamanburð að óþörfu.

Fyrir flóknar forskriftir, eins og Webhooks með flókinni rökfræði, sem krefjast samanburðar við gerð steypu, er mælt með því að forskrifa athuganir fyrir gildin sem skila breytum og meðhöndla ósamræmi og villur.

Webhook Media

Seint á árinu 2019 og snemma árs 2020 hefur Zabbix samþættingarteymið verið virkt að þróa Webhooks og útbúnar samþættingar sem fylgja Zabbix dreifingunni.

Við leysum hagnýt vandamál í Zabbix með JavaScript
Hlekkur á skjöl

Forvinnsla

  • Tilkoma forvinnslu í JavaScript gerði það mögulegt að yfirgefa flest ytri forskriftir og eins og er í Zabbix er hægt að fá hvaða gildi sem er og breyta því í allt annað gildi.
  • Forvinnsla í Zabbix er útfærð af JavaScript kóða, sem, þegar hann er settur saman í bætikóða, er breytt í fall sem tekur eitt gildi sem færibreytu gildi sem strengur (strengur getur innihaldið bæði tölustaf og tölu).
  • Þar sem úttakið er fall, þarf í lok skriftunnar aftur.
  • Það er hægt að nota sérsniðnar fjölvi í kóðanum.
  • Hægt er að takmarka auðlindir, ekki aðeins á stýrikerfisstigi, heldur einnig forritunarlega. Forvinnsluskrefinu er úthlutað að hámarki 10 megabæti af vinnsluminni og 10 sekúndur keyrslutími.

Við leysum hagnýt vandamál í Zabbix með JavaScript

ATH. Tímamörk upp á 10 sekúndur er töluvert mikið, vegna þess að söfnun skilyrtra þúsunda gagnahluta á 1 sekúndu samkvæmt frekar „þungri“ forvinnslu atburðarás getur hægt á Zabbix. Þess vegna er ekki mælt með því að nota forvinnslu til að keyra fullgild JavaScript forskriftir í gegnum svokallaða skuggagagnaeiningar (galla hluti), sem eru eingöngu keyrðir til að framkvæma forvinnslu.

Þú getur athugað kóðann þinn í gegnum forvinnsluprófið eða með því að nota tólið 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`

Hagnýt verkefni

Verkefni 1

Skiptu út reiknuðum hlut fyrir forvinnslu.

Ástand: Fáðu hitastigið í Fahrenheit frá skynjaranum til að geyma í Celsíus.

Áður myndum við búa til hlut sem safnar hitastigi í gráðum Fahrenheit. Eftir það, annar gagnaþáttur (reiknaður) sem myndi breyta Fahrenheit í Celsíus með formúlu.

Vandamál:

  • Nauðsynlegt er að afrita gagnaþætti og geyma öll gildi í gagnagrunninum.
  • Þú verður að samþykkja millibilið fyrir „foreldra“ gagnaatriðið sem er reiknað og notað í formúlunni og fyrir reiknaða gagnaliðinn. Að öðrum kosti getur reiknaður hlutur farið í óstudd ástand eða reiknað út fyrra gildi, sem mun hafa áhrif á áreiðanleika vöktunarniðurstaðna.

Ein lausnin var að hverfa frá sveigjanlegum athugunarbilum í þágu fastra millibila til að tryggja að reiknaður hlutur sé metinn á eftir hlutnum sem fær gögnin (í okkar tilviki, hitastigið í gráðum Fahrenheit).

En ef til dæmis notum við sniðmátið til að athuga fjölda tækja, og athugunin er framkvæmd einu sinni á 30 sekúndna fresti, „hakkar“ Zabbix í 29 sekúndur og á síðustu sekúndu byrjar það að athuga og reikna. Þetta skapar biðröð og hefur áhrif á frammistöðu. Þess vegna er mælt með því að nota fast millibil aðeins ef það er raunverulega nauðsynlegt.

Í þessu vandamáli er besta lausnin einlínu JavaScript forvinnsla sem breytir gráðum Fahrenheit í gráður á Celsíus:

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

Það er fljótlegt og auðvelt, þú þarft ekki að búa til óþarfa gagnahluti og halda sögu á þeim, og þú getur líka notað sveigjanlegt bil fyrir athuganir.

Við leysum hagnýt vandamál í Zabbix með JavaScript

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

En ef í tilgátum aðstæðum er nauðsynlegt að bæta við mótteknum gagnaeiningunni, til dæmis með hvaða fasta sem er skilgreindur í fjölvi, verður að taka tillit til þess að færibreytan gildi stækkar í streng. Í strengjasamlagningaraðgerð eru tveir strengir einfaldlega sameinaðir í einn.

Við leysum hagnýt vandamál í Zabbix með JavaScript

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

Til að fá niðurstöðu stærðfræðilegrar aðgerðar er nauðsynlegt að breyta gerðum gildanna sem fengust í tölulegt snið. Til þess geturðu notað aðgerðina parseInt(), sem framleiðir heiltölu, fall parseFloat(), sem framleiðir aukastaf eða fall númer, sem skilar heiltölu eða aukastaf.

Verkefni 2

Fáðu tímann í sekúndum þar til skírteinið lýkur.

Ástand: þjónusta gefur út fyrningardagsetningu vottorðs á sniðinu "12. feb 12:33:56 2022 GMT".

Í ECMAScript5 date.parse() samþykkir dagsetningu á ISO 8601 sniði (ÁÁÁÁ-MM-DDTHH:mm:ss.sssZ). Nauðsynlegt er að varpa streng í það á sniðinu MMM DD ÁÁÁÁ HH:mm:ss ZZ

vandamálið: Mánaðargildið er gefið upp sem texti, ekki sem tala. Gögn á þessu sniði eru ekki samþykkt af Duktape.

Dæmi um lausn:

  • Í fyrsta lagi er lýst yfir breytu sem tekur gildi (allt handritið er yfirlýsing um breytur sem eru skráðar aðskildar með kommum).

  • Í fyrstu línu fáum við dagsetninguna í stikunni gildi og aðskilja það með bilum með aðferðinni hættu. Þannig fáum við fylki, þar sem hver þáttur fylkisins, sem byrjar á vísitölu 0, samsvarar einum dagsetningareiningu fyrir og á eftir bili. skipt (0) - mánuði, skipt (1) - númer, skipt (2) - strengur með tíma o.s.frv. Eftir það er hægt að nálgast hvern þátt dagsetningar með vísitölu í fylkinu.

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

  • Hver mánuður (í tímaröð) samsvarar vísitölu stöðu hans í fylkinu (frá 0 til 11). Til að breyta textagildi í tölugildi er einum bætt við mánaðarvísitöluna (vegna þess að mánuðir eru númeraðir sem byrja á 1). Í þessu tilviki er tjáningin að viðbættum einum tekin innan sviga, því annars fæst strengur en ekki tala. Í lokin gerum við það sneið() - klipptu fylkið frá endanum til að skilja aðeins eftir tvo stafi (sem er mikilvægt fyrir mánuði með tveggja stafa tölu).

`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),`

  • Við myndum streng á ISO-sniði úr gildunum sem fengust með því að bæta við strengjum í viðeigandi röð.

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

Gögnin á því formi sem myndast eru sekúndnafjöldi frá 1970 til einhvers tíma í framtíðinni. Það er næstum ómögulegt að nota gögn á mótteknu sniði í kveikjum, vegna þess að Zabbix gerir þér kleift að starfa aðeins með fjölvi {Dagsetning} и {Tími}, sem skila dagsetningu og tíma á notendavænu sniði.

  • Við getum síðan fengið núverandi dagsetningu í JavaScript á Unix Timestamp sniði og dregið hana frá fyrningardagsetningu vottorðsins sem myndast til að fá fjölda millisekúndna frá núna þar til vottorðið rennur út.

`now = Date.now();`

  • Við deilum mótteknu gildinu með þúsund til að fá sekúndur í Zabbix.

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

Í kveikjunni geturðu tilgreint tjáninguna 'síðast' og talnasett sem samsvarar fjölda sekúndna á tímabilinu sem þú vilt svara, til dæmis í vikum. Þannig mun kveikjan tilkynna að vottorðið rennur út eftir viku.

ATH. Gefðu gaum að notkuninni parseInt() í virkni afturað umbreyta brotatölu sem verður til við skiptingu millisekúndna í heila tölu. Þú getur líka notað parseFloat() og geyma brotagögn.

Horfa á skýrslu

Heimild: www.habr.com

Bæta við athugasemd