Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu
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.

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu

Valikukriteeriumid ja jÔudlushindamine

Duktape omadused:

— Standard ECMAScript E5/E5.1
— 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.

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu
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 (===).

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu
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.

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu
Link dokumentatsioon

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.

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu

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.

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu

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

Praktiliste probleemide lahendamine Zabbixi abil JavaScripti kaudu

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

Vaata ettekannet

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster