Mir léisen praktesch Problemer an Zabbix mat JavaScript

Mir léisen praktesch Problemer an Zabbix mat JavaScript
Tikhon Uskov, Zabbix Integratioun Team Ingenieur

Zabbix ass eng personalisĂ©ierbar Plattform dĂ©i benotzt gĂ«tt fir all Daten ze iwwerwaachen. ZĂ«nter de frĂ©ierste Versioune vun Zabbix hunn d'Iwwerwaachungsadministrateuren d'FĂ€higkeit fir verschidde Skripte via Aktiounen fir Kontrollen op Zil- Reseau Wirbelen. Zur selwechter ZĂ€it hunn d'Skripte lancĂ©iert zu enger Rei vu Schwieregkeeten gefouert, Ă«nner anerem wĂ©i d'Noutwendegkeet fir Scripten z'Ă«nnerstĂ«tzen, hir Liwwerung un d'KommunikatiounsknĂ€ppchen a Proxyen, souwĂ©i ËnnerstĂ«tzung fir verschidde Versiounen.

JavaScript fir Zabbix

Am Abrëll 2019 gouf Zabbix 4.2 mat JavaScript Preprocessing Funktionalitéit agefouert. Vill Leit sinn op d'Iddi komm fir Scripten opzeginn déi Daten iergendwou huelen, se verdauen an an engem Format verstÀndlech fir Zabbix ubidden, an amplaz einfach Kontrollen ausféieren déi Daten kréien déi net prett sinn fir ze spÀicheren an ze veraarbechten Zabbix, a veraarbecht dann dësen Datestroum mat Zabbix a JavaScript Tools. Am Zesummenhang mat Low-Level Entdeckung an ofhÀngeg Datenelementer, déi an Zabbix 3.4 opgetaucht sinn, war d'Resultat e zimlech flexibel Konzept fir d'Sortéierung an d'Gestioun vun den erhalenen Donnéeën.

Am Zabbix 4.4, als logesch Fortsetzung vun der Virveraarbechtung am JavaScript, erschéngt eng nei Notifikatiounsmethod - Webhook, déi benotzt ka ginn fir Zabbix Notifikatiounen mat Drëtt Partei Uwendungen einfach z'integréieren.

JavaScript an Duktape

Firwat goufen JavaScript an Duktape gewielt? Verschidde MĂ©iglechkeeten fir Sproochen a Motore goufen berĂŒcksichtegt:

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

D'Haaptauswielkriterien waren d'Prévalenz, d'Liichtegkeet vun der Integratioun vum Motor an de Produit, de gerénge Ressourceverbrauch an d'Gesamtleistung vum Motor, an d'Sécherheet vum Implementéiere vum Code an dëser Sprooch an der Iwwerwaachung. Baséierend op der Gesamtheet vun den Indikatoren huet JavaScript op der Duktape-Motor gewonnen.

Mir léisen praktesch Problemer an Zabbix mat JavaScript

SelektiounscritĂšren a Performance Tester

Features vun Duktape:

- Standard ECMAScript E5/E5.1
- Zabbix Moduler fir Duktape:

  • Zabbix.log () - erlaabt Iech Messagen mat verschiddenen Niveau vun Detail direkt an der Zabbix Server Logbuch ze schreiwen, dĂ©i mĂ©cht et mĂ©iglech Feeler ze verglĂ€ichen, Zum Beispill, an Webhook mat de Server Staat.
  • CurlHttpRequest () - erlaabt Iech HTTP-Ufroen un d'Netz ze maachen, op wat Webhook basĂ©iert.
  • atob () an btoa () - erlaabt Iech Strings an Base64 Format ze codĂ©ieren an decodĂ©ieren.

NOTIZ. Duktape entsprĂ©cht ACME Standarden. Zabbix benotzt d'2015 Versioun vum Skript. DĂ©i spĂ©ider Ännerungen si kleng a kĂ«nne ignorĂ©iert ginn.

D'Magie vu JavaScript

All d'Magie vu JavaScript lÀit am dynamesche Tippen an Typcasting: String, numeresch a boolesch.

Dëst bedeit datt et net néideg ass am Viraus ze deklaréieren wéi eng Zort d'Variabel soll zréckkommen.

A mathematesche Operatiounen ginn d'WÀerter, déi vu Funktiounsbedreiwer zréckginn, an Zuelen ëmgewandelt. Eng Ausnam zu esou Operatiounen ass Zousatz, well wann op d'mannst ee vun de Begrëffer eng String ass, gëtt eng Stringkonversioun op all Begrëffer applizéiert.

NOTIZ. Methoden verantwortlech fir sou Transformatiounen ginn normalerweis an Elterenobjekt Prototypen implementéiert, WÀert vun О zu String. WÀert vun wÀhrend enger numerescher Konversioun genannt an ëmmer virun der Method zu String. Method WÀert vun muss primitiv WÀerter zréckginn, soss gëtt sÀi Resultat ignoréiert.

Eng Method gëtt op en Objet genannt WÀertOF. Wann et net fonnt gëtt oder kee primitive WÀert zréckkënnt, gëtt d'Method genannt zu String. Wann d'Method zu String net fonnt, sicht WÀert vun am Prototyp vum Objet, an alles gëtt widderholl bis de WÀert veraarbecht gëtt an all WÀerter am Ausdrock op déiselwecht Aart gegoss ginn. Wann den Objet eng Method implementéiert huet zu String, deen e primitive WÀert zréckkënnt, da gëtt se fir Stringkonversioun benotzt. Wéi och ëmmer, d'Resultat vun der Benotzung vun dëser Method ass net onbedéngt e String.

Zum Beispill, wann fir fir Objet 'Objet' Method ass definéiert zu String,

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

Methode zu String gëtt genee d'String zréck, a wann Dir d'String mat enger Nummer bÀidréit, kréie mir de verbonne String:

`obj + 1 // '2001'` 

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

Awer wann Dir iwwerschreift zu StringFir datt d'Method eng Zuel zréckkënnt, wann Dir en Objet bÀidréit, gëtt eng mathematesch Operatioun mat enger numerescher Konversioun gemaach an d'Resultat vun der mathematescher Zousatz gëtt kritt.

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

`obj + 1 // '2001'`

Ausserdeem, wa mir Zousatz op engem String ausféieren, gëtt eng Stringkonversioun duerchgefouert a mir kréien e verbonne String.

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

Dëst ass genee de Grond fir eng grouss Unzuel vu Feeler vun UfÀnger JavaScript Benotzer.

D'Method zu String Dir kënnt eng Funktioun aginn déi den aktuelle WÀert vum Objet ëm 1 erhéicht.

Mir léisen praktesch Problemer an Zabbix mat JavaScript
Ausféierung vum Skript virausgesat datt d'Variabel glÀich ass 3, an et ass och glÀich wéi 4.

Wann Dir mam Typ Casting (==) verglÀicht, gëtt d'Method all Kéier ausgefouert zu String mat WÀert erhéijen Funktioun. Deementspriechend, mat all spéider Verglach geet de WÀert erop. Dëst kann vermeit ginn andeems Dir VerglÀicher ouni Typ Casting benotzt (===).

Mir léisen praktesch Problemer an Zabbix mat JavaScript
Verglach ouni Typ Goss

NOTIZ. Benotzt net Cast VerglÀicher onnéideg.

Fir komplex Scripten, wéi Webhook mat komplexer Logik, an deenen VerglÀicher mat Typ Casts noutwendeg sinn, ass et recommandéiert d'Checke fir d'WÀerter virzeschreiwen, déi d'Variabelen zréckginn an d'Inkonsistenz a Feeler behandelen.

Webhook Medien

Um Enn vun 2019 an Ufank 2020 huet d'Zabbix Integratiounsteam aktiv Webhooks an Out-of-the-Box Integratiounen entwéckelt, déi mat der Zabbix Verdeelung kommen.

Mir léisen praktesch Problemer an Zabbix mat JavaScript
Link zu Dokumentatioun

Virveraarbechtung

  • D'Entstoe vu Virveraarbechtung a JavaScript huet et mĂ©iglech gemaach dĂ©i meescht extern Scripten opzeginn, an elo an Zabbix kĂ«nnt Dir all WĂ€ert huelen an en an e komplett anere WĂ€ert transformĂ©ieren.
  • Virveraarbechtung an Zabbix gĂ«tt vum JavaScript Code implementĂ©iert, deen, wann se an Bytecode kompilĂ©iert ass, an eng Funktioun Ă«mgewandelt gĂ«tt dĂ©i en eenzege WĂ€ert als Parameter hĂ«lt WĂ€ert als String (de String kann souwuel eng Zuel an eng Zuel enthalen).
  • Well d'Ausgab eng Funktioun ass, ass et um Enn vum Skript erfuerderlech zrĂ©ck.
  • Et ass mĂ©iglech personalisĂ©iert Makroen am Code ze benotzen.
  • Ressourcen kĂ«nnen net nĂ«mmen um Betribssystemniveau limitĂ©iert ginn, awer och programmatesch. De VirveraarbechtungsschrĂ«tt gĂ«tt maximal 10 Megabytes RAM an eng Runtimelimit vun 10 Sekonnen zougewisen.

Mir léisen praktesch Problemer an Zabbix mat JavaScript

NOTIZ. En Timeout-WÀert vun 10 Sekonnen ass zimlech grouss, well Dausende vun Datenelementer an 1 Sekonn sammelen mat engem zimlech "schweren" Virveraarbechtungsszenario kann Zabbix verlangsamen. Dofir ass et net recommandéiert d'Virveraarbechtung ze benotzen fir vollwÀerteg JavaScript Scripten auszeféieren duerch déi sougenannte Schattendatenelementer (Dummy Elementer), déi nëmme gestart ginn fir d'Virveraarbechtung auszeféieren..

Dir kĂ«nnt Äre Code duerch e Virveraarbechtungstest kontrollĂ©ieren oder den Utility benotzen 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`

Praktesch Problemer

Objective 1

Ersetzen e berechent Dateartikel mat Virveraarbechtung.

Zoustand: Kritt Temperatur a Grad Fahrenheit vum Sensor fir a Grad Celsius ze spÀicheren.

Virdrun hÀtte mir en Dateelement erstallt deen d'Temperatur a Grad Fahrenheit gesammelt huet. Duerno gëtt en aneren Dateartikel (berechent) deen eng Formel benotzt fir Fahrenheit op Celsius ze konvertéieren.

Problem:

  • Et ass nĂ©ideg Datenelementer ze duplizĂ©ieren an all WĂ€erter an der Datebank ze spĂ€icheren.
  • Dir musst d'Intervalle fir den "Elteren" Dateartikel averstanen, deen an der Formel an der berechent Dateartikel berechent a benotzt gĂ«tt. Soss kann de berechent Dateartikel an en net Ă«nnerstĂ«tzten Zoustand erakommen oder de frĂ©iere WĂ€ert zielen, wat d'ZouverlĂ€ssegkeet vun den Iwwerwaachungsresultater beaflosst.

Eng Léisung war fir sech vu flexibele Scheckintervallen zugonschte vu fixen Intervalle ewechzekréien fir sécherzestellen datt de berechnen Dateartikel nom Empfangsdatenartikel berechent gëtt (an eisem Fall Temperatur a Grad Fahrenheit).

Awer wa mir zum Beispill eng Schabloun benotze fir eng grouss Unzuel vun Apparater ze kontrolléieren, an d'Kontroll gëtt eemol all 30 Sekonnen gemaach, Zabbix "slackt" fir 29 Sekonnen, an an der leschter Sekonn fÀnkt se un ze kontrolléieren an ze berechnen. Dëst schaaft eng Schlaang an beaflosst d'Performance. Dofir ass et recommandéiert fix Intervalle nëmmen ze benotzen wann absolut néideg.

Fir dëse Problem ass déi optimal Léisung eng One-Line JavaScript Virveraarbechtung déi Fahrenheit op Celsius konvertéiert:

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

Et ass séier an einfach, Dir musst net onnéideg Datenelementer erstellen an d'Geschicht op hinnen spÀicheren, an Dir kënnt och flexibel Intervalle fir Kontrollen benotzen.

Mir léisen praktesch Problemer an Zabbix mat JavaScript

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

Awer wann et an enger hypothetescher Situatioun nĂ©ideg ass fir dat resultĂ©ierend Dateelement ze addĂ©ieren, zum Beispill, mat e puer konstanten an engem Makro definĂ©iert, ass et nĂ©ideg ze berĂŒcksichtegen datt de Parameter WĂ€ert erweidert an eng Linn. An enger String Additioun Operatioun sinn zwee Saiten einfach an een kombinĂ©iert.

Mir léisen praktesch Problemer an Zabbix mat JavaScript

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

Fir d'Resultat vun enger mathematescher Operatioun ze kréien, ass et néideg d'Zorte vu WÀerter an e numerescht Format ze konvertéieren. Fir dëst ze maachen, kënnt Dir d'Funktioun benotzen parseInt(), déi eng ganz Zuel, Funktioun produzéiert parseFloat(), déi eng Dezimalfraktioun produzéiert, oder Funktioun Zuel, déi eng ganz Zuel oder eng Dezimalfraktioun produzéiert.

Problem 2

Kritt d'ZĂ€it a Sekonnen bis de Certificat ofleeft.

Zoustand: e bestëmmte Service gëtt den Zertifikatverfallsdatum am Format "Feb 12 12:33:56 2022 GMT" eraus.

An ECMAScript5 date.parse() akzeptéiert en Datum am ISO 8601 Format (JJJJ-MM-DDTHH:mm:ss.sssZ). Dir musst et an eng String am Format MMM DD JJJJ HH:mm:ss ZZ konvertéieren

Problem: De MountwÀert gëtt als Text ausgedréckt anstatt als Zuel. Daten an dësem Format ginn net vun Duktape ugeholl.

Beispill Léisung:

  • Als Ă©ischt gĂ«tt eng Variabel deklarĂ©iert dĂ©i e WĂ€ert hĂ«lt (de ganze Skript ass eng Deklaratioun vu Variabelen dĂ©i mat Komma getrennt sinn).

  • An der Ă©ischter Zeil krĂ©ien mir den Datum am Parameter WĂ€ert a trennt et mat Raum mat der Method SPLIT. Also krĂ©ie mir eng Array wou all Element vun der Array, ugefaange mam Index 0, entsprĂ©cht engem Datumelement virun an nom Raum. opgedeelt (0) - Mount, opgedeelt (1) - Zuel, opgedeelt (2) - eng String mat ZĂ€it, etc.. Duerno kann all Datumelement duerch Index an der Array zougĂ€nglech sinn.

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

  • All Mount (an chronologescher Uerdnung) entsprĂ©cht engem Index vu senger Positioun am Array (vun 0 bis 11). Fir en TextwĂ€ert an en numeresche WĂ€ert Ă«mzewandelen, gĂ«tt een an de Mountindex bĂ€igefĂŒĂŒgt (well d'MonatnummerĂ©ierung bei 1 ufĂ€nkt). An dĂ«sem Fall gĂ«tt den Ausdrock mat der Zousatz vun engem an Klammern geholl, well soss gĂ«tt d'Resultat e String, net eng Zuel. Zum Schluss maache mir op Scheiwen () - schneiden d'Array vum Enn fir nĂ«mmen zwee Zeechen ze loossen (wat wichteg ass fir MĂ©int mat enger zwee-Zifferen Nummer).

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

  • Mir bilden eng String am ISO-Format aus de kritt WĂ€erter andeems Dir d'String einfach an der entspriechender Uerdnung bĂ€igefĂŒĂŒgt.

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

D'Daten am entsteet Format sinn d'Zuel vun de Sekonnen vun 1970 bis e puer Punkt an der Zukunft. Et ass bal onméiglech Daten am resultéierende Format an Ausléiser ze benotzen, well Zabbix erlaabt Iech nëmme mat Makroen ze bedreiwen {Datum} О {Zeit}, déi den Datum an d'ZÀit an engem User-liesbare Format zréckginn.

  • Mir kĂ«nnen dann den aktuellen Datum am JavaScript am Unix Timestamp Format krĂ©ien an et vum resultĂ©ierende Verfallsdatum vum Zertifika subtrahĂ©ieren fir d'Zuel vu Millisekonnen vun elo un ze krĂ©ien bis de Certificat ofleeft.

`now = Date.now();`

  • Mir deelen de resultĂ©ierende WĂ€ert vun dausend fir Sekonnen an Zabbix ze krĂ©ien.

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

An engem Ausléiser kënnt Dir den Ausdrock spezifizéieren 'lescht' an eng Rei vun Zuelen, déi der Unzuel vu Sekonnen an der Period entsprécht, op déi Dir musst reagéieren, zum Beispill a Wochen. Sou wÀert den Ausléiser matdeelen datt den Zertifika an enger Woch ofleeft.

NOTIZ. Opgepasst op d'Benotzung parseInt() an Funktioun zréckfir d'Fraktiounszuel ze konvertéieren, déi duerch d'Divisioun vun Millisekonnen an eng ganz Zuel resultéiert. Dir kënnt och benotzen parseFloat() a spÀichert fractional Daten.

Kuckt de Bericht

Source: will.com

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster