
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.

Kriteret e zgjedhjes dhe testimi i performancës
Karakteristikat e Duktape:
â Standardi
â 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.

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 (===).

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.

Lidhja në
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.

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.

`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ë.

`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..
Burimi: habr.com
