Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz
Tikhon Uskov, Zabbix integrazio taldeko ingeniaria

Zabbix edozein motatako datuak kontrolatzeko erabiltzen den plataforma pertsonalizagarria da. Zabbixen lehen bertsioetatik, jarraipen-administratzaileek hainbat script-en bidez exekutatzeko gaitasuna izan dute. Ekintzak xede-sare-nodoen egiaztapenetarako. Aldi berean, script-ak abian jartzeak hainbat zailtasun ekarri zituen, besteak beste, script-ak onartzeko beharra, komunikazio-nodoetara eta proxyetara bidaltzea, baita bertsio ezberdinetarako euskarria ere.

Zabbix-erako JavaScript

2019ko apirilean, Zabbix 4.2 sartu zen JavaScript aurreprozesamenduarekin. Jende asko hunkitu zen datuak nonbait hartu, digeritu eta Zabbix-ek ulertzen duen formatuan eskaintzeko eta Zabbix-ek gordetzeko eta prozesatzeko prest ez dauden datuak jasoko dituzten egiaztapen sinpleak egiteko ideiarekin. gero prozesatu datu-jario hori Zabbix eta JavaScript tresnak erabiliz. Zabbix 3.4-n agertutako maila baxuko aurkikuntza eta menpeko elementuekin batera, jasotako datuak ordenatzeko eta kudeatzeko kontzeptu nahiko malgua lortu dugu.

Zabbix 4.4-n, JavaScript-en aurreprozesamenduaren jarraipen logiko gisa, jakinarazpen-metodo berri bat agertu da - Webhook, Zabbix jakinarazpenak hirugarrenen aplikazioekin erraz integratzeko erabil daitekeena.

JavaScript eta Duktapes

Zergatik aukeratu ziren JavaScript eta Duktape? Hizkuntza eta motorrentzako hainbat aukera kontuan hartu ziren:

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

Hautapen irizpide nagusiak nagusitasuna, motorra produktuan integratzeko erraztasuna, baliabideen kontsumo txikia eta motorren errendimendu orokorra eta monitorizazioan hizkuntza honetan kodea sartzeko segurtasuna izan ziren. Adierazleen konbinazioan oinarrituta, JavaScript irabazi zuen Duktape motorra.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz

Hautaketa-irizpideak eta errendimendu-probak

Duktape-ren ezaugarriak:

β€” Estandarra ECMAScript E5/E5.1
β€” Duktaperako Zabbix moduluak:

  • Zabbix.log() - xehetasun-maila ezberdineko mezuak zuzenean idazteko aukera ematen du Zabbix Server erregistroan, eta horri esker, erroreak, adibidez, Webhook batean, zerbitzariaren egoerarekin lotu daitezke.
  • CurlHttpRequest() - sarera HTTP eskaerak egiteko aukera ematen du, eta bertan Webhook-en erabilera oinarritzen da.
  • atob() eta btoa() - Base64 formatuan kateak kodetu eta deskodetzeko aukera ematen dizu.

OHARRA. Duktape-k ACME estandarrak betetzen ditu. Zabbix-ek 2015eko gidoiaren bertsioa erabiltzen du. Ondorengo aldaketak txikiak dira, beraz, ez ikusi egin daitezke..

JavaScript magia

JavaScript-en magia guztia idazketa dinamikoan eta mota-galdatzean datza: katea, zenbakizkoa eta boolearra.

Horrek esan nahi du ez dela beharrezkoa aldagaiak balio bat itzuli behar duen aldez aurretik deklaratzea.

Eragiketa matematikoetan, funtzio-operadoreek itzultzen dituzten balioak zenbaki bihurtzen dira. Eragiketa horien salbuespena gehitzea da, zeren eta gutxienez terminoetako bat kate bat bada, kateen bihurketa termino guztiei aplikatzen zaie.

OHARRA. Eraldaketen ardura duten metodoak normalean objektuaren prototipo nagusietan inplementatzen dira, balioaOf ΠΈ katea. balioaOf zenbakizko bihurketan deitzen da eta beti metodoaren aurretik katea. Metodoa balioaOf balio primitiboak itzuli behar ditu, bestela bere emaitza ez da aintzat hartuko.

Objektu bati metodo bati deitzen zaio balioaOF. Ez bada aurkitzen edo balio primitiborik itzultzen ez badu, metodoari deitzen zaio katea. Metodoa bada katea aurkitu ez, bilatzen balioaOf objektuaren prototipoan, eta dena errepikatzen da balioaren prozesamendua amaitu arte eta adierazpeneko balio guztiak mota berera botatzen diren arte. Objektuak metodo bat inplementatzen badu katea, balio primitibo bat itzultzen duena, gero kate bihurtzeko erabiltzen dena. Hala ere, metodo hau aplikatzearen emaitza ez da zertan kate bat izan.

Adibidez, objekturako bada 'objektua'metodoa definitzen da katea,

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

Metodo katea kate bat itzultzen du zehazki, eta zenbaki batekin kate bat gehitzean, kate itsatsi bat lortzen dugu:

`obj + 1 // '2001'` 

`obj + 'a' // β€˜200a'`

Baina berridazten baduzu katea, metodoak zenbaki bat itzul dezan, objektua gehitzean, zenbakizko bihurketa duen eragiketa matematiko bat egingo da eta batuketa matematikoaren emaitza lortuko da.

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

`obj + 1 // '2001'`

Kasu honetan, kate batekin batuketak egiten baditugu, kate bihurketa bat egiten da, eta kate itsatsi bat lortzen dugu.

`obj + 'a' // β€˜200a'`

Hau da JavaScript erabiltzaile hasiberriek akats ugariren arrazoia.

Metodoa katea objektuaren uneko balioa 1ean handituko duen funtzio bat idatz dezakezu.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz
Gidoia gauzatzea, baldin eta aldagaia 3ren berdina bada, eta 4ren berdina ere bada.

Cast (==) batekin alderatuta, metodoa aldi bakoitzean exekutatzen da katea balioa handitzeko funtzioarekin. Horren arabera, ondorengo konparaketa bakoitzean, balioa handitzen da. Hau saihestu daiteke cast ez den konparaketa erabiliz (===).

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz
Konparaketa mota casting gabe

OHARRA. Ez erabili Cast konparaketa alferrik.

Mota castingarekin alderatzea eskatzen duten script konplexuetarako, adibidez, logika konplexuko Webhooketarako, aldagaiak itzultzen dituzten eta inkoherentziak eta akatsak kudeatzen dituzten balioen egiaztapenak aldez aurretik idaztea gomendatzen da.

Webhook Media

2019 amaieran eta 2020 hasieran, Zabbix integrazio-taldea aktiboki garatzen ari da Zabbix banaketarekin batera datozen Webhook eta integrazio integrazioak.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz
Lotura dokumentazioa

preprocessing

  • JavaScript-en aurreprozesamenduaren etorrerak posible egin zuen kanpoko script gehienak alde batera uztea, eta gaur egun Zabbixen edozein balio lor dezakezu eta guztiz beste balio batera bihur dezakezu.
  • Zabbix-en aurreprozesatzea JavaScript kodearen bidez inplementatzen da, eta bytecode batean konpilatzen denean, parametro gisa balio bakarra hartzen duen funtzio batean bihurtzen da. balioa kate gisa (kate batek zifra eta zenbaki bat izan ditzake).
  • Irteera funtzio bat denez, scriptaren amaieran beharrezkoa da bueltan.
  • Kodean makro pertsonalizatuak erabil daitezke.
  • Baliabideak sistema eragilearen mailan ez ezik, programatikoki ere mugatu daitezke. Aurreprozesatzeko urratsari gehienez 10 megabyte RAM eta 10 segundoko exekuzio denbora muga esleitzen zaizkio.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz

OHARRA. 10 segundoko denbora-mugaren balioa nahiko handia da, baldintzazko milaka datu-elementu segundo batean biltzeak aurreprozesatzeko eszenatoki nahiko "astun" baten arabera Zabbix moteldu dezakeelako. Hori dela eta, ez da gomendagarria aurreprozesatzea erabiltzea JavaScript script osoak exekutatzeko, itzaleko datu-elementuen (elementu fikziozkoak) deitzen direnen bidez, aurreprozesaketa egiteko soilik exekutatzen direnak..

Zure kodea egiaztatu dezakezu aurreprozesatzeko probaren bidez edo utilitatea erabiliz 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`

Lan praktikoak

Task 1

Ordeztu kalkulatutako elementua aurreprozesamenduarekin.

baldintza: Lortu tenperatura Fahrenheit-etan sentsoretik Celsius-etan gordetzeko.

Aurretik, tenperatura gradu Fahrenheit-tan biltzen duen elementu bat sortuko genuke. Horren ostean, beste datu-elementu bat (kalkulatua) Fahrenheit Celsius bihurtuko luke formula bat erabiliz.

Problems:

  • Beharrezkoa da datu-elementuak bikoiztu eta balio guztiak datu-basean gordetzea.
  • Formulan kalkulatu eta erabiltzen den "guraso" datu-elementurako eta kalkulatutako datu-elementurako tarteak adostu behar dituzu. Bestela, kalkulatutako elementua onartzen ez den egoera batera joan daiteke edo aurreko balio bat kalkula dezake, eta horrek monitorizazio emaitzen fidagarritasunari eragingo dio.

Irtenbide bat izan zen egiaztapen-tarte malguetatik urruntzea, tarte finkoen alde, kalkulatutako elementua datuak jasotzen dituen elementuaren (gure kasuan, Fahrenheit-eko tenperatura gradutan) ondoren ebaluatzen dela ziurtatzeko.

Baina, adibidez, txantiloia gailu kopuru handia egiaztatzeko erabiltzen badugu, eta egiaztapena 30 segundoro behin egiten bada, Zabbixek 29 segundoz "pirateatzen" du, eta azken segundoan egiaztatzen eta kalkulatzen hasten da. Horrek ilara bat sortzen du eta errendimenduan eragiten du. Hori dela eta, benetan beharrezkoa bada soilik tarte finkoak erabiltzea gomendatzen da.

Arazo honetan, irtenbide optimoa Fahrenheit graduak Celsius gradu bihurtzen dituen lerro bakarreko JavaScript aurreprozesatzea da:

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

Azkarra eta erraza da, ez duzu beharrezkoa alferrikako datu-elementuak sortu eta horien historia gorde beharrik, eta tarte malguak ere erabil ditzakezu egiaztapenetarako.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz

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

Baina, egoera hipotetiko batean jasotako datu-elementua gehitu behar bada, adibidez, makroan definitutako edozein konstanterekin, kontuan hartu behar da parametroa balioa kate batean zabaltzen da. Kateak gehitzeko eragiketa batean, bi kate bakar batean konbinatzen dira.

Zabbixen arazo praktikoak konpontzen ditugu JavaScript erabiliz

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

Eragiketa matematiko baten emaitza lortzeko, lortutako balioen motak zenbakizko formatura bihurtzea beharrezkoa da. Horretarako funtzioa erabil dezakezu parseInt(), zenbaki oso bat, funtzio bat sortzen duena parseFloat(), hamartar bat edo funtzio bat sortzen duena zenbakia, zenbaki oso bat edo hamartar bat itzultzen duena.

2. ataza

Lortu denbora segundotan ziurtagiria amaitu arte.

baldintza: zerbitzu batek ziurtagiriaren iraungitze data igortzen du "Otsailak 12 12:33:56 2022 GMT" formatuan.

ECMAScript5-en data.parse() data bat onartzen du ISO 8601 formatuan (AAAA-MM-GGTHH:mm:ss.sssZ). Beharrezkoa da kate bat botatzea MMM DD YYYY HH:mm:ss ZZ formatuan

arazoa: Hilaren balioa testu gisa adierazten da, ez zenbaki gisa. Formatu honetako datuak ez ditu Duktape-k onartzen.

Irtenbidearen adibidea:

  • Lehenik eta behin, balio bat hartzen duen aldagai bat deklaratzen da (script osoa komaz bereizita zerrendatzen diren aldagaien deklarazioa da).

  • Lehenengo lerroan parametroan data jasoko dugu balioa eta bereizi espazioekin metodoa erabiliz zatitu. Horrela, matrize bat lortuko dugu, non matrizeko elementu bakoitza, 0 indizetik hasita, data-elementu bati dagokion espazio baten aurretik eta ondoren. zatitu (0) - hilabetea, zatitu (1) - zenbakia, zatitu (2) - denborarekin kate bat, etab. Horren ostean, dataren elementu bakoitza indizearen bidez sar daiteke matrizean.

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

  • Hilabete bakoitza (ordena kronologikoan) matrizean duen posizioaren indizeari dagokio (0tik 11ra). Testu-balio bat zenbakizko balio bihurtzeko, bat gehitzen zaio hilabete-indizeari (hilabeteak 1etik hasita zenbatzen direlako). Kasu honetan, bat gehitzen duen adierazpena kortxete artean hartzen da, bestela kate bat lortuko baita, ez zenbaki bat. Azkenean egiten dugu xerra () - moztu matrizea amaieratik bi karaktere bakarrik uzteko (garrantzitsua da hilabeteetan bi zifrako zenbaki batekin).

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

  • ISO formatuan kate bat osatzen dugu lortutako balioetatik ohiko kateak dagokion ordenan gehituz.

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

Ondorioz formatuan dauden datuak 1970etik etorkizuneko uneren batera dauden segundo kopurua dira. Jasotako formatuan datuak abiarazleetan erabiltzea ia ezinezkoa da, Zabbix-ek makroekin soilik funtzionatzeko aukera ematen baitu. {Data} ΠΈ {Denbora}, data eta ordua itzultzen dituen formatu errazean.

  • Ondoren, uneko data JavaScript-en lor dezakegu Unix Timestamp formatuan eta ondoriozko ziurtagiriaren iraungitze-datatik kendu dezakegu hemendik milisegundo kopurua lortzeko ziurtagiria iraungi arte.

`now = Date.now();`

  • Jasotako balioa milaz zatitzen dugu Zabbixen segundoak lortzeko.

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

Abiarazlean, ' adierazpena zehaztu dezakezuazkena' eta ondoren erantzun nahi diozun aldiko segundo kopuruari dagozkion zifra multzoa, adibidez, asteetan. Horrela, trigger-ak ziurtagiria aste batean iraungitzen dela jakinaraziko du.

OHARRA. Erreparatu erabilerari parseInt() funtzioan bueltanmilisegundoen zatiketaren ondoriozko zenbaki zatikia zenbaki oso bihurtzeko. Erabili ere egin dezakezu parseFloat() eta zatikako datuak gorde.

Ikusi txostena

Iturria: www.habr.com

Gehitu iruzkin berria