Praktilisi probleeme lahendame Zabbixis JavaScripti abil

Praktilisi probleeme lahendame Zabbixis JavaScripti abil
Tihhon Uskov, Zabbixi integratsioonimeeskonna insener

Zabbix on kohandatav platvorm, mida kasutatakse igasuguste andmete jälgimiseks. Alates Zabbixi varasematest versioonidest on jälgimisadministraatoritel olnud võimalus käivitada erinevaid skripte Meetmete sihtvõrgu sõlmede kontrollimiseks. Samal ajal tõi skriptide käivitamine kaasa mitmeid raskusi, sealhulgas vajadus skriptide toetamiseks, nende edastamine sidesõlmedesse ja puhverserveritesse, samuti erinevate versioonide tugi.

JavaScript Zabbixi jaoks

2019. aasta aprillis tutvustati Zabbix 4.2 JavaScripti eeltöötlusega. Paljud inimesed said vaimustuses mõttest loobuda skriptide kirjutamisest, mis viivad kuhugi andmeid, seedivad neid ja esitavad need Zabbixile arusaadavas vormingus ning teostavad lihtsaid kontrolle, mis võtavad vastu andmed, mis pole Zabbixi poolt salvestamiseks ja töötlemiseks valmis. seejärel töödelda seda andmevoogu Zabbixi ja JavaScripti tööriistade abil. Koos Zabbix 3.4-s ilmunud madala taseme avastamise ja sõltuvate üksustega saime vastuvõetud andmete sortimiseks ja haldamiseks üsna paindliku kontseptsiooni.

Zabbix 4.4-s on JavaScripti eeltöötluse loogilise jätkuna ilmunud uus teavitusmeetod - Webhook, mille abil saab hõlpsasti integreerida Zabbixi teateid kolmandate osapoolte rakendustega.

JavaScript ja Duktapes

Miks valiti JavaScript ja Duktape? Kaaluti erinevaid keelte ja mootorite valikuid:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript – Duktape
  • Javascript – JerryScript
  • Manustatud Python
  • Manustatud Perl

Peamised valikukriteeriumid olid levimus, mootori tootega integreerimise lihtsus, väike ressursikulu ja mootori üldine jõudlus ning selles keeles koodi jälgimisse sisseviimise ohutus. Indikaatorite kombinatsiooni põhjal võitis JavaScript Duktape'i mootoril.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil

Valikukriteeriumid ja jõudluse testimine

Duktape'i omadused:

- Standard ECMAScript E5/E5.1
— Zabbixi moodulid Duktape'i jaoks:

  • Zabbix.log() – võimaldab kirjutada erineva detailsusastmega sõnumeid otse Zabbixi serveri logisse, mis võimaldab näiteks veebihaagis esinevaid vigu serveri olekuga korreleerida.
  • CurlHttpRequest() – võimaldab teha võrku HTTP päringuid, millel põhineb Webhooki kasutamine.
  • atob() ja btoa() – võimaldab kodeerida ja dekodeerida stringe Base64 formaadis.

MÄRKUS. Duktape vastab ACME standarditele. Zabbix kasutab skripti 2015. aasta versiooni. Hilisemad muudatused on väikesed, seega võib neid ignoreerida..

JavaScripti maagia

JavaScripti kogu võlu peitub dünaamilises tippimises ja tüüpide ülekandmises: string, numbriline ja tõeväärtus.

See tähendab, et ei ole vaja eelnevalt deklareerida, mis tüüpi muutuja peaks väärtuse tagastama.

Matemaatilistes operatsioonides teisendatakse funktsioonioperaatorite poolt tagastatud väärtused numbriteks. Selliste toimingute erand on liitmine, sest kui vähemalt üks terminitest on string, rakendatakse stringi teisendust kõikidele terminitele.

MÄRKUS. Selliste teisenduste eest vastutavad meetodid rakendatakse tavaliselt objekti algprototüüpides, väärtus и toString. väärtus kutsutakse numbrilise teisendamise ajal ja alati enne meetodit toString. meetod väärtus peab tagastama primitiivsed väärtused, vastasel juhul ignoreeritakse selle tulemust.

Objektil kutsutakse välja meetod väärtus OF. Kui seda ei leita või see ei tagasta primitiivset väärtust, kutsutakse meetod välja toString. Kui meetod toString ei leitud, otsin väärtus objekti prototüübis ja kõike korratakse seni, kuni väärtuse töötlemine on lõppenud ja kõik avaldises olevad väärtused valatakse samasse tüüpi. Kui objekt rakendab meetodit toString, mis tagastab primitiivse väärtuse, siis seda kasutatakse stringi teisendamiseks. Selle meetodi rakendamise tulemus ei pruugi aga olla string.

Näiteks kui objekti jaoksobj' meetod on määratletud toString,

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

Meetod toString tagastab täpselt stringi ja numbriga stringi lisades saame liimitud stringi:

`obj + 1 // '2001'` 

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

Aga kui ümber kirjutada toString, nii et meetod tagastab arvu, objekti lisamisel sooritatakse arvuteisendusega matemaatiline tehe ja saadakse matemaatilise liitmise tulemus.

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

`obj + 1 // '2001'`

Sel juhul, kui sooritame stringiga liitmise, tehakse stringi teisendus ja saame liimitud stringi.

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

See on algajate JavaScripti kasutajate suure hulga vigade põhjuseks.

Meetod toString saate kirjutada funktsiooni, mis suurendab objekti praegust väärtust 1 võrra.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil
Skripti täitmine tingimusel, et muutuja on võrdne 3-ga ja see on samuti võrdne 4-ga.

Võrreldes castiga (==), rakendatakse meetodit iga kord toString väärtuse suurendamise funktsiooniga. Vastavalt sellele iga järgneva võrdlusega väärtus suureneb. Seda saab vältida, kasutades mittevalatud võrdlust (===).

Praktilisi probleeme lahendame Zabbixis JavaScripti abil
Võrdlus ilma tüübivaluta

MÄRKUS. Ärge kasutage castide võrdlust asjatult.

Keeruliste skriptide (nt keeruka loogikaga veebihaagide) puhul, mis nõuavad võrdlemist tüübi ülekandmisega, on soovitatav eelkirjutada kontrolle väärtuste jaoks, mis tagastavad muutujaid ning käsitlevad ebakõlasid ja vigu.

Veebihaagi meedia

2019. aasta lõpus ja 2020. aasta alguses on Zabbixi integratsioonimeeskond aktiivselt arendanud veebihaake ja valmisintegratsioone, mis on kaasas Zabbixi distributsiooniga.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil
Link saidile dokumentatsioon

Eeltöötlus

  • Eeltöötluse tulek JavaScriptis võimaldas enamikust välistest skriptidest loobuda ja praegu saab Zabbixis hankida mis tahes väärtuse ja teisendada selle täiesti erinevaks väärtuseks.
  • Eeltöötlust Zabbixis rakendab JavaScripti kood, mis baitkoodiks kompileerituna teisendatakse funktsiooniks, mis võtab parameetrina ühe väärtuse väärtus stringina (string võib sisaldada nii numbrit kui ka numbrit).
  • Kuna väljund on funktsioon, on skripti lõpp vajalik tagasipöördumine.
  • Koodis on võimalik kasutada kohandatud makrosid.
  • Ressursse saab piirata mitte ainult operatsioonisüsteemi tasemel, vaid ka programmiliselt. Eeltöötlusetapile eraldatakse maksimaalselt 10 megabaiti RAM-i ja tööaja limiit on 10 sekundit.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil

MÄRKUS. Ajalõpu väärtus 10 sekundit on päris palju, sest tingimuslike tuhandete andmeüksuste kogumine 1 sekundi jooksul üsna “raske” eeltöötlusstsenaariumi järgi võib Zabbixi tegevust aeglustada. Seetõttu ei ole soovitatav kasutada eeltöötlust täisväärtuslike JavaScripti skriptide käivitamiseks nn variandmeelementide (näivelemendid) kaudu, mida käivitatakse ainult eeltöötluse teostamiseks..

Saate oma koodi kontrollida eeltöötlustesti 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

Asendage arvutatud üksus eeltöötlusega.

Seisund: Hankige andurilt temperatuur Fahrenheitides, et salvestada Celsiuse kraadides.

Varem lõime üksuse, mis kogub temperatuuri Fahrenheiti kraadides. Pärast seda veel üks andmeüksus (arvutatud), mis teisendab valemi abil Fahrenheiti Celsiuse kraadideks.

Probleemid:

  • Andmeelemendid on vaja dubleerida ja kõik väärtused andmebaasi salvestada.
  • Peate kokku leppima valemis arvutatava ja kasutatava andmeüksuse "ema" ja arvutatud andmeüksuse intervallid. Vastasel juhul võib arvutatud üksus minna toetamata olekusse või arvutada eelmise väärtuse, mis mõjutab seiretulemuste usaldusväärsust.

Üks lahendus oli loobuda paindlikest kontrollintervallidest fikseeritud intervallide kasuks tagamaks, et arvutatud üksust hinnatakse pärast andmeid (meie puhul temperatuuri Fahrenheiti kraadides) vastuvõtvat üksust.

Aga kui me kasutame malli näiteks suure hulga seadmete kontrollimiseks ja kontrolli tehakse kord 30 sekundi jooksul, siis Zabbix "häkib" 29 sekundit ning viimasel sekundil hakkab kontrollima ja arvutama. See loob järjekorra ja mõjutab jõudlust. Seetõttu on soovitatav kasutada kindlaid intervalle ainult siis, kui see on tõesti vajalik.

Selle probleemi puhul on optimaalne lahendus üherealine JavaScripti eeltöötlus, mis teisendab Fahrenheiti kraadid Celsiuse kraadideks:

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

See on kiire ja lihtne, te ei pea looma tarbetuid andmeüksusi ja pidama nende kohta ajalugu, samuti saate kasutada kontrollimiseks paindlikke intervalle.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil

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

Kui aga hüpoteetilises olukorras on vaja vastuvõetud andmeelement lisada näiteks mis tahes makros määratletud konstandiga, tuleb arvestada, et parameeter väärtus laieneb stringiks. Stringide liitmise operatsioonis ühendatakse kaks stringi lihtsalt üheks.

Praktilisi probleeme lahendame Zabbixis JavaScripti abil

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

Matemaatilise toimingu tulemuse saamiseks on vaja saadud väärtuste tüübid teisendada numbrivormingusse. Selleks saate kasutada funktsiooni parseInt(), mis annab täisarvu, funktsiooni parseFloat(), mis annab kümnendkoha või funktsiooni number, mis tagastab täis- või kümnendarvu.

2. ülesanne

Hankige aeg sekundites sertifikaadi lõpuni.

Seisund: teenus väljastab sertifikaadi aegumiskuupäeva vormingus "12. veebruar 12:33:56 2022 GMT".

ECMAScript5-s date.parse() aktsepteerib kuupäeva ISO 8601 vormingus (AAAA-KK-PPTTH:mm:ss.sssZ). Sellele on vaja anda string vormingus MMM DD AAAA HH:mm:ss ZZ

probleem: kuu väärtust väljendatakse tekstina, mitte numbrina. Selles vormingus andmeid Duktape ei aktsepteeri.

Lahenduse näide:

  • Esiteks deklareeritakse muutuja, mis võtab väärtuse (kogu skript on muutujate deklaratsioon, mis on loetletud komadega eraldatuna).

  • Esimesel real saame parameetrisse kuupäeva väärtus ja eraldage see meetodi abil tühikutega jagada. Seega saame massiivi, kus igale massiivi elemendile, alates indeksist 0, vastab üks kuupäevaelement enne ja pärast tühikut. split (0) - kuu, split (1) - number, split (2) - string ajaga jne. Pärast seda saab igale kuupäeva elemendile juurde pääseda massiivi indeksiga.

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

  • Iga kuu (kronoloogilises järjekorras) vastab selle positsiooni indeksile massiivis (0 kuni 11). Tekstiväärtuse arvuliseks teisendamiseks lisatakse kuu indeksisse üks (kuna kuud on nummerdatud alates 1-st). Sel juhul võetakse ühe lisamisega avaldis sulgudes, sest muidu saadakse string, mitte arv. Lõpus teeme slice () - lõika massiiv otsast nii, et alles jääks ainult kaks märki (mis on kahekohalise numbri puhul oluline kuude puhul).

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

  • Saadud väärtustest moodustame stringi ISO-vormingus, lisades stringe tavapärases järjekorras.

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

Saadud vormingus olevad andmed on sekundite arv aastast 1970 kuni mingi hetkeni tulevikus. Vastuvõetud vormingus andmeid on päästikutes peaaegu võimatu kasutada, sest Zabbix võimaldab töötada ainult makrodega {Kuupäev} и {Aeg}, mis tagastavad kuupäeva ja kellaaja kasutajasõbralikus vormingus.

  • Seejärel saame saada praeguse kuupäeva JavaScriptis Unixi ajatempli vormingus ja lahutada selle saadud sertifikaadi aegumiskuupäevast, et saada millisekundite arv praegusest kuni sertifikaadi aegumiseni.

`now = Date.now();`

  • Jagame saadud väärtuse tuhandega, et saada sekundeid Zabbixis.

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

Päästikus saate määrata avaldise 'viimane', millele järgneb numbrite kogum, mis vastab sekundite arvule ajavahemikus, millele soovite vastata, näiteks nädalates. Seega annab päästik teada, et sertifikaat aegub nädala pärast.

MÄRKUS. Pöörake tähelepanu kasutamisele parseInt() funktsioonis tagasipöörduminemillisekundite jagamisel saadud murdarvu teisendamiseks täisarvuks. Võite ka kasutada parseFloat() ja salvestada murdosa andmeid.

Vaata aruannet

Allikas: www.habr.com

Lisa kommentaar