Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik
Tikhon Uskov, Zabbix integrasie span ingenieur

Zabbix is ​​'n aanpasbare platform wat gebruik word om enige soort data te monitor. Sedert die vroegste weergawes van Zabbix het moniteringsadministrateurs die vermoë gehad om verskeie skrifte via aksies vir kontrole op teikennetwerk nodusse. Terselfdertyd het die bekendstelling van skrifte tot 'n aantal probleme gelei, insluitend soos die behoefte om skrifte te ondersteun, hul aflewering aan kommunikasienodusse en gevolmagtigdes, sowel as ondersteuning vir verskillende weergawes.

JavaScript vir Zabbix

In April 2019 is Zabbix 4.2 bekendgestel met JavaScript-voorverwerking. Baie mense het opgewonde geraak oor die idee om die skryf van skrifte te laat vaar wat data iewers heen neem, dit verteer en verskaf in 'n formaat wat Zabbix verstaan, en eenvoudige kontroles uit te voer wat data sal ontvang wat nie gereed is vir berging en verwerking deur Zabbix nie, en verwerk dan hierdie datastroom met Zabbix- en JavaScript-nutsmiddels. In samewerking met laevlak-ontdekking en afhanklike items wat in Zabbix 3.4 verskyn het, het ons 'n redelik buigsame konsep gekry om die ontvangde data te sorteer en te bestuur.

In Zabbix 4.4, as 'n logiese voortsetting van voorafverwerking in JavaScript, het 'n nuwe kennisgewingmetode verskyn - Webhook, wat gebruik kan word om Zabbix-kennisgewings maklik met derdeparty-toepassings te integreer.

JavaScript en Duktapes

Waarom is JavaScript en Duktape gekies? Verskeie opsies vir tale en enjins is oorweeg:

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

Die belangrikste seleksiekriteria was voorkoms, gemak van integrasie van die enjin in die produk, lae hulpbronverbruik en algehele werkverrigting van die enjin, en die veiligheid van die invoering van kode in hierdie taal in monitering. Gebaseer op die kombinasie van aanwysers, het JavaScript op die Duktape-enjin gewen.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik

Keuringskriteria en prestasietoetsing

Kenmerke van Duktape:

— Standaard ECMAScript E5/E5.1
— Zabbix-modules vir Duktape:

  • Zabbix.log() - laat jou toe om boodskappe met verskillende vlakke van detail direk in die Zabbix Server log te skryf, wat dit moontlik maak om foute, byvoorbeeld in 'n Webhook, met die bedienerstatus te korreleer.
  • CurlHttpRequest() - laat jou toe om HTTP-versoeke aan die netwerk te rig, waarop die gebruik van Webhook gebaseer is.
  • atob() en btoa() - laat jou toe om stringe in Base64-formaat te enkodeer en te dekodeer.

NOTA. Duktape voldoen aan ACME-standaarde. Zabbix gebruik die 2015-weergawe van die skrif. Daaropvolgende veranderinge is gering, dus kan hulle geïgnoreer word..

JavaScript-magie

Al die magie van JavaScript lê in dinamiese tik en tikwerk: string, numeries en boolean.

Dit beteken dat dit nie nodig is om vooraf te verklaar watter tipe die veranderlike 'n waarde moet teruggee nie.

In wiskundige bewerkings word die waardes wat deur funksie-operateurs teruggestuur word na getalle omgeskakel. Die uitsondering op sulke bewerkings is byvoeging, want as ten minste een van die terme 'n string is, word stringomskakeling op alle terme toegepas.

NOTA. Die metodes wat vir sulke transformasies verantwoordelik is, word gewoonlik in die objek se ouerprototipes geïmplementeer, Waarde van и na String. Waarde van genoem tydens numeriese omskakeling en altyd voor die metode na String. Metode Waarde van moet primitiewe waardes teruggee, anders word die resultaat daarvan geïgnoreer.

'n Metode word op 'n voorwerp genoem Waarde van. As dit nie gevind word nie of nie 'n primitiewe waarde gee nie, word die metode genoem na String. As die metode na String nie gevind nie, soek Waarde van in die prototipe van die voorwerp, en alles word herhaal totdat die verwerking van die waarde voltooi is en alle waardes in die uitdrukking na dieselfde tipe gegiet word. As die objek 'n metode implementeer na String, wat 'n primitiewe waarde gee, dan is dit dit wat vir stringomskakeling gebruik word. Die resultaat van die toepassing van hierdie metode is egter nie noodwendig 'n string nie.

Byvoorbeeld, as vir vir voorwerp 'obj'-metode gedefinieer word na String,

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

metode na String gee presies 'n string terug, en wanneer 'n string met 'n nommer bygevoeg word, kry ons 'n vasgeplakte string:

`obj + 1 // '2001'` 

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

Maar as jy herskryf na String, sodat die metode 'n getal gee, wanneer die voorwerp bygevoeg word, sal 'n wiskundige bewerking met 'n numeriese omskakeling uitgevoer word en die resultaat van wiskundige optelling sal verkry word.

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

`obj + 1 // '2001'`

In hierdie geval, as ons optelling met 'n snaar uitvoer, word 'n snaaromskakeling uitgevoer, en ons kry 'n vasgeplakte snaar.

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

Dit is die rede vir 'n groot aantal foute deur beginner JavaScript-gebruikers.

Die metode na String jy kan 'n funksie skryf wat die huidige waarde van die voorwerp met 1 sal verhoog.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik
Uitvoering van die skrif, mits die veranderlike gelyk is aan 3, en dit is ook gelyk aan 4.

In vergelyking met 'n rolverdeling (==), word die metode elke keer uitgevoer na String met waardeverhogingsfunksie. Gevolglik, met elke daaropvolgende vergelyking, neem die waarde toe. Dit kan vermy word deur nie-vergelyking (===) te gebruik.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik
Vergelyking sonder tipe gietwerk

NOTA. Moenie rolverdeling-vergelyking onnodig gebruik nie.

Vir komplekse skrifte, soos Webhooks met komplekse logika, wat vergelyking met tipe casting vereis, word dit aanbeveel om vooraf tjeks te skryf vir die waardes wat veranderlikes terugstuur en inkonsekwenthede en foute hanteer.

Webhook Media

Aan die einde van 2019 en vroeg in 2020 het die Zabbix-integrasiespan aktief Webhooks en out-of-the-box-integrasies ontwikkel wat saam met die Zabbix-verspreiding kom.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik
Skakel na dokumentasie

preprocessing

  • Die koms van voorafverwerking in JavaScript het dit moontlik gemaak om die meeste eksterne skrifte te laat vaar, en tans in Zabbix kan jy enige waarde kry en dit omskakel na 'n heeltemal ander waarde.
  • Voorverwerking in Zabbix word geïmplementeer deur JavaScript-kode, wat, wanneer dit in greepkode saamgestel word, omgeskakel word in 'n funksie wat 'n enkele waarde as 'n parameter neem waarde as 'n string ('n string kan beide 'n syfer en 'n getal bevat).
  • Aangesien die uitvoer 'n funksie is, word aan die einde van die skrif vereis terugkeer.
  • Dit is moontlik om persoonlike makro's in die kode te gebruik.
  • Hulpbronne kan nie net op bedryfstelselvlak beperk word nie, maar ook programmaties. Die voorverwerkingstap word 'n maksimum van 10 megagrepe RAM en 'n hardlooptydperk van 10 sekondes toegeken.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik

NOTA. Die uittelwaarde van 10 sekondes is nogal baie, want die versameling van voorwaardelike duisende data-items in 1 sekonde volgens 'n taamlik "swaar" voorverwerkingscenario kan Zabbix vertraag. Daarom word dit nie aanbeveel om voorafverwerking te gebruik om volwaardige JavaScript-skrifte uit te voer deur die sogenaamde skadudata-elemente (dummy items), wat slegs uitgevoer word om voorafverwerking uit te voer.

U kan u kode nagaan deur die voorverwerkingstoets of die hulpprogram te gebruik 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`

Praktiese take

Taak 1

Vervang berekende item met voorafverwerking.

Toestand: Kry die temperatuur in Fahrenheit van die sensor om in Celsius te stoor.

Voorheen sou ons 'n item skep wat die temperatuur in grade Fahrenheit versamel. Daarna, 'n ander data-item (bereken) wat Fahrenheit na Celsius sal omskakel deur 'n formule te gebruik.

probleme:

  • Dit is nodig om data-elemente te dupliseer en alle waardes in die databasis te stoor.
  • Jy moet ooreenkom oor die intervalle vir die "ouer" data-item wat in die formule bereken en gebruik word, en vir die berekende data-item. Andersins kan die berekende item in 'n ongesteunde toestand gaan of 'n vorige waarde bereken, wat die betroubaarheid van die moniteringsresultate sal beïnvloed.

Een oplossing was om weg te beweeg van buigsame kontrole-intervalle ten gunste van vaste intervalle om te verseker dat die berekende item geëvalueer word na die item wat die data ontvang (in ons geval, die temperatuur in grade Fahrenheit).

Maar as ons byvoorbeeld die sjabloon gebruik om 'n groot aantal toestelle na te gaan, en die kontrole word een keer elke 30 sekondes uitgevoer, "hacks" Zabbix vir 29 sekondes, en op die laaste sekonde begin dit kontroleer en bereken. Dit skep 'n tou en beïnvloed prestasie. Daarom word dit aanbeveel om slegs vaste intervalle te gebruik as dit regtig nodig is.

In hierdie probleem is die optimale oplossing 'n eenlyn JavaScript-voorverwerking wat grade Fahrenheit na grade Celsius omskakel:

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

Dit is vinnig en maklik, jy hoef nie onnodige data-items te skep en 'n geskiedenis daaroor te hou nie, en jy kan ook buigsame intervalle vir kontrole gebruik.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik

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

Maar as dit in 'n hipotetiese situasie nodig is om die ontvangde data-element by te voeg, byvoorbeeld met enige konstante wat in die makro gedefinieer is, moet in ag geneem word dat die parameter waarde brei uit in 'n tou. In 'n string-byvoegbewerking word twee stringe eenvoudig in een gekombineer.

Ons los praktiese probleme in Zabbix op deur JavaScript te gebruik

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

Om die resultaat van 'n wiskundige bewerking te verkry, is dit nodig om die tipes van die verkrygde waardes om te skakel na 'n numeriese formaat. Hiervoor kan jy die funksie gebruik parseInt(), wat 'n heelgetal, 'n funksie produseer parseFloat(), wat 'n desimale of 'n funksie produseer aantal, wat 'n heelgetal of desimale terugstuur.

2 uitdaging

Kry die tyd in sekondes tot aan die einde van die sertifikaat.

Toestand: 'n diens reik 'n sertifikaatvervaldatum uit in die formaat "12 Feb 12:33:56 2022 GMT".

In ECMAScript5 date.parse() aanvaar 'n datum in ISO 8601-formaat (JJJJ-MM-DDTH:mm:ss.sssZ). Dit is nodig om 'n tou daarheen te gooi in die formaat MMM DD JJJJ UU:mm:ss ZZ

probleem: Die maandwaarde word uitgedruk as teks, nie as 'n getal nie. Data in hierdie formaat word nie deur Duktape aanvaar nie.

Oplossingsvoorbeeld:

  • Eerstens word 'n veranderlike verklaar wat 'n waarde neem (die hele skrif is 'n verklaring van veranderlikes wat geskei word deur kommas).

  • In die eerste reël kry ons die datum in die parameter waarde en skei dit met spasies deur die metode te gebruik verdeel. Dus kry ons 'n skikking, waar elke element van die skikking, wat by indeks 0 begin, ooreenstem met een datumelement voor en na 'n spasie. verdeel (0) - maand, verdeel (1) - nommer, verdeel (2) - 'n string met tyd, ens. Daarna kan elke element van die datum verkry word deur indeks in die skikking.

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

  • Elke maand (in chronologiese volgorde) stem ooreen met die indeks van sy posisie in die skikking (van 0 tot 11). Om 'n tekswaarde na 'n numeriese waarde om te skakel, word een by die maandindeks gevoeg (omdat maande genommer word wat by 1 begin). In hierdie geval word die uitdrukking met die byvoeging van een tussen hakies geneem, want anders sal 'n string verkry word, nie 'n nommer nie. Aan die einde doen ons sny() - sny die skikking van die einde af om net twee karakters oor te laat (wat belangrik is vir maande met 'n tweesyfergetal).

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

  • Ons vorm 'n string in ISO-formaat uit die verkrygde waardes deur die gewone byvoeging van stringe in die toepaslike volgorde.

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

Die data in die resulterende formaat is die aantal sekondes vanaf 1970 tot 'n sekere punt in die toekoms. Dit is byna onmoontlik om data in die ontvangde formaat in snellers te gebruik, want Zabbix laat jou toe om slegs met makro's te werk {Datum} и {Tyd}, wat die datum en tyd in 'n gebruikersvriendelike formaat terugstuur.

  • Ons kan dan die huidige datum in JavaScript in Unix Timestamp-formaat kry en dit van die gevolglike sertifikaatvervaldatum aftrek om die aantal millisekondes van nou af te kry totdat die sertifikaat verval.

`now = Date.now();`

  • Ons deel die ontvangde waarde deur 'n duisend om sekondes in Zabbix te kry.

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

In die sneller kan jy die uitdrukking 'laaste' gevolg deur 'n stel syfers wat ooreenstem met die aantal sekondes in die tydperk waarop jy wil reageer, byvoorbeeld in weke. Die sneller sal dus in kennis stel dat die sertifikaat oor 'n week verval.

NOTA. Gee aandag aan die gebruik parseInt() in funksie terugkeerom die breukgetal wat voortspruit uit deling van millisekondes na 'n heelgetal om te skakel. Jy kan ook gebruik parseFloat() en stoor fraksionele data.

Kyk verslag

Bron: will.com

Voeg 'n opmerking