Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript
Tikhon Uskov, inxhinieri i ekipit të integrimit Zabbix

Zabbix është një platformë e personalizueshme që përdoret për monitorimin e çdo lloji të dhënash. Që nga versionet epara të Zabbix, administratorët e monitorimit kishin mundësinë të ekzekutonin skripte të ndryshme për Veprimet kontrollin e pikave të synuara të rrjetit. Në këtë mënyrë, ekzekutimi i skripteve shkaktonte një sërë vështirësish, duke përfshirë nevojën për mbështetje të skripteve, dërgimin e tyre në pika lidhjeje dhe proksi, si dhe mbështetje për versione të ndryshme.

JavaScript për Zabbix

Në prill 2019, Zabbix 4.2 u prezantua me funksionin e përpunimit paraprak me JavaScript. Shumë filluan të mendojnë për heqjen dorë nga shk Writing skripte që marrin të dhëna, i përpunojnë ato dhe i ofrojnë në një format të njohshëm për Zabbix, por për të kryer kontrolle të thjeshta që do të merrnin të dhëna që nuk janë gati për ruajtje dhe përpunim nga Zabbix, dhe më pas të përpunonin këtë rrjedhë të dhënash duke përdorur mjetet e Zabbix dhe JavaScript. Në lidhje me zbukurimin e zbulimit të nivelit të ulët dhe elementët e dhënash të varur, të cilët u shfaqën në Zabbix 3.4, rezultoi një koncept mjaft fleksibil për renditjen dhe menaxhimin e të dhënave të marrë.

NĂ« Zabbix 4.4, si njĂ« vazhdim logjik i pĂ«rpunimit paraprak me JavaScript, u shfaq njĂ« mĂ«nyrĂ« e re pĂ«r lajmĂ«rim — Webhook, qĂ« mund tĂ« pĂ«rdoret pĂ«r integrimin e thjeshtĂ« tĂ« lajmĂ«rimeve tĂ« Zabbix me aplikacione tĂ« palĂ«ve tĂ« treta.

JavaScript dhe Duktape

Pse u zgjodhën pikërisht JavaScript dhe Duktape? U shqyrtuan mundësi të ndryshme gjuhësh dhe motorësh:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript – Duktape
  • Javascript – JerryScript
  • Python i integruar
  • Perl i integruar

Kriteret kryesore për zgjedhjen ishin përhapja, lehtësia e integrimit të motorit në produkt, konsumimi i ulët i burimeve dhe performanca e përgjithshme e motorit, si dhe siguria e implementimit të kodit në këtë gjuhë në monitorim. Duke marrë parasysh të gjitha këto, JavaScript me motorin Duktape fitoi.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript

Kriteret e zgjedhjes dhe testimi i performancës

Karakteristikat e Duktape:

— Standardi ECMAScript E5/E5.1
— Modulet Zabbix pĂ«r Duktape:

  • Zabbix.log() — lejon tĂ« shkruani direkt nĂ« logun e Zabbix Server mesazhe me nivele tĂ« ndryshme tĂ« detajizimit, duke ofruar mundĂ«sinĂ« pĂ«r tĂ« krahasuar gabimet, pĂ«r shembull, nĂ« Webhook me gjendjen e serverit.
  • CurlHttpRequest() — lejon tĂ« bĂ«ni kĂ«rkesa HTTP nĂ« rrjet, mbi tĂ« cilin Ă«shtĂ« e ndĂ«rtuar pĂ«rdorimi i Webhook.
  • atob() dhe btoa() — lejon kodimin dhe dekodimin e vargjeve nĂ« formatin Base64.

VËREJTJE. Duktape i pĂ«rmbush standardet ACME. NĂ« Zabbix pĂ«rdoret versioni i skriptit nga viti 2015. Ndryshimet e mĂ«passhme janĂ« tĂ« parĂ«ndĂ«sishme, kĂ«shtu qĂ« mund tĂ« injorohen.

Magjia e JavaScript

E gjithë magia e JavaScript është në tipizimin dinamik dhe konvertimin e tipit: të dhënave string, numerike dhe logjike.

Kjo do të thotë se nuk është e nevojshme të shpallni paraprakisht se çfarë lloji variabël duhet të kthejë një vlerë.

Gjatë operacioneve matematikore, vlerat që kthehen nga operatorët-funksionet konvertohen në numra. Përjashtimi nga këto operacione është bashkimi, pasi nëse të paktën një nga përbërësit është një string, na përdoret konvertimi në string për të gjithë përbërësit.

VËREJTJE. Metodet qĂ« pĂ«rgjigjen pĂ«r kĂ«to konvertime zakonisht janĂ« tĂ« realizuara nĂ« prototipet prind tĂ« objekteve, valueOf dhe toString. valueOf thirret gjatĂ« konvertimit numerik dhe gjithmonĂ« para metodĂ«s toString. Metoda valueOf duhet tĂ« kthejĂ« vlera primitive, ndryshe rezultati i saj injorohet.

Për një objekt, thirret metoda valueOF. Nëse nuk gjendet ose nuk kthen një vlerë primitive, thirret metoda toString. Nëse metoda toString nuk gjendet, bëhet kërkesa valueOf në prototipin e objektit, dhe gjithçka përsëritet deri në përfundimin e përpunimit të vlerës dhe konvertimin e të gjitha vlerave në shprehje në një tip të vetëm. Nëse për objektin është realizuar metoda toString, e cila kthen një vlerë primitive, atëherë pikërisht ajo përdoret për konvertimin në string. Në këtë rast, rezultati i aplikimit të kësaj metode nuk është domosdoshmërisht një string.

PĂ«r shembull, nĂ«se pĂ«r objektin ‘obj‘ pĂ«rcaktohet metoda toString,

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

metoda toString kthen pikërisht një string, dhe gjatë bashkimit të stringut me një numër ne marrim një string të bashkuar:

`obj + 1 // '2001'` 

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

Por nëse e riparojmë toString, që të kthejë një numër, gjatë bashkimit të objektit do të kryhet një operacion matematikor me konvertimin numerik dhe rezultati do të jetë një bashkim matematikor.

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

`obj + 1 // '2001'`

Në këtë rast, nëse ne kryejmë bashkimin me një string, do të kryhet konvertimi në string dhe ne marrim një string të bashkuar.

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

Kjo është arsyeja pse ka shumë gabime nga përdoruesit fillestarë të JavaScript.

Në metodën toString mund të shkruhet një funksion që do të rrisë vlerën aktuale të objektit me 1.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript
Ekzekutimi i skriptit në kushte që ndryshore është e barabartë me 3 dhe ajo është gjithashtu e barabartë me 4.

Kur krahasohet me konvertimin e tipave (==) çdo herë ekzekutohet metoda toString me funksionin për rritjen e vlerës. Si rezultat, me çdo krahasim të mëtejshëm vlera rritet. Kjo mund të shmanget duke përdorur krahasimin pa konvertimin e tipave (===).

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript
Krahasimi pa konvertimin e tipave

VËREJTJE. Mos pĂ«rdorni krahasimin me konvertimin e tipave pa nevojĂ«.

Për skriptet e ndërlikuara, për shembull, Webhook me logjikë komplekse, ku nevojitet krahasimi me konvertimin e tipave, rekomandohet të shkruhen më parë verifikimet për vlerat që kthehen nga ndryshoret dhe të trajtohen papajtueshmëritë dhe gabimet.

Webhook Media

Në fund të vitit 2019 dhe në fillim të vitit 2020, ekipi i integrimit të Zabbix po merrej me zhvillimin aktiv të Webhooks dhe integrimeve "nga kutia", të cilat ofrohen në distribucionin e Zabbix.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript
Lidhja në dokumentacion

Paraprocesim

  • Shfaqja e paraprocesimit nĂ« JavaScript ka lejuar heqjen e shumicĂ«s sĂ« skripteve tĂ« jashtme, dhe tani nĂ« Zabbix mund tĂ« merrni çdo vlerĂ« dhe ta transformoni atĂ« nĂ« njĂ« vlerĂ« krejtĂ«sisht tjetĂ«r.
  • Paraprocesimi nĂ« Zabbix realizohet me kod nĂ« JavaScript, i cili gjatĂ« kompaktimit nĂ« byte-code shndĂ«rrohet nĂ« njĂ« funksion qĂ« merr njĂ« vlerĂ« tĂ« vetme si parameter vlera nĂ« formĂ«n e njĂ« string (nĂ« string mund tĂ« ketĂ« edhe numra dhe shifra).
  • Duke qenĂ« se nĂ« daljen merrni njĂ« funksion, nĂ« fund tĂ« skriptit Ă«shtĂ« e detyrueshme return.
  • PĂ«rdorimi i makrosave tĂ« personalizuara nĂ« kod Ă«shtĂ« i mundur.
  • Burimet mund tĂ« kufizohen jo vetĂ«m nĂ« nivelin e sistemit operativ, por gjithashtu programatikisht. PĂ«r hapin e paraprocesimit, ndahen maksimum 10 megabajt memorie operative dhe njĂ« limit tĂ« kohĂ«s sĂ« ekzekutimit prej 10 sekondash.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript

VËREJTJE. Vlerat e kohĂ«s sĂ« skadimit prej 10 sekondash janĂ« mjaft tĂ« mjaftueshme, sepse mbledhja e mijĂ«ra elementeve tĂ« dhĂ«nash nĂ« 1 sekondĂ« pĂ«r njĂ« skenar paraprocesimi mjaft "tĂ« rĂ«ndĂ«" mund tĂ« ngadalĂ«sojĂ« funksionimin e Zabbix. Prandaj nuk rekomandohet pĂ«rdorimi i paraprocesimit pĂ«r ekzekutimin e skripteve tĂ« plota nĂ« JavaScript pĂ«rmes ashtuquajturave elementeve tĂ« dhĂ«nash "dummy", tĂ« cilat aktivizohen vetĂ«m pĂ«r tĂ« kryer paraprocesimin..

Mund të kontrolloni kodin tuaj përmes testit të paraprocesimit ose me ndihmën e utilitarit. 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`

Detyrat praktike

Detyra 1

Zëvendësoni elementin e dhënë të të dhënave me para-përpunim.

Kushti: marrim temperaturën nga sensorët në gradë Fahrenheit për ta ruajtur atë në gradë Celsius.

MĂ« parĂ«, do tĂ« kemi krijuar njĂ« element tĂ« dhĂ«nash qĂ« merr temperaturĂ«n nĂ« gradĂ« Fahrenheit. MĂ« pas — njĂ« tjetĂ«r element tĂ« dhĂ«nash (tĂ« pĂ«rllogaritur) qĂ«, pĂ«rmes njĂ« formule, do ta kthenim gradĂ«n Fahrenheit nĂ« gradĂ« Celsius.

Problemet:

  • ËshtĂ« e nevojshme tĂ« dyfishohen elementet e tĂ« dhĂ«nave dhe tĂ« ruhet tĂ« gjitha vlerat nĂ« bazĂ«.
  • Duhet tĂ« koordinohen intervalet pĂ«r elementin e 'prindit' tĂ« tĂ« dhĂ«nave, i cili llogaritet dhe pĂ«rdoret nĂ« formulĂ«, dhe pĂ«r elementin e dhĂ«nash tĂ« pĂ«rllogaritur. Ndryshe, elementi i dhĂ«nash tĂ« pĂ«rllogaritur mund tĂ« kalojĂ« nĂ« njĂ« gjendje tĂ« papĂ«rkrahur ose tĂ« llogarisĂ« vlerĂ«n e mĂ«parshme, gjĂ« qĂ« do tĂ« ndikojĂ« nĂ« besueshmĂ«rinĂ« e rezultateve tĂ« monitorimit.

NjĂ« nga zgjidhjet ishte braktisja e intervaleve fleksibile tĂ« kontrollit nĂ« favor tĂ« intervaleve fikse, pĂ«r tĂ« garantuar llogaritjen e elementit tĂ« dhĂ«nash tĂ« pĂ«rllogaritur pas elementit tĂ« dhĂ«nash qĂ« merr tĂ« dhĂ«nat (nĂ« rastin tonĂ« — temperatura nĂ« gradĂ« Fahrenheit).

Por, nĂ«se, pĂ«r shembull, ne pĂ«rdorim njĂ« shabllon pĂ«r tĂ« kontrolluar shumĂ« pajisje dhe kontrolli bĂ«het çdo 30 sekonda, 29 sekonda Zabbix ‘punon nĂ« mĂ«nyrĂ« pasive’, dhe nĂ« sekondĂ«n e fundit fillon kontrolli dhe llogaritjet. Kjo çon nĂ« krijimin e njĂ« radhe dhe ndikon nĂ« performancĂ«n. Prandaj, rekomandohet qĂ« tĂ« pĂ«rdoren intervale fikse, vetĂ«m nĂ«se Ă«shtĂ« vĂ«rtet e nevojshme.

Në këtë detyrë, zgjidhja optimale është para-përpunimi nga një varg në JavaScript, i cili konverton gradët Fahrenheit në gradë Celsius:

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

Kjo është e shpejtë dhe e thjeshtë, nuk ka nevojë të krijoni elemente të tjera të dhënash dhe të ruani historinë e tyre, gjithashtu mund të përdoren intervale fleksibile për kontroll.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript

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

Por, nëse në një situatë hipotezike kemi nevojë të bashkojmë elementin e dhënash të marrë, për shembull, me ndonjë konstantë të përcaktuar në makro, është e nevojshme të kishim parasysh se parametri vlera shkruhet në një varg. Kur kryhet operacioni i mbledhjes së vargjeve, dy vargje thjesht bashkohen në një.

Zgjidhim detyra praktike në Zabbix me ndihmën e JavaScript

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

Për të marrë rezultatet e veprimeve matematikore, është e nevojshme të shndërrohen tipet e vlerave të marra në format numri. Për këtë, mund të përdoret funksioni parseInt(), i cili jep një numër të tërë, funksioni parseFloat(), i cili jep një numër me thyesa, ose funksioni number, i cili jep një numër të tërë ose me thyesa.

Detyra 2

Merrni kohën në sekonda deri në skadimin e certifikatës.

Kushti: një shërbim i caktuar jep datën e skadimit të certifikatës në formatin "Feb 12 12:33:56 2022 GMT".

NĂ« ECMAScript5 Date.parse() pranon datĂ«n nĂ« formatin ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). ËshtĂ« e nevojshme ta shndĂ«rroni atĂ« nĂ« njĂ« varg nĂ« formatin MMM DD YYYY HH:mm:ss ZZ

Problemi: vlera e muajit është shprehur me tekst, jo me numra. Të dhënat në këtë format nuk pranohen nga Duktape.

Shembulli i zgjidhjes:

  • SĂ« pari shpallet njĂ« variabĂ«l, e cila merr vlerĂ«n (i gjithĂ« skripti — shpallje variabelesh, tĂ« cilat janĂ« tĂ« renditura pĂ«rmes presjes).

  • NĂ« rreshtin e parĂ« marrim datĂ«n nĂ« parametrin vlera dhe e ndajmĂ« me hapĂ«sira me metodĂ«n split. KĂ«shtu, marrim njĂ« array, ku çdo element i array-t, duke filluar nga indeksi 0, pĂ«rkon me njĂ« element tĂ« datĂ«s para dhe pas hapĂ«sirĂ«s. split(0) — muaji, split(1) — numri, split(2) — njĂ« varg me kohĂ«n, etj. Pas kĂ«saj, çdo element tĂ« datĂ«s mund tĂ« adresohet sipas indeksit nĂ« array.

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

  • Çdo muaji (nĂ« rend kronologjik) i pĂ«rket indeksi i pozicionit tĂ« tij nĂ« array (nga 0 deri nĂ« 11). PĂ«r ta konvertuar vlerĂ«n tekstuale nĂ« numerike, i shtohet njĂ« njĂ«si indeksit tĂ« muajit (pĂ«r shkak se numĂ«rimi i muajve fillon nga 1). NĂ« kĂ«tĂ« rast, shprehja me shtimin e njĂ« njĂ«si Ă«shtĂ« marrĂ« nĂ« kllapa, sepse nĂ« rastin tjetĂ«r do tĂ« merret njĂ« varg, jo njĂ« numĂ«r. NĂ« fund, ne realizojmĂ« slice() — njĂ« prerje e array-t nga fundi, pĂ«r tĂ« lĂ«nĂ« vetĂ«m dy simbole (çfarĂ« Ă«shtĂ« e rĂ«ndĂ«sishme pĂ«r muajt me 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),`

  • FormojmĂ« nga vlerat e marra njĂ« varg nĂ« formatin ISO me shumimin e vargjeve nĂ« rendin pĂ«rkatĂ«s.

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

Të dhënat në formatin e marrë janë numri i sekondave nga viti 1970 deri në një moment të caktuar në të ardhmen. Të përdorësh të dhënat në formatin e marrë në triggers është praktikisht e pamundur, sepse Zabbix lejon të operohet vetëm me makros {Date} dhe {Time}, që kthejnë datën dhe orën në një format të kuptueshëm për përdoruesin.

  • Pas kĂ«saj, ne mund tĂ« marrim nĂ« JavaScript datĂ«n aktuale nĂ« formatin Unix Timestamp dhe ta heqim atĂ« nga vlera e datĂ«s sĂ« skadimit tĂ« certifikatĂ«s, pĂ«r tĂ« marrĂ« numrin e milisekondave nga momenti aktual deri nĂ« momentin e skadimit tĂ« certifikatĂ«s.

`now = Date.now();`

  • E ndajmĂ« vlerĂ«n e marrĂ« me njĂ« mijĂ«, pĂ«r tĂ« marrĂ« sekondat nĂ« Zabbix.

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

NĂ« trigger mund tĂ« specifikohet shprehja ‘last<‘ dhe njĂ« grup numrash, qĂ« i pĂ«rkasojnĂ« numrit tĂ« sekondave nĂ« periudhĂ«n pĂ«r tĂ« cilĂ«n duhet tĂ« reagon, pĂ«r shembull, nĂ« javĂ«. NĂ« kĂ«tĂ« mĂ«nyrĂ«, trigger do tĂ« njoftojĂ« se afati i vlefshmĂ«risĂ« sĂ« certifikatĂ«s skadon brenda njĂ« jave.

VËREJTJE. Kujdesi nĂ« pĂ«rdorimin e parseInt() nĂ« funksionin return, pĂ«r tĂ« konvertuar numrin fraksionar tĂ« marrĂ« nga ndarja e milisekondave nĂ« njĂ« numĂ«r tĂ« plotĂ«. Mund tĂ« pĂ«rdoret gjithashtu parseFloat() dhe pĂ«r tĂ« ruajtur tĂ« dhĂ«na fraksionare..

Shiko raportin

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster