Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript
Tikhon Uskov, inġinier tat-tim ta 'integrazzjoni ta' Zabbix

Zabbix hija pjattaforma customizable li tintuża biex tissorvelja kwalunkwe tip ta 'data. Sa mill-aktar verżjonijiet bikrija ta’ Zabbix, l-amministraturi tal-monitoraġġ kellhom il-kapaċità li jmexxu diversi skripts permezz Azzjonijiet għal kontrolli fuq nodi tan-netwerk fil-mira. Fl-istess ħin, it-tnedija ta 'skripts wasslet għal numru ta' diffikultajiet, inkluż bħall-ħtieġa li jiġu appoġġjati skripts, il-kunsinna tagħhom għal nodi ta 'komunikazzjoni u prokuri, kif ukoll appoġġ għal verżjonijiet differenti.

JavaScript għal Zabbix

F'April 2019, Zabbix 4.2 ġie introdott bil-preproċessar JavaScript. Ħafna nies eċċitati bl-idea li jabbandunaw skripts tal-kitba li jieħdu data x'imkien, jiddiġerixxuha u jipprovduha f'format li Zabbix jifhem, u jwettqu kontrolli sempliċi li jirċievu data li mhix lesta għall-ħażna u l-ipproċessar minn Zabbix, u imbagħad ipproċessa din il-fluss tad-dejta billi tuża għodod Zabbix u JavaScript. Flimkien ma 'skoperta ta' livell baxx u oġġetti dipendenti li dehru f'Zabbix 3.4, sirna kunċett pjuttost flessibbli għall-għażla u l-ġestjoni tad-dejta riċevuta.

F'Zabbix 4.4, bħala kontinwazzjoni loġika tal-ipproċessar minn qabel f'JavaScript, deher metodu ġdid ta 'notifika - Webhook, li jista' jintuża biex jintegra faċilment notifiki Zabbix ma 'applikazzjonijiet ta' partijiet terzi.

JavaScript u Duktapes

Għaliex ġew magħżula JavaScript u Duktape? Ġew ikkunsidrati diversi għażliet għal-lingwi u magni:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python inkorporat
  • Perl inkorporat

Il-kriterji ewlenin tal-għażla kienu prevalenza, faċilità ta 'integrazzjoni tal-magna fil-prodott, konsum baxx ta' riżorsi u prestazzjoni ġenerali tal-magna, u s-sigurtà tal-introduzzjoni ta 'kodiċi f'din il-lingwa fil-monitoraġġ. Ibbażat fuq il-kombinazzjoni ta 'indikaturi, JavaScript rebaħ fuq il-magna Duktape.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript

Kriterji tal-għażla u ttestjar tal-prestazzjoni

Karatteristiċi ta' Duktape:

— Standard ECMAScript E5/E5.1
— Moduli Zabbix għal Duktape:

  • Zabbix.log() - jippermettilek tikteb messaġġi b'livelli differenti ta' dettall direttament fil-log Zabbix Server, li jagħmilha possibbli li l-iżbalji jiġu korrelati, pereżempju, f'Webhook, mal-istat tas-server.
  • CurlHttpRequest() - jippermettilek tagħmel talbiet HTTP lin-netwerk, li fuqhom huwa bbażat l-użu tal-Webhook.
  • atob() u btoa() - jippermettilek tikkodifika u tiddekodifika kordi fil-format Base64.

NOTA. Duktape jikkonforma mal-istandards ACME. Zabbix juża l-verżjoni tal-2015 tal-iskript. Bidliet sussegwenti huma minuri, għalhekk jistgħu jiġu injorati..

Maġija JavaScript

Il-maġija kollha ta 'JavaScript tinsab fl-ittajpjar dinamiku u l-ikkastjar tat-tip: string, numeriku, u boolean.

Dan ifisser li mhux meħtieġ li jiġi ddikjarat minn qabel liema tip il-varjabbli għandha tirritorna valur.

F'operazzjonijiet matematiċi, il-valuri rritornati mill-operaturi tal-funzjoni huma kkonvertiti f'numri. L-eċċezzjoni għal operazzjonijiet bħal dawn hija ż-żieda, għaliex jekk mill-inqas wieħed mit-termini huwa string, il-konverżjoni tal-string tiġi applikata għat-termini kollha.

NOTA. Il-metodi responsabbli għal trasformazzjonijiet bħal dawn huma ġeneralment implimentati fil-prototipi prinċipali tal-oġġett, valueOf и għalString. valueOf imsejħa waqt il-konverżjoni numerika u dejjem qabel il-metodu għalString. Metodu valueOf irid jirritorna valuri primittivi, inkella r-riżultat tiegħu jiġi injorat.

Metodu jissejjaħ fuq oġġett valueOF. Jekk ma jinstabx jew ma jirritornax valur primittiv, il-metodu jissejjaħ għalString. Jekk il-metodu għalString ma nstabx, tiftix valueOf fil-prototip tal-oġġett, u kollox jiġi ripetut sakemm jitlesta l-ipproċessar tal-valur u l-valuri kollha fl-espressjoni jiġu mitfugħa għall-istess tip. Jekk l-oġġett jimplimenta metodu għalString, li jirritorna valur primittiv, allura huwa li jintuża għall-konverżjoni ta 'korda. Madankollu, ir-riżultat tal-applikazzjoni ta 'dan il-metodu mhuwiex neċessarjament string.

Per eżempju, jekk għal għal oġġett 'oġġettmetodu huwa definit għalString,

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

Metodu għalString jirritorna eżattament string, u meta nżidu string b'numru, irridu string inkollat:

`obj + 1 // '2001'` 

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

Imma jekk tikteb mill-ġdid għalString, sabiex il-metodu jirritorna numru, meta jiżdied l-oġġett, titwettaq operazzjoni matematika b'konverżjoni numerika u jinkiseb ir-riżultat taż-żieda matematika.

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

`obj + 1 // '2001'`

F'dan il-każ, jekk inwettqu żieda ma 'sekwenza, titwettaq konverżjoni ta' spag, u nġibu spag inkollat.

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

Din hija r-raġuni għal numru kbir ta 'żbalji minn utenti novizzi ta' JavaScript.

Il-metodu għalString tista' tikteb funzjoni li żżid il-valur attwali tal-oġġett b'1.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript
Eżekuzzjoni tal-iskrittura, sakemm il-varjabbli hija ugwali għal 3, u hija wkoll ugwali għal 4.

Meta mqabbel ma 'cast (==), il-metodu jiġi esegwit kull darba għalString b'funzjoni ta 'żieda fil-valur. Għaldaqstant, ma' kull paragun sussegwenti, il-valur jiżdied. Dan jista 'jiġi evitat bl-użu ta' paragun mhux mitfugħ (===).

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript
Tqabbil mingħajr ikkastjar tat-tip

NOTA. Tużax Paragun Cast Bla bżonn.

Għal skripts kumplessi, bħal Webhooks b'loġika kumplessa, li jeħtieġu paragun mat-tip casting, huwa rakkomandat li tikteb minn qabel kontrolli għall-valuri li jirritornaw varjabbli u jimmaniġġjaw inkonsistenzi u żbalji.

Webhook Media

Tard fl-2019 u kmieni fl-2020, it-tim ta 'integrazzjoni ta' Zabbix ilu jiżviluppa b'mod attiv Webhooks u integrazzjonijiet out-of-the-box li jiġu mad-distribuzzjoni Zabbix.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript
Rabta ma ' dokumentazzjoni

Preprocessar

  • Il-miġja tal-preproċessar f'JavaScript għamilha possibbli li jiġu abbandunati l-biċċa l-kbira tal-iskripts esterni, u bħalissa f'Zabbix tista 'tikseb kwalunkwe valur u jaqilbu għal valur kompletament differenti.
  • L-ipproċessar minn qabel f'Zabbix huwa implimentat minn kodiċi JavaScript, li, meta kkumpilat f'bytecode, jiġi kkonvertit f'funzjoni li tieħu valur wieħed bħala parametru valur bħala string (sekwenza jista' jkun fiha kemm ċifra kif ukoll numru).
  • Peress li l-output huwa funzjoni, fl-aħħar tal-iskript hija meħtieġa ritorn.
  • Huwa possibbli li tuża macros personalizzati fil-kodiċi.
  • Ir-riżorsi jistgħu jkunu limitati mhux biss fil-livell tas-sistema operattiva, iżda wkoll b'mod programmatiku. Il-pass tal-ipproċessar minn qabel huwa allokat massimu ta '10 megabytes ta' RAM u limitu ta 'żmien ta' tħaddim ta '10 sekondi.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript

NOTA. Il-valur ta 'timeout ta' 10 sekondi huwa pjuttost ħafna, minħabba li l-ġbir ta 'eluf kundizzjonali ta' oġġetti tad-dejta f'sekonda 1 skont xenarju ta 'preproċessar pjuttost "tqil" jista' jrattab Zabbix. Għalhekk, mhuwiex rakkomandat li tuża l-ipproċessar minn qabel biex tesegwixxi skripts JavaScript sħiħ permezz tal-hekk imsejħa elementi tad-dejta shadow (oġġetti finta), li jitmexxew biss biex iwettqu l-ipproċessar minn qabel..

Tista 'tiċċekkja l-kodiċi tiegħek permezz tat-test tal-ipproċessar minn qabel jew billi tuża l-utilità 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`

Ħidmiet prattiċi

Kompitu 1

Ibdel l-oġġett ikkalkulat bi proċessar minn qabel.

Kundizzjoni: Ikseb it-temperatura f'Fahrenheit mis-sensor biex taħżen f'Celsius.

Preċedentement, konna noħolqu oġġett li jiġbor it-temperatura fi gradi Fahrenheit. Wara dan, oġġett ta 'dejta ieħor (ikkalkulat) li jikkonverti Fahrenheit għal Celsius permezz ta' formula.

Problemi:

  • Huwa meħtieġ li l-elementi tad-dejta jiġu duplikati u l-valuri kollha fil-ħażna tad-database.
  • Trid taqbel dwar l-intervalli għall-oġġett tad-dejta "ġenitur" li huwa kkalkulat u użat fil-formula, u għall-oġġett tad-dejta kkalkulat. Inkella, l-oġġett ikkalkulat jista 'jmur fi stat mhux appoġġjat jew jikkalkula valur preċedenti, li jaffettwa l-affidabbiltà tar-riżultati tal-monitoraġġ.

Soluzzjoni waħda kienet li titbiegħed minn intervalli ta 'kontroll flessibbli favur intervalli fissi biex jiġi żgurat li l-oġġett ikkalkulat jiġi evalwat wara l-oġġett li jirċievi d-dejta (fil-każ tagħna, it-temperatura fi gradi Fahrenheit).

Imma jekk, pereżempju, nużaw il-mudell biex niċċekkjaw numru kbir ta 'apparati, u l-kontroll isir darba kull 30 sekonda, Zabbix "hacks" għal 29 sekonda, u fl-aħħar sekonda jibda jiċċekkja u jikkalkula. Dan joħloq kju u jaffettwa l-prestazzjoni. Għalhekk, huwa rakkomandat li tuża intervalli fissi biss jekk ikun verament meħtieġ.

F'din il-problema, l-aħjar soluzzjoni hija preproċessar ta' JavaScript b'linja waħda li tikkonverti gradi Fahrenheit għal gradi Celsius:

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

Huwa mgħaġġel u faċli, m'għandekx bżonn toħloq oġġetti ta 'dejta mhux meħtieġa u żżomm storja fuqhom, u tista' wkoll tuża intervalli flessibbli għall-kontrolli.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript

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

Iżda, jekk f'sitwazzjoni ipotetika huwa meħtieġ li jiżdied l-element tad-dejta riċevut, pereżempju, bi kwalunkwe kostanti definita fil-makro, għandu jitqies li l-parametru valur tespandi fi spag. F'operazzjoni ta 'żieda ta' kordi, żewġ kordi huma sempliċement magħquda f'wieħed.

Aħna nsolvu problemi prattiċi f'Zabbix billi tuża JavaScript

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

Biex tikseb ir-riżultat ta 'operazzjoni matematika, huwa meħtieġ li t-tipi tal-valuri miksuba jiġu kkonvertiti f'format numeriku. Għal dan tista' tuża l-funzjoni parseInt(), li jipproduċi numru sħiħ, funzjoni parseFloat(), li tipproduċi deċimali, jew funzjoni numru, li jirritorna numru sħiħ jew deċimali.

Kompitu 2

Ikseb il-ħin f'sekondi sat-tmiem taċ-ċertifikat.

Kundizzjoni: servizz joħroġ data ta' skadenza taċ-ċertifikat fil-format "12 ta' Frar 12:33:56 2022 GMT".

Fl-ECMAScript5 data.parse() jaċċetta data fil-format ISO 8601 (SSSS-XX-JJJH:mm:ss.sssZ). Huwa meħtieġ li titfa' spaga lejha fil-format MMM DD YYYY HH:mm:ss ZZ

problema: Il-valur tax-xahar huwa espress bħala test, mhux bħala numru. Data f'dan il-format mhix aċċettata minn Duktape.

Soluzzjoni Eżempju:

  • L-ewwelnett, tiġi ddikjarata varjabbli li tieħu valur (l-iskrittura kollha hija dikjarazzjoni ta 'varjabbli li huma elenkati separati b'virgoli).

  • Fl-ewwel linja nġibu d-data fil-parametru valur u sseparaha bi spazji bl-użu tal-metodu maqsuma. Għalhekk, irridu nġibu firxa, fejn kull element tal-firxa, li jibda mill-indiċi 0, jikkorrispondi għal element ta 'data wieħed qabel u wara spazju. maqsum (0) - xahar, maqsum (1) - numru, maqsum (2) - string bil-ħin, eċċ Wara dan, kull element tad-data jista 'jkun aċċessat permezz ta' indiċi fil-firxa.

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

  • Kull xahar (f'ordni kronoloġika) jikkorrispondi għall-indiċi tal-pożizzjoni tiegħu fil-firxa (minn 0 sa 11). Biex tikkonverti valur tat-test għal valur numeriku, wieħed jiżdied mal-indiċi tax-xahar (għax ix-xhur huma nnumerati li jibdew minn 1). F'dan il-każ, l-espressjoni biż-żieda ta 'wieħed tittieħed fil-parentesi, għaliex inkella se tinkiseb string, mhux numru. Fl-aħħar nagħmlu porzjon () - aqta 'l-firxa mill-aħħar biex tħalli biss żewġ karattri (li huwa importanti għal xhur b'numru b'żewġ ċifri).

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

  • Aħna niffurmaw string f'format ISO mill-valuri miksuba biż-żieda tas-soltu ta 'kordi fl-ordni xierqa.

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

Id-dejta fil-format li jirriżulta hija n-numru ta 'sekondi mill-1970 sa xi punt fil-futur. Huwa kważi impossibbli li tuża data fil-format riċevut fi triggers, minħabba li Zabbix jippermettilek topera biss b'macros {Data} и {Ħin}, li jirritorna d-data u l-ħin f'format faċli għall-utent.

  • Imbagħad nistgħu niksbu d-data kurrenti f'JavaScript f'format Unix Timestamp u nnaqqsuha mid-data ta 'skadenza taċ-ċertifikat li tirriżulta biex niksbu n-numru ta' millisekondi minn issa sakemm jiskadi ċ-ċertifikat.

`now = Date.now();`

  • Naqsmu l-valur riċevut b'elf biex niksbu sekondi f'Zabbix.

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

Fil-grillu, tista 'tispeċifika l-espressjoni 'l-aħħar' segwit minn sett ta' ċifri li jikkorrispondi għan-numru ta' sekondi fil-perjodu li għalih trid tirrispondi, pereżempju, f'ġimgħat. Għalhekk, il-grillu jinnotifika li ċ-ċertifikat jiskadi f'ġimgħa.

NOTA. Oqgħod attent għall-użu parseInt() fil-funzjoni ritornbiex tikkonverti n-numru frazzjonali li jirriżulta mid-diviżjoni ta 'millisekondi għal numru sħiħ. Tista 'wkoll tuża parseFloat() u aħżen data frazzjonali.

Watch rapport

Sors: www.habr.com

Żid kumment