Wy losse praktyske problemen yn Zabbix mei JavaScript

Wy losse praktyske problemen yn Zabbix mei JavaScript
Tikhon Uskov, Zabbix yntegraasje team yngenieur

Zabbix is ​​in oanpasber platfoarm dat wurdt brûkt om elke soart gegevens te kontrolearjen. Sûnt de ierste ferzjes fan Zabbix hawwe tafersjochbehearders de mooglikheid hân om ferskate skripts út te fieren fia aksjes foar kontrôles op doelnetwurkknooppunten. Tagelyk late de lansearring fan skripts ta in oantal swierrichheden, ynklusyf lykas de needsaak om skripts te stypjen, har levering oan kommunikaasjeknooppunten en proxy's, lykas stipe foar ferskate ferzjes.

JavaSkript foar Zabbix

Yn april 2019 waard Zabbix 4.2 yntrodusearre mei JavaScript-foarferwurking. In protte minsken waarden entûsjast oer it idee fan it ferlitten fan skriuwen fan skripts dy't gegevens earne nimme, it fertarren en leverje yn in formaat dat Zabbix begrypt, en ienfâldige kontrôles útfiere dy't gegevens sille ûntfange dy't net klear binne foar opslach en ferwurking troch Zabbix, en ferwurkje dan dizze gegevensstream mei Zabbix- en JavaScript-ark. Yn 'e mande mei ûntdekking op leech nivo en ôfhinklike items dy't ferskynden yn Zabbix 3.4, krigen wy in frij fleksibel konsept foar it sortearjen en behearen fan de ûntfongen gegevens.

Yn Zabbix 4.4, as in logyske fuortsetting fan foarferwurking yn JavaScript, is in nije notifikaasjemetoade ferskynde - Webhook, dy't kin wurde brûkt om Zabbix-notifikaasjes maklik te yntegrearjen mei applikaasjes fan tredden.

JavaSkript en Duktapes

Wêrom waarden JavaScript en Duktape keazen? Ferskate opsjes foar talen en motoren waarden beskôge:

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

De wichtichste seleksjekritearia wiene prevalens, gemak fan yntegraasje fan 'e motor yn it produkt, leech boarneferbrûk en algemiene prestaasjes fan' e motor, en de feiligens fan it ynfieren fan koade yn dizze taal yn tafersjoch. Op grûn fan 'e kombinaasje fan yndikatoaren wûn JavaScript op' e Duktape-motor.

Wy losse praktyske problemen yn Zabbix mei JavaScript

Seleksje kritearia en prestaasjes testen

Funksjes fan Duktape:

— Standert ECMAScript E5/E5.1
- Zabbix-modules foar Duktape:

  • Zabbix.log () - kinne jo skriuwe berjochten mei ferskillende nivo 's fan detail direkt yn de Zabbix Server log, dat makket it mooglik om te korrelearjen flaters, Bygelyks, yn in Webhook, mei de tsjinner steat.
  • CurlHttpRequest () - kinne jo meitsje HTTP-fersiken nei it netwurk, dêr't it brûken fan Webhook is basearre.
  • atob () en btoa () - kinne jo kodearje en dekodearje snaren yn Base64-formaat.

NOTE. Duktape foldocht oan ACME noarmen. Zabbix brûkt de 2015 ferzje fan it skript. Folgjende feroarings binne lyts, sadat se kinne wurde negearre..

JavaScript magy

Alle magy fan JavaSkript leit yn dynamysk typen en type casting: string, numerike en boolean.

Dit betsjut dat it net nedich is om foarôf te ferklearjen hokker type de fariabele in wearde werombringe moat.

Yn wiskundige operaasjes wurde de wearden weromjûn troch funksje-operators omboud ta sifers. De útsûndering foar sokke operaasjes is tafoeging, om't as op syn minst ien fan 'e termen in tekenrige is, wurdt tekenrigekonverzje tapast op alle termen.

NOTE. De metoaden ferantwurdlik foar sokke transformaasjes wurde meastentiids ymplementearre yn 'e âlderprototypes fan it objekt, wearde fan и oan String. wearde fan neamd tidens numerike konverzje en altyd foar de metoade oan String. Metoade wearde fan moat primitive wearden weromjaan, oars wurdt it resultaat negearre.

In metoade wurdt neamd op in objekt wearde fan. As it net fûn is of gjin primitive wearde jout, wurdt de metoade neamd oan String. As de metoade oan String net fûn, sykjen wearde fan yn it prototype fan it objekt, en alles wurdt werhelle oant de ferwurking fan 'e wearde is foltôge en alle wearden yn' e útdrukking wurde cast nei itselde type. As it objekt in metoade útfiert oan String, dy't in primitive wearde werombringt, dan is it dat wurdt brûkt foar tekenrige konverzje. It resultaat fan it tapassen fan dizze metoade is lykwols net needsaaklik in tekenrige.

Bygelyks, as foar foar objekt 'objekt' metoade wurdt definiearre oan String,

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

Metoade oan String jout krekt in tekenrige werom, en by it tafoegjen fan in tekenrige mei in nûmer, krije wy in lijmde tekenrige:

`obj + 1 // '2001'` 

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

Mar as jo opnij skriuwe oan String, sadat de metoade in nûmer jout, as it objekt tafoege wurdt, sil in wiskundige operaasje mei in numerike konverzje útfierd wurde en it resultaat fan wiskundige tafoeging wurdt krigen.

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

`obj + 1 // '2001'`

As wy yn dit gefal tafoeging mei in snaar útfiere, wurdt in snaarkonverzje útfierd, en wy krije in lijmde snaar.

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

Dit is de reden foar in grut oantal flaters troch begjinnende JavaScript-brûkers.

De metoade oan String Jo kinne in funksje skriuwe dy't de hjoeddeistige wearde fan it objekt mei 1 sil ferheegje.

Wy losse praktyske problemen yn Zabbix mei JavaScript
Utfiering fan it skript, op betingst dat de fariabele is gelyk oan 3, en it is ek gelyk oan 4.

As ferlike mei in cast (==), wurdt de metoade elke kear útfierd oan String mei wearde ferheging funksje. Dêrtroch nimt de wearde mei elke folgjende fergeliking ta. Dit kin foarkommen wurde troch te brûken non-cast ferliking (===).

Wy losse praktyske problemen yn Zabbix mei JavaScript
Fergeliking sûnder type casting

NOTE. Brûk Cast-fergeliking net ûnnedich.

Foar komplekse skripts, lykas Webhooks mei komplekse logika, dy't fergeliking fereaskje mei type casting, wurdt it oanrikkemandearre om kontrôles foar te skriuwen foar de wearden dy't fariabelen werombringe en ynkonsistinsjes en flaters behannelje.

Webhook Media

Ein 2019 en begjin 2020 hat it Zabbix-yntegraasjeteam aktyf ûntwikkele Webhooks en out-of-the-box-yntegraasjes dy't komme mei de Zabbix-distribúsje.

Wy losse praktyske problemen yn Zabbix mei JavaScript
Link nei dokumintaasje

Foarferwurking

  • De komst fan foarferwurking yn JavaScript makke it mooglik om de measte eksterne skripts te ferlitten, en op it stuit kinne jo yn Zabbix elke wearde krije en it konvertearje nei in folslein oare wearde.
  • Foarferwurking yn Zabbix wurdt ymplementearre troch JavaScript-koade, dy't, as kompilearre yn bytekoade, wurdt omsetten yn in funksje dy't ien wearde as parameter nimt wearde as tekenrige (in tekenrige kin sawol in sifer as in nûmer befetsje).
  • Sûnt de útfier is in funksje, oan 'e ein fan it skript is nedich werom.
  • It is mooglik om oanpaste makro's yn 'e koade te brûken.
  • Boarnen kinne wurde beheind net allinnich op it bestjoeringssysteem nivo, mar ek programmatysk. De foarferwurkingsstap wurdt tawiisd in maksimum fan 10 megabytes RAM en in run tiid limyt fan 10 sekonden.

Wy losse praktyske problemen yn Zabbix mei JavaScript

NOTE. De timeoutwearde fan 10 sekonden is in soad, om't it sammeljen fan betingsten tûzenen gegevensitems yn 1 sekonde neffens in nochal "swier" foarferwurkingssenario Zabbix kin fertrage. Dêrom is it net oan te rieden om foarferwurking te brûken om folweardige JavaScript-skripts út te fieren fia de saneamde skaadgegevens-eleminten (dummy-items), dy't allinich wurde útfierd om foarferwurking út te fieren.

Jo kinne jo koade kontrolearje fia de foarferwurkingstest of mei it helpprogramma 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`

Praktyske taken

Objective 1

Ferfange berekkene item mei foarferwurking.

Betingst: Krij de temperatuer yn Fahrenheit fan 'e sensor om yn Celsius op te slaan.

Earder soene wy ​​in item meitsje dat de temperatuer sammelt yn graden Fahrenheit. Dêrnei, in oar gegevens item (berekkene) dat soe omsette Fahrenheit nei Celsius mei help fan in formule.

Problemen:

  • It is needsaaklik om gegevens-eleminten te duplikearjen en alle wearden yn 'e databank op te slaan.
  • Jo moatte akkoard wurde oer de yntervallen foar de "âlder" gegevens item dat wurdt berekkene en brûkt yn de formule, en foar de berekkene gegevens item. Oars kin it berekkene item yn in net-stipe steat gean of in eardere wearde berekkenje, wat de betrouberens fan 'e monitoaringsresultaten sil beynfloedzje.

Ien oplossing wie om fuort te gean fan fleksibele kontrôle-yntervallen yn it foardiel fan fêste yntervallen om te soargjen dat it berekkene item wurdt evaluearre nei it item dat de gegevens ûntfangt (yn ús gefal de temperatuer yn graden Fahrenheit).

Mar as wy bygelyks it sjabloan brûke om in grut oantal apparaten te kontrolearjen, en de kontrôle wurdt ien kear elke 30 sekonden útfierd, Zabbix "hacks" foar 29 sekonden, en op 'e lêste sekonde begjint it te kontrolearjen en te berekkenjen. Dit soarget foar in wachtrige en beynfloedet prestaasjes. Dêrom is it oan te rieden om fêste yntervallen allinich te brûken as it echt nedich is.

Yn dit probleem is de optimale oplossing in ien-line JavaScript-foarferwurking dy't graden Fahrenheit konvertearret nei graden Celsius:

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

It is fluch en maklik, jo hoege net te meitsjen oerstallige gegevens items en hâld in skiednis op harren, En jo kinne ek brûke fleksibele yntervallen foar kontrôles.

Wy losse praktyske problemen yn Zabbix mei JavaScript

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

Mar as it yn in hypotetyske situaasje nedich is om it ûntfongen gegevenselemint ta te foegjen, bygelyks mei elke konstante definieare yn 'e makro, dan moat rekken hâlden wurde dat de parameter wearde wreidet út yn in tekenrige. Yn in string tafoeging operaasje wurde twa snaren gewoan kombinearre yn ien.

Wy losse praktyske problemen yn Zabbix mei JavaScript

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

Om it resultaat fan in wiskundige operaasje te krijen, is it nedich om de typen fan 'e krigen wearden te konvertearjen nei in numerike opmaak. Hjirfoar kinne jo de funksje brûke parseInt(), dat produsearret in hiel getal, in funksje parseFloat(), dat produsearret in desimaal, of in funksje nûmer, dy't in hiel getal of desimaal weromjout.

Opdracht 2

Krij de tiid yn sekonden oant it ein fan it sertifikaat.

Betingst: in tsjinst jout in ferfaldatum fan sertifikaat út yn it formaat "12 feb 12:33:56 2022 GMT".

Yn ECMAScript5 date.parse() akseptearret in datum yn ISO 8601 opmaak (YYYY-MM-DDTHH: mm: ss.sssZ). It is needsaaklik om der in tekenrige nei te smiten yn it formaat MMM DD JJJJ UU:mm:ss ZZ

probleem: De moannewearde wurdt útdrukt as tekst, net as in nûmer. Gegevens yn dit formaat wurde net akseptearre troch Duktape.

Foarbyld fan oplossing:

  • Alderearst wurdt in fariabele ferklearre dy't in wearde nimt (it hiele skript is in ferklearring fan fariabelen dy't skieden wurde neamd troch komma's).

  • Yn 'e earste rigel krije wy de datum yn' e parameter wearde en skiede it mei spaasjes mei de metoade spjalte. Sa krije wy in array, wêrby't elk elemint fan 'e array, begjinnend by yndeks 0, oerienkomt mei ien datum-elemint foar en nei in spaasje. split(0) - moanne, split(1) - nûmer, split(2) - in tekenrige mei tiid, ensfh Dêrnei kin elk elemint fan 'e datum tagonklik wurde troch yndeks yn' e array.

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

  • Elke moanne (yn gronologyske folchoarder) komt oerien mei de yndeks fan syn posysje yn 'e array (fan 0 oant 11). Om in tekstwearde te konvertearjen nei in numerike wearde, wurdt ien tafoege oan 'e moanneyndeks (om't moannen binne nûmere begjinnend by 1). Yn dit gefal wurdt de útdrukking mei de tafoeging fan ien tusken heakjes nommen, om't oars in tekenrige wurdt krigen, net in nûmer. Oan 'e ein dogge wy stikje () - snij de array fan 'e ein ôf om mar twa karakters oer te litten (wat wichtich is foar moannen mei in twa-sifers nûmer).

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

  • Wy foarmje in tekenrige yn ISO-formaat út 'e krigen wearden troch de gewoane tafoeging fan snaren yn' e passende folchoarder.

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

De gegevens yn it resultearjende formaat binne it oantal sekonden fan 1970 oant in punt yn 'e takomst. It is hast ûnmooglik om gegevens yn it ûntfongen formaat te brûken yn triggers, om't Zabbix jo allinich mei makro's kinne operearje {Datum} и {Tiid}, dy't de datum en tiid weromjaan yn in brûkerfreonlik formaat.

  • Wy kinne dan de aktuele datum yn JavaSkript krije yn Unix Timestamp-formaat en it subtrahearje fan 'e resultearjende sertifikaatferfaldatum om it oantal millisekonden fan no te krijen oant it sertifikaat ferrint.

`now = Date.now();`

  • Wy diele de ûntfongen wearde troch tûzen om sekonden te krijen yn Zabbix.

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

Yn de trigger kinne jo de útdrukking 'lêst' folge troch in set sifers dy't oerienkomt mei it oantal sekonden yn 'e perioade wêrop jo wolle reagearje, bygelyks yn wiken. Sa sil de trigger ynformearje dat it sertifikaat oer in wike ferrint.

NOTE. Soarch omtinken foar it gebrûk parseInt() yn funksje weromom it fraksjegetal dat ûntstiet út divyzje fan millisekonden nei in hiel getal te konvertearjen. Jo kinne ek brûke parseFloat() en opslaan fraksjonele gegevens.

Sjoch ferslach

Boarne: www.habr.com

Add a comment