Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript
Tikhon Uskov, inxhinier i ekipit të integrimit Zabbix

Zabbix është një platformë e personalizueshme që përdoret për të monitoruar çdo lloj të dhënash. Që nga versionet më të hershme të Zabbix, administratorët e monitorimit kanë pasur mundësinë të ekzekutojnë skriptet e ndryshme nëpërmjet Veprimet për kontrolle në nyjet e rrjetit të synuar. Në të njëjtën kohë, lëshimi i skripteve çoi në një sërë vështirësish, duke përfshirë nevojën për të mbështetur skriptet, dërgimin e tyre në nyjet e komunikimit dhe proxies, si dhe mbështetjen për versione të ndryshme.

JavaScript për Zabbix

Në prill 2019, Zabbix 4.2 u prezantua me parapërpunimin JavaScript. Shumë njerëz u emocionuan për idenë e braktisjes së shkrimit të skripteve që i çojnë të dhënat diku, i tretin dhe i ofrojnë në një format që Zabbix e kupton dhe kryejnë kontrolle të thjeshta që do të marrin të dhëna që nuk janë gati për ruajtje dhe përpunim nga Zabbix, dhe më pas përpunoni këtë rrymë të dhënash duke përdorur mjetet Zabbix dhe JavaScript. Në lidhje me zbulimet e nivelit të ulët dhe artikujt e varur që u shfaqën në Zabbix 3.4, ne morëm një koncept mjaft fleksibël për renditjen dhe menaxhimin e të dhënave të marra.

Në Zabbix 4.4, si një vazhdim logjik i përpunimit paraprak në JavaScript, është shfaqur një metodë e re njoftimi - Webhook, e cila mund të përdoret për të integruar lehtësisht njoftimet Zabbix me aplikacionet e palëve të treta.

JavaScript dhe Duktapes

Pse u zgjodhën JavaScript dhe Duktape? U shqyrtuan opsione të ndryshme për gjuhët dhe motorët:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python i integruar
  • Perl i ngulitur

Kriteret kryesore të përzgjedhjes ishin prevalenca, lehtësia e integrimit të motorit në produkt, konsumi i ulët i burimeve dhe performanca e përgjithshme e motorit, dhe siguria e futjes së kodit në këtë gjuhë në monitorim. Bazuar në kombinimin e treguesve, JavaScript fitoi në motorin Duktape.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript

Kriteret e përzgjedhjes dhe testimi i performancës

Karakteristikat e Duktape:

- Standard ECMAScript E5/E5.1
— Modulet Zabbix për Duktape:

  • Zabbix.log() - ju lejon të shkruani mesazhe me nivele të ndryshme detajesh drejtpërdrejt në regjistrin e serverit Zabbix, gjë që bën të mundur lidhjen e gabimeve, për shembull, në një Webhook, me gjendjen e serverit.
  • CurlHttpRequest() - ju lejon të bëni kërkesa HTTP në rrjet, në të cilat bazohet përdorimi i Webhook.
  • atob() dhe btoa() - ju lejon të kodoni dhe deshifroni vargjet në formatin Base64.

SHËNIM. Duktape përputhet me standardet ACME. Zabbix përdor versionin 2015 të skenarit. Ndryshimet e mëvonshme janë të vogla, kështu që ato mund të injorohen..

JavaScript Magic

E gjithë magjia e JavaScript qëndron në shtypjen dinamike dhe transmetimin e tipit: varg, numerik dhe boolean.

Kjo do të thotë se nuk është e nevojshme të deklarohet paraprakisht se çfarë lloji duhet të kthejë një vlerë ndryshorja.

Në operacionet matematikore, vlerat e kthyera nga operatorët e funksionit konvertohen në numra. Përjashtim nga këto operacione është shtimi, sepse nëse të paktën një nga termat është një varg, konvertimi i vargut zbatohet për të gjithë termat.

SHËNIM. Metodat përgjegjëse për transformime të tilla zakonisht zbatohen në prototipet mëmë të objektit, vlera e и teString. vlera e thirret gjatë shndërrimit numerik dhe gjithmonë para metodës teString. Metoda vlera e duhet të kthejë vlera primitive, përndryshe rezultati i tij shpërfillet.

Një metodë thirret në një objekt vlera E. Nëse nuk gjendet ose nuk kthen një vlerë primitive, thirret metoda teString. Nëse metoda teString nuk u gjet, në kërkim vlera e në prototipin e objektit, dhe gjithçka përsëritet derisa të përfundojë përpunimi i vlerës dhe të gjitha vlerat në shprehje janë hedhur në të njëjtin lloj. Nëse objekti zbaton një metodë teString, e cila kthen një vlerë primitive, atëherë është ajo që përdoret për konvertimin e vargut. Megjithatë, rezultati i aplikimit të kësaj metode nuk është domosdoshmërisht një varg.

Për shembull, nëse për objektin 'objËshtë përcaktuar metoda teString,

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

метод teString kthen saktësisht një varg, dhe kur shtojmë një varg me një numër, marrim një varg të ngjitur:

`obj + 1 // '2001'` 

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

Por nëse rishkruani teString, në mënyrë që metoda të kthejë një numër, kur objekti të shtohet, do të kryhet një veprim matematikor me një shndërrim numerik dhe do të merret rezultati i mbledhjes matematikore.

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

`obj + 1 // '2001'`

Në këtë rast, nëse kryejmë mbledhje me një varg, bëhet një konvertim i vargut dhe fitojmë një varg të ngjitur.

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

Kjo është arsyeja e një numri të madh gabimesh nga përdoruesit fillestarë të JavaScript.

Metoda teString mund të shkruani një funksion që do të rrisë vlerën aktuale të objektit me 1.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript
Ekzekutimi i skriptit, me kusht që ndryshorja të jetë e barabartë me 3, dhe gjithashtu të jetë e barabartë me 4.

Kur krahasohet me një cast (==), metoda ekzekutohet çdo herë teString me funksion të rritjes së vlerës. Prandaj, me çdo krahasim pasues, vlera rritet. Kjo mund të shmanget duke përdorur krahasimin jo-cast (===).

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript
Krahasimi pa derdhje tipi

SHËNIM. Mos përdorni krahasimin e aktorëve në mënyrë të panevojshme.

Për skriptet komplekse, të tilla si Webhooks me logjikë komplekse, që kërkojnë krahasim me llojin e hedhjes, rekomandohet të parashkruhet kontrolle për vlerat që kthejnë variablat dhe trajtojnë mospërputhjet dhe gabimet.

Media Webhook

Në fund të vitit 2019 dhe në fillim të vitit 2020, ekipi i integrimit të Zabbix ka zhvilluar në mënyrë aktive Webhooks dhe integrime jashtë kutisë që vijnë me shpërndarjen Zabbix.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript
Lidh me dokumentacionin

preprocessing

  • Ardhja e parapërpunimit në JavaScript bëri të mundur braktisjen e shumicës së skripteve të jashtme, dhe aktualisht në Zabbix mund të merrni çdo vlerë dhe ta konvertoni atë në një vlerë krejtësisht të ndryshme.
  • Parapërpunimi në Zabbix zbatohet nga kodi JavaScript, i cili, kur përpilohet në bytecode, konvertohet në një funksion që merr një vlerë të vetme si parametër. vlerë si varg (një varg mund të përmbajë edhe një shifër edhe një numër).
  • Meqenëse dalja është një funksion, në fund të skriptit kërkohet kthim.
  • Është e mundur të përdoren makro të personalizuara në kod.
  • Burimet mund të kufizohen jo vetëm në nivelin e sistemit operativ, por edhe programatikisht. Hapi i parapërpunimit i jepet një maksimum prej 10 megabajt RAM dhe një afat kohor ekzekutimi prej 10 sekondash.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript

SHËNIM. Vlera e afatit prej 10 sekondash është mjaft e madhe, sepse mbledhja e mijëra artikujve të të dhënave në 1 sekondë sipas një skenari parapërpunues mjaft "të rëndë" mund të ngadalësojë Zabbix. Prandaj, nuk rekomandohet përdorimi i parapërpunimit për të ekzekutuar skriptet e plota JavaScript përmes të ashtuquajturve elementë të të dhënave hije (artikuj bedel), të cilët ekzekutohen vetëm për të kryer parapërpunim.

Ju mund ta kontrolloni kodin tuaj përmes testit të parapërpunimit ose duke përdorur programin 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`

Detyra praktike

Detyrë 1

Zëvendësoni artikullin e llogaritur me parapërpunim.

Gjendja: Merrni temperaturën në Fahrenheit nga sensori për ta ruajtur në Celsius.

Më parë, ne do të krijonim një artikull që mbledh temperaturën në gradë Fahrenheit. Pas kësaj, një artikull tjetër i të dhënave (i llogaritur) që do të konvertonte Fahrenheit në Celsius duke përdorur një formulë.

Problemet:

  • Është e nevojshme të kopjohen elementët e të dhënave dhe të ruhen të gjitha vlerat në bazën e të dhënave.
  • Ju duhet të bini dakord për intervalet për elementin e të dhënave "mëmë" që llogaritet dhe përdoret në formulë, dhe për artikullin e të dhënave të llogaritur. Përndryshe, artikulli i llogaritur mund të shkojë në një gjendje të pambështetur ose të llogarisë një vlerë të mëparshme, e cila do të ndikojë në besueshmërinë e rezultateve të monitorimit.

Një zgjidhje ishte largimi nga intervalet fleksibël të kontrollit në favor të intervaleve fikse për të siguruar që artikulli i llogaritur të vlerësohet pas artikullit që merr të dhënat (në rastin tonë, temperatura në gradë Fahrenheit).

Por nëse, për shembull, ne përdorim shabllonin për të kontrolluar një numër të madh pajisjesh dhe kontrolli kryhet një herë në 30 sekonda, Zabbix "hakon" për 29 sekonda dhe në sekondën e fundit fillon të kontrollojë dhe llogaritë. Kjo krijon një radhë dhe ndikon në performancën. Prandaj, rekomandohet përdorimi i intervaleve fikse vetëm nëse është vërtet e nevojshme.

Në këtë problem, zgjidhja optimale është një parapërpunim JavaScript me një linjë që konverton gradë Fahrenheit në gradë Celsius:

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

Është e shpejtë dhe e lehtë, nuk keni nevojë të krijoni artikuj të panevojshëm të të dhënave dhe të mbani një histori në to, dhe gjithashtu mund të përdorni intervale fleksibël për kontrolle.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript

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

Por, nëse në një situatë hipotetike është e nevojshme të shtohet elementi i të dhënave të marra, për shembull, me ndonjë konstante të përcaktuar në makro, duhet të merret parasysh se parametri vlerë zgjerohet në një varg. Në një operacion të shtimit të vargut, dy vargje thjesht kombinohen në një.

Ne zgjidhim probleme praktike në Zabbix duke përdorur JavaScript

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

Për të marrë rezultatin e një operacioni matematikor, është e nevojshme të konvertohen llojet e vlerave të marra në një format numerik. Për këtë ju mund të përdorni funksionin parseInt(), e cila prodhon një numër të plotë, një funksion parseFloat (), e cila prodhon një dhjetore, ose një funksion numër, e cila kthen një numër të plotë ose dhjetor.

Problemi 2

Merrni kohën në sekonda deri në përfundimin e certifikatës.

Gjendja: një shërbim lëshon një datë skadimi të certifikatës në formatin "12 shkurt 12:33:56 2022 GMT".

Në ECMAScript5 date.parse() pranon një datë në formatin ISO 8601 (VVVV-MM-DDTHH:mm:ss.sssZ). Është e nevojshme t'i hedhësh një varg në formatin MMM DD YYYY HH:mm:ss ZZ

problem: Vlera e muajit shprehet si tekst, jo si numër. Të dhënat në këtë format nuk pranohen nga Duktape.

Shembull zgjidhje:

  • Para së gjithash, deklarohet një variabël që merr një vlerë (i gjithë skripti është një deklaratë e variablave që renditen të ndara me presje).

  • Në rreshtin e parë marrim datën në parametër vlerë dhe e ndajmë me hapësira duke përdorur metodën i ndarë. Kështu, marrim një grup, ku çdo element i grupit, duke filluar nga indeksi 0, korrespondon me një element datë para dhe pas një hapësire. ndarje (0) - muaj, ndarje (1) - numri, ndarje (2) - një varg me kohë, etj. Pas kësaj, çdo element i datës mund të aksesohet me indeks në grup.

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

  • Çdo muaj (në rend kronologjik) korrespondon me indeksin e pozicionit të tij në grup (nga 0 në 11). Për të kthyer një vlerë teksti në një vlerë numerike, një i shtohet indeksit të muajit (sepse muajt numërohen duke filluar nga 1). Në këtë rast, shprehja me mbledhjen e një merret në kllapa, sepse në të kundërtën do të fitohet një varg, jo një numër. Në fund e bëjmë fetë () - prerë grupin nga fundi për të lënë vetëm dy karaktere (gjë që është e rëndësishme për muaj me një numër dyshifror).

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

  • Ne formojmë një varg në formatin ISO nga vlerat e marra me shtimin e zakonshëm të vargjeve në rendin e duhur.

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

Të dhënat në formatin që rezulton janë numri i sekondave nga viti 1970 deri në një moment në të ardhmen. Është pothuajse e pamundur të përdoren të dhënat në formatin e marrë në aktivizues, sepse Zabbix ju lejon të operoni vetëm me makro {Data} и {Koha}, të cilat kthejnë datën dhe orën në një format të përshtatshëm për përdoruesit.

  • Më pas mund të marrim datën aktuale në JavaScript në formatin Unix Timestamp dhe ta zbresim atë nga data e skadimit të certifikatës që rezulton për të marrë numrin e milisekondave nga tani deri në skadimin e certifikatës.

`now = Date.now();`

  • Ne e ndajmë vlerën e marrë me një mijë për të marrë sekonda në Zabbix.

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

Në këmbëzën, mund të specifikoni shprehjen 'e fundit' e ndjekur nga një grup shifrash që korrespondon me numrin e sekondave në periudhën në të cilën dëshironi të përgjigjeni, për shembull, në javë. Kështu, këmbëza do të njoftojë se certifikata skadon brenda një jave.

SHËNIM. Kushtojini vëmendje përdorimit parseInt() në funksion kthimpër të kthyer numrin thyesor që rezulton nga ndarja e milisekondave në një numër të plotë. Ju gjithashtu mund të përdorni parseFloat () dhe ruani të dhëna fraksionale.

Shikoni raportin

Burimi: www.habr.com

Shto një koment