
Tihon Uskov, Zabbixi integreerimise meeskonna insener
Zabbix on kohandatav platvorm, mida kasutatakse igasuguste andmete jÀlgimiseks. Alates Zabbixi varasematest versioonidest on jÀlgimisadminsitratoritel olnud vÔimalus kÀivitada erinevaid skripte lÀbi Toimingud sihtvÔrkude sÔlmedes. Samas skriptide kÀivitamine tekitas mitmeid keerukusi, sealhulgas skriptide toetamise, nende edastamise sidepunkte ja proksisse, samuti erinevate versioonide toe.
Zabbixi jaoks JavaScript
Aprillis 2019 esitati Zabbix 4.2, mis sisaldas JavaScripti eelprotsessimisfunktsiooni. Paljud innustasid loobuma skriptide kirjutamisest, mis toovad andmeid, töötlevad neid ja esitlevad Zabbixile arusaadaval kujul. Selle asemel soovisid nad teostada lihtsaid kontrolle, mis saaksid Zabbixile töötlemiseks ja hoiustamiseks mittesobivaid andmeid ning seejĂ€rel neid Zabbixi ja JavaScripti abil töödelda. Koos madala taseme avastamise ja sĂ”ltuvate andmeelemenditega, mis ilmusid Zabbixis 3.4, saadi ĂŒsna paindlik kontseptsioon saadud andmete sorteerimiseks ja haldamiseks.
Zabbix 4.4-s ilmus loogilise jĂ€tkuna JavaScripti eelprotsessimisele uus teavitamise meetod â Webhook, mida saab kasutada Zabbixi teavituste lihtsaks integreerimiseks kolmandate osapoolte rakendustega.
JavaScript ja Duktape
Miks valiti just JavaScript ja Duktape? Kaalu all olid erinevad keelte ja mootori variandid:
- Lua â Lua 5.1
- Lua â LuaJIT
- JavaScript â Duktape
- JavaScript â JerryScript
- Sisseehitatud Python
- Sisseehitatud Perl
Peamised valikukriteeriumid olid levik, mootori lihtne integreerimine tootesse, madal ressursikasutus ning mootori ĂŒldine jĂ”udlus ja koodi turvalisus selle keele jĂ€lgimisse. KokkuvĂ”ttes vĂ”itis JavaScript Duktape mootoril.

Valikukriteeriumid ja jÔudlushindamine
Duktape omadused:
â Standard
â Zabbixi Duktape moodulid:
- Zabbix.log() â vĂ”imaldab kirjutada Zabbixi serveri logisse sĂ”numeid erineva detailsuse tasemega, mis vĂ”imaldab seostada vigu, nĂ€iteks Webhookis, serveri olekuga.
- CurlHttpRequest() â vĂ”imaldab teha HTTP-pĂ€ringuid vĂ”rgus, millel pĂ”hineb Webhooki rakendamine.
- atob() ja btoa() â vĂ”imaldab kodeerida ja dekodeerida stringe Base64 vormingusse.
MĂRKUS. Duktape vastab ACME standarditele. Zabbixis kasutatakse 2015. aasta skripti versiooni. Edasised muudatused on ebaolulised, seega vĂ”ib need ignoreerida..
JavaScripti maagia
Kogu JavaScripti maagia seisneb dĂŒnaamilises tĂŒpiseerimises ja tĂŒĂŒpide konverteerimises: stringidesse, numbriteks ja loogilisteks.
See tĂ€hendab, et muutujate tĂŒĂŒpi ei pea ette teatama.
Matemaatilistes operatsioonides konverteeritakse vÀÀrtused, mida operaator-funktsioonid tagastavad, numbriteks. Ainus erand on liitmine, kuna kui vĂ€hemalt ĂŒks liitja on string, rakendatakse kĂ”igile liitjatele stringi konverteerimist.
MĂRKUS. Meetodid, mis on vastutavad selliste konverteerimiste eest, on tavaliselt realiseeritud objektide vanemprototĂŒĂŒpides, valueOf ja toString. valueOf kutsutakse esile numbrilise konverteerimise korral ja alati enne meetodit toString. Meetod valueOf peab tagastama primitiivseid vÀÀrtusi, vastasel juhul ignoreeritakse selle tulemust.
Objekti jaoks kutsutakse ĂŒles meetod valueOF. Kui seda ei leita vĂ”i see ei tagasta primitiivset vÀÀrtust, kutsutakse esile meetod toString. Kui meetod toString ei leidu, otsitakse valueOf objekti prototĂŒĂŒbist ja kĂ”ik kordub, kuni vÀÀrtuse töötlemine ja kĂ”ikide vĂ€ljendis olevate vÀÀrtuste tĂŒĂŒpide konverteerimine on lĂ”petatud.. Kui objektil on realiseeritud meetod toString, mis tagastab primitiivse vÀÀrtuse, siis kasutatakse just seda stringi konverteerimiseks. Selle tulemusena ei pruugi selle meetodi rakendamise tulemus olla string.
NĂ€iteks, kui objektile âobjâ mÀÀratakse meetod toString,
`var obj = { toString() { return "200" }}` meetod toString tagastab tĂ€pselt stringi ja kui liidame stringi numbriga, saame ĂŒhendatud stringi:
`obj + 1 // '2001'`
`obj + 'a' // '200a'`Kuid kui me ĂŒmber kirjutame toString, et meetod tagastaks numbri, toimub objekti liitmisel matemaatiline operatsioon koos numbrilise konverteerimisega ja saame matemaatilise liitmise tulemuse.
`var obj = { toString() { return 200 }}`
`obj + 1 // '2001'`Sel juhul, kui me teeme liitmise stringiga, toimub stringi konverteerimine ja me saame ĂŒhendatud stringi.
`obj + 'a' // '200a'`Just selles peitub paljude JavaScripti algajate vigade pÔhjus.
Meetodisse toString vĂ”ib kirjutada funktsiooni, mis suurendab objekti praeguseid vÀÀrtusi ĂŒhe vĂ”rra.

Skripti tÀitmine, kui muutuja on 3 ja see on ka 4.
TĂŒĂŒpide vĂ”rdlemisel (==) rakendatakse iga kord meetodit toString vÀÀrtuse suurendamiseks. Seega suurendatakse vÀÀrtust iga jĂ€rgneva vĂ”rdlemisega. Seda saab vĂ€ltida, kasutades tĂŒĂŒpide vĂ”rdlemist ilma teisendamiseta (===).

TĂŒĂŒpide vĂ”rdlemine ilma teisendamiseta
MĂRKUS. Ărge kasutage tĂŒĂŒbi vĂ”rdlemist, vĂ€lja arvatud vajaduse korral.
Kompikad skriptid, nĂ€iteks Webhook koos keerulise loogikaga, kus tĂŒĂŒpide vĂ”rdlemine on vajalik, soovitatakse eelnevalt kirjutada kontrollid muutuja vÀÀrtuste jaoks ja kĂ€sitleda vastuolusid ja vigu.
Webhook Media
2019. aasta lÔpust ja 2020. aasta algusest tegeleb Zabbixi integreerimismeeskond Webhookide ja "vÀlja pakutud" integratsioonide aktiivse arendamisega, mis tarnitakse Zabbixi jaotises.

Link
Eeltöötlus
- JavaScripti eeltöötluse kohalolek on vÔimaldanud loobuda enamikest vÀlisest skriptist ning praegu on Zabbixis vÔimalik saada mistahes vÀÀrtus ja muuta see tÀiesti uueks vÀÀrtuseks.
- Zabbixis rakendatakse eeltöötlemist JavaScripti koodi abil, mis kompileerimise kĂ€igus muutub hĂŒbriidiks, mis vĂ”tab ĂŒhe vÀÀrtuse parameetrina. value siis stringina (stringis vĂ”ib olla nii number kui ka arv).
- Kuna vÀljundina saadakse funktsioon, on skripti lÔpus kohustuslik return.
- Kohandatud makrode kasutamine koodis on vÔimalik.
- Resursse saab piirata mitte ainult operatsioonisĂŒsteemi tasemel, vaid ka programmiliselt. Eeltöötlusetapil on maksimaalselt 10 megabaiti RAM-i ja 10-sekundiline tĂ€itmise piir.

MĂRKUS. 10-sekundilised ajaĂŒlemuse vÀÀrtused on ĂŒsna suured, kuna tingimuslike tuhandete andmeelementide kogumine 1 sekundi jooksul piisavalt "raske" eeltöötlusstsenaariumi jĂ€rgi vĂ”ib Zabbixi töötamise aeglustada. SeetĂ”ttu ei soovitata kasutada eeltöötlust tĂ€ielike JavaScripti skriptide tĂ€itmiseks nii-öelda nimetu andmeelemendiga (dummy items), mis kĂ€ivitatakse ainult eeltöötluse tegemiseks..
Kontrollige oma koodi eeltöötluse testi vÔi utiliidi abil. 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`
Praktilised ĂŒlesanded
Ălesanne 1
Asendada arvutatud andmeelement eelprotsessimisega.
Eeldus: saame andurist temperatuuri Fahrenheitis, et salvestada see Celsiusesse.
Varem oleksime loonud andmeelementi, mis kogub temperatuuri Fahrenheitis. PĂ€rast seda veel ĂŒhe andmeelementi (arvutatud), mis ĂŒmber arvutab Fahrenheitid Celsiuseks vastava valemi abil.
Probleemid:
- On vajalik duplikeerida andmeelemente ja salvestada kÔik vÀÀrtused andmebaasis.
- On oluline kooskÔlastada ajavahemikud "vanema" andmeelemendi jaoks, mis arvutatakse ja mida kasutatakse valemis, ning arvutatud andmeelemendi jaoks. Vastasel juhul vÔib arvutatud andmeelement sattuda toetamatusse olukorda vÔi lugeda eelmist vÀÀrtust, mis mÔjutab jÀlgimise tulemuste usaldusvÀÀrsust.
Ăhe lahendusena loobuti paindlike kontrollintervallide kasutamisest fikseeritud intervallide kasuks, et garanteerida arvutatud andmeelementide arvutamine andmeelementide pĂ€rast, mis andmeid koguvad (meie puhul - temperatuur Fahrenheitis).
Kuid kui nÀiteks mall, mida me kasutame paljude seadmete kontrollimiseks, ning kontroll toimub iga 30 sekundi jÀrel, siis 29 sekundit Zabbix "unustab" ning viimase sekundi jooksul algab kontrollide ja arvutamise tegemine. See viib jÀrjekorra tekkimiseni ja mÔjutab jÔudlust. SeetÔttu on soovitatav kasutada fikseeritud intervalle ainult siis, kui see on tÔeliselt vajalik.
KĂ€esolevas ĂŒlesandes on optimaalne lahendus ĂŒhe rea eelprotsessimine JavaScriptis, mis konverteerib Fahrenheitid Celsiuseks:
`return (value - 32) * 5 / 9;`See on kiire ja lihtne, ei ole vaja luua liigseid andmeelemente ja salvestada nende ajalugu, samuti saab kasutada paindlikke intervalle kontrollideks.

`return (parseInt(value) + parseInt("{$EXAMPLE.MACRO}"));`Kuid kui hĂŒpoteetilises olukorras on vajalik saadud andmeelement liita nĂ€iteks mĂ”ne makros mÀÀraatud konstanti, tuleb arvesse vĂ”tta, et parameeter value avatakse stringina. Stringide liitmise operatsiooni ajal lihtsalt ĂŒhendatakse kaks stringi ĂŒheks.

`return (value + "{$EXAMPLE.MACRO}");`Matemaatilise toimingu tulemuse saamiseks tuleb saavutada, et saadud vÀÀrtuste tĂŒĂŒbid oleksid numbrilises formaadis. Selleks saab kasutada funktsiooni parseInt(), mis tagastab tĂ€isarvu, funktsiooni parseFloat(), mis tagastab kĂŒmnendmurru, vĂ”i funktsiooni number, mis tagastab kas tĂ€isarvu vĂ”i kĂŒmnendmurru.
Ălesanne 2
Saada teada aeg sekundites seni, kuni sertifikaat kehtib.
Eeldus: mÔni teenus annab sertifikaadi lÔppkuupÀeva formaadis "Feb 12 12:33:56 2022 GMT".
ECMAScript 5 Date.parse() vĂ”tab vastu kuupĂ€eva ISO 8601 formaadis (AAAA-KK-PĂEVTHH:mm:ss.sssZ). On vajalik viia see sobivaks stringiks, mis on formaadis MMM DD AAAA HH:mm:ss ZZ
Probleem: kuu vÀÀrtus on esitatud tekstina, mitte numbrina. Selliseid andmeid ei aktsepteeri Duktape.
NĂ€ide lahendusest:
Esiteks kuulutatakse vÀlja muutuja, mis saab vÀÀrtuse (kogu skript koosneb muutuja deklareerimisest, mis on loetletud koma abil).
Esimeses reas saame kuupĂ€eva parameetrist value ja jagame selle tĂŒhikutega meetodi split. Nii saame massiivi, kus iga massiivi elemendile, alates indeksist 0, vastab ĂŒks kuupĂ€eva element enne ja pĂ€rast tĂŒhikut. split(0) â kuu, split(1) â pĂ€ev, split(2) â aeg ja nii edasi. PĂ€rast seda saab iga kuupĂ€eva elementi massiivis indeksiga juurde pÀÀseda.
`var split = value.split(' '),`- Iga kuule (kronoloogilises jĂ€rjekorras) vastab selle asukoha indeks massiivis (0-st 11-ni). TekstivÀÀrtuse konverteerimiseks numbriliseks liidetakse kuu indeksile ĂŒks (sest kuude nummerdamine algab 1-st). Sel juhul tuleb vĂ€ljend, kus liidetakse ĂŒks, panna sulgudesse, sest vastasel juhul saadakse string, mitte number. LĂ”pus esitame slice() â massiivi lĂ”ike lĂ”pust, et jĂ€tta ainult kaks sĂŒmbolit (mis on oluline kahe numbri kuude jaoks).
`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),`- Koostame saadud vÀÀrtustest stringi ISO formaadis, liites stringe Ôigesse jÀrjekorda.
`ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],`Saadud formaadis andmed representavad sekundite arvu 1970. aastast kuni mÔne tulevikus oleva hetkeni. Saadud formaadis andmete kasutamine kÀivitajates on praktiliselt vÔimatu, sest Zabbix lubab opereerida ainult makrodega {Date} ja {Time}, mis tagastavad kuupÀeva ja kellaaja arusaadavas kasutaja formaadis.
- PÀrast seda saame JavaScriptis saada praeguse kuupÀeva Unix Timestamp formaadis ja lahutada selle sertifikaadi lÔppkuupÀeva poolt saadud vÀÀrtusest, et saada millisekundid praegusest hetkest sertifikaadi lÔppkuupÀeva hetkeni.
`now = Date.now();`- Jagame saadud vÀÀrtuse tuhandega, et saada sekundeid Zabbixis.
`return parseInt((Date.parse(ISOdate) - now) / 1000);`Triggeris saab mÀÀrata vĂ€ljendi âlast<â ja numbrite kogumi, mis vastab sekundite arvule perioodis, millele tuleb reageerida, nĂ€iteks nĂ€dalates. Nii saad trigger teavitada, et sertifikaadi kehtivusaeg lĂ”peb nĂ€dala jooksul.
MĂRKUS. Pöörake tĂ€helepanu kasutamisele parseInt() funktsioonis return, et konverteerida jagamise tulemusena saadud murdarv tĂ€isarvuks. Saate kasutada ka parseFloat() ja salvestada murdarve.
Allikas: habr.com
