Praktines Zabbix problemas sprendžiame naudodami JavaScript

Praktines Zabbix problemas sprendžiame naudodami JavaScript
Tikhonas Uskovas, Zabbix integracijos komandos inžinierius

„Zabbix“ yra tinkinama platforma, naudojama bet kokio tipo duomenims stebėti. Nuo pat ankstyviausių „Zabbix“ versijų stebėjimo administratoriai turėjo galimybę paleisti įvairius scenarijus Veiksmai tikslinių tinklo mazgų patikrinimams. Tuo pačiu metu scenarijų paleidimas sukėlė daugybę sunkumų, įskaitant poreikį palaikyti scenarijus, jų pristatymą į ryšio mazgus ir tarpinius serverius, taip pat įvairių versijų palaikymą.

„JavaScript“, skirta „Zabbix“.

2019 m. balandžio mėn. buvo pristatyta „Zabbix 4.2“ su „JavaScript“ išankstiniu apdorojimu. Daugelis žmonių susižavėjo idėja atsisakyti rašyti scenarijus, kurie kažkur nuneša duomenis, juos suvirškina ir pateikia Zabbix suprantamu formatu ir atlieka paprastus patikrinimus, kurie gaus duomenis, kurie nėra paruošti saugoti ir apdoroti Zabbix. tada apdorokite šį duomenų srautą naudodami „Zabbix“ ir „JavaScript“ įrankius. Kartu su žemo lygio atradimu ir priklausomais elementais, kurie pasirodė Zabbix 3.4 versijoje, gavome gana lanksčią gautų duomenų rūšiavimo ir valdymo koncepciją.

„Zabbix 4.4“, kaip logiškas išankstinio apdorojimo „JavaScript“ tęsinys, atsirado naujas pranešimų metodas - „Webhook“, kurį galima naudoti norint lengvai integruoti „Zabbix“ pranešimus su trečiųjų šalių programomis.

JavaScript ir Duktapes

Kodėl buvo pasirinktas „JavaScript“ ir „Duktape“? Buvo svarstomi įvairūs kalbų ir variklių variantai:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript – Duktape
  • Javascript – JerryScript
  • Įterptas Python
  • Įterptasis Perl

Pagrindiniai atrankos kriterijai buvo paplitimas, variklio integravimo į gaminį paprastumas, mažos resursų sąnaudos ir bendras variklio veikimas bei kodo įvedimo šia kalba į stebėjimą saugumas. Remiantis rodiklių deriniu, „Duktape“ variklyje laimėjo „JavaScript“.

Praktines Zabbix problemas sprendžiame naudodami JavaScript

Atrankos kriterijai ir veikimo patikrinimas

Duktape savybės:

– Standartinis ECMAScript E5/E5.1
— Zabbix moduliai, skirti Duktape:

  • Zabbix.log() – leidžia rašyti įvairaus detalumo pranešimus tiesiai į „Zabbix Server“ žurnalą, o tai leidžia susieti klaidas, pavyzdžiui, „Webhook“ su serverio būsena.
  • CurlHttpRequest() – leidžia pateikti HTTP užklausas tinklui, kuriuo grindžiamas Webhook naudojimas.
  • atob() ir btoa() – leidžia užkoduoti ir iššifruoti eilutes Base64 formatu.

PASTABA. Duktape atitinka ACME standartus. „Zabbix“ naudoja 2015 m. scenarijaus versiją. Vėlesni pakeitimai yra nedideli, todėl juos galima ignoruoti..

„JavaScript“ magija

Visa „JavaScript“ magija slypi dinamiškame spausdinime ir tipo perdavime: eilutės, skaitiniai ir loginiai.

Tai reiškia, kad nebūtina iš anksto deklaruoti, kokio tipo kintamasis turi grąžinti reikšmę.

Atliekant matematinius veiksmus, funkcijų operatorių grąžintos reikšmės konvertuojamos į skaičius. Tokių operacijų išimtis yra pridėjimas, nes jei bent vienas iš terminų yra eilutė, eilutės konvertavimas taikomas visiems terminams.

PASTABA. Metodai, atsakingi už tokias transformacijas, paprastai yra įdiegti pirminiuose objekto prototipuose, vertė и toString. vertė iškviečiamas skaitinio konvertavimo metu ir visada prieš metodą toString. Metodas vertė turi grąžinti primityvias reikšmes, kitaip jo rezultatas bus ignoruojamas.

Objekte iškviečiamas metodas vertė. Jei jis nerastas arba negrąžina primityvios reikšmės, iškviečiamas metodas toString. Jei metodas toString nerasta, ieškoma vertė objekto prototipe ir viskas kartojama tol, kol baigsis reikšmės apdorojimas ir visos išraiškos reikšmės bus perkeltos į tą patį tipą. Jei objektas įgyvendina metodą toString, kuri grąžina primityvią reikšmę, tada ji naudojama eilutės konvertavimui. Tačiau šio metodo taikymo rezultatas nebūtinai yra eilutė.

Pavyzdžiui, jei už objektą "Objektas' metodas yra apibrėžtas toString,

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

Metodas toString grąžina tiksliai eilutę, o pridėjus eilutę su skaičiumi gauname suklijuotą eilutę:

`obj + 1 // '2001'` 

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

Bet jei perrašysi toString, kad metodas grąžintų skaičių, pridėjus objektą bus atlikta matematinė operacija su skaitine konversija ir gautas matematinio sudėjimo rezultatas.

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

`obj + 1 // '2001'`

Tokiu atveju, jei atliekame sudėjimą su eilute, atliekamas eilutės konvertavimas ir gauname suklijuotą eilutę.

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

Tai yra daugelio pradedančiųjų JavaScript naudotojų klaidų priežastis.

Metodas toString galite parašyti funkciją, kuri padidins esamą objekto reikšmę 1.

Praktines Zabbix problemas sprendžiame naudodami JavaScript
Scenarijaus vykdymas, jei kintamasis lygus 3, taip pat lygus 4.

Lyginant su metimu (==), metodas vykdomas kiekvieną kartą toString su vertės didinimo funkcija. Atitinkamai, su kiekvienu paskesniu palyginimu, vertė didėja. To galima išvengti naudojant nelietinį palyginimą (===).

Praktines Zabbix problemas sprendžiame naudodami JavaScript
Palyginimas be tipo liejimo

PASTABA. Be reikalo nenaudokite aktų palyginimo.

Sudėtingiems scenarijams, pvz., „Webhooks“ su sudėtinga logika, kuriuos reikia palyginti su tipo liejimu, rekomenduojama iš anksto parašyti verčių, kurios grąžina kintamuosius ir tvarko neatitikimus bei klaidas, patikras.

Webhook Media

2019 m. pabaigoje ir 2020 m. pradžioje „Zabbix“ integravimo komanda aktyviai kūrė „Webhooks“ ir „out-of-the-box“ integracijas, kurios pateikiamos kartu su „Zabbix“ paskirstymu.

Praktines Zabbix problemas sprendžiame naudodami JavaScript
Nuoroda į dokumentacija

Išankstinis apdorojimas

  • „JavaScript“ išankstinio apdorojimo atsiradimas leido atsisakyti daugumos išorinių scenarijų, o šiuo metu „Zabbix“ galite gauti bet kokią vertę ir konvertuoti ją į visiškai kitą vertę.
  • Išankstinis apdorojimas „Zabbix“ yra įgyvendinamas JavaScript kodu, kuris, sukompiliuotas į baitinį kodą, paverčiamas funkcija, kuri kaip parametras paima vieną reikšmę kainas kaip eilutę (eilutė gali turėti ir skaitmenį, ir skaičių).
  • Kadangi išvestis yra funkcija, scenarijaus pabaigoje būtina grįžti.
  • Kode galima naudoti pasirinktines makrokomandas.
  • Ištekliai gali būti ribojami ne tik operacinės sistemos lygiu, bet ir programiškai. Išankstinio apdorojimo žingsniui skiriama ne daugiau kaip 10 megabaitų RAM ir 10 sekundžių trukmės riba.

Praktines Zabbix problemas sprendžiame naudodami JavaScript

PASTABA. 10 sekundžių skirtojo laiko reikšmė yra gana didelė, nes sąlyginių tūkstančių duomenų elementų surinkimas per 1 sekundę pagal gana „sunkų“ išankstinio apdorojimo scenarijų gali sulėtinti „Zabbix“. Todėl nerekomenduojama naudoti išankstinio apdorojimo norint vykdyti visaverčius JavaScript scenarijus per vadinamuosius šešėlinių duomenų elementus (fiktyviuosius elementus), kurie paleidžiami tik išankstiniam apdorojimui atlikti..

Kodą galite patikrinti atlikdami išankstinio apdorojimo testą arba naudodami programą 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`

Praktinės užduotys

Užduotis 1

Pakeiskite apskaičiuotą elementą išankstiniu apdorojimu.

Būklė: Iš jutiklio gaukite temperatūrą Farenheito laipsniais ir saugokite Celsijaus.

Anksčiau mes kurdavome elementą, kuris renka temperatūrą Farenheito laipsniais. Po to kitas duomenų elementas (apskaičiuotas), kuris pagal formulę konvertuotų Farenheitą į Celsijų.

Problemos:

  • Būtina dubliuoti duomenų elementus ir saugoti visas reikšmes duomenų bazėje.
  • Turite susitarti dėl skaičiuojamo ir formulėje naudojamo „pirminio“ duomenų elemento ir skaičiuojamo duomenų elemento intervalų. Priešingu atveju apskaičiuotas elementas gali pereiti į nepalaikomą būseną arba apskaičiuoti ankstesnę vertę, o tai turės įtakos stebėjimo rezultatų patikimumui.

Vienas iš sprendimų buvo atsisakyti lanksčių tikrinimo intervalų ir naudoti fiksuotus intervalus, siekiant užtikrinti, kad apskaičiuotas elementas būtų įvertintas po elemento, kuris gauna duomenis (mūsų atveju temperatūra Farenheito laipsniais).

Bet jei, pavyzdžiui, šablonu tikriname daugybę įrenginių, o patikrinimas atliekamas kartą per 30 sekundžių, Zabbix „nulaužia“ 29 sekundes, o paskutinę sekundę pradeda tikrinti ir skaičiuoti. Tai sukuria eilę ir turi įtakos našumui. Todėl fiksuotus intervalus rekomenduojama naudoti tik tada, kai tai tikrai būtina.

Šios problemos optimalus sprendimas yra vienos eilutės „JavaScript“ išankstinis apdorojimas, kuris paverčia Farenheito laipsnius į Celsijaus laipsnius:

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

Tai greita ir paprasta, jums nereikia kurti nereikalingų duomenų elementų ir saugoti jų istorijos, taip pat galite naudoti lanksčius patikrų intervalus.

Praktines Zabbix problemas sprendžiame naudodami JavaScript

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

Bet jei hipotetinėje situacijoje reikia pridėti gautą duomenų elementą, pavyzdžiui, su bet kuria makrokomandoje apibrėžta konstanta, reikia atsižvelgti į tai, kad parametras kainas išsiplečia į eilutę. Atliekant eilučių pridėjimo operaciją, dvi eilutės tiesiog sujungiamos į vieną.

Praktines Zabbix problemas sprendžiame naudodami JavaScript

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

Norint gauti matematinės operacijos rezultatą, gautų reikšmių tipus reikia konvertuoti į skaitmeninį formatą. Tam galite naudoti funkciją parseInt(), kuris sukuria sveikąjį skaičių, funkciją parseFloat(), kuris sukuria dešimtainį skaičių arba funkciją skaičius, kuris grąžina sveikąjį arba dešimtainį skaičių.

2 užduotis

Gaukite laiką sekundėmis iki sertifikato pabaigos.

Būklė: paslauga išduoda sertifikato galiojimo pabaigos datą formatu „Vasario 12 d. 12:33:56 2022 GMT“.

ECMAScript5 date.parse() priima datą ISO 8601 formatu (YYYY-MM-DDTHH:mm:ss.sssZ). Į jį reikia įvesti eilutę formatu MMM DD YYYY HH:mm:ss ZZ

problema: mėnesio reikšmė išreiškiama kaip tekstas, o ne kaip skaičius. Duktape nepriima tokio formato duomenų.

Sprendimo pavyzdys:

  • Visų pirma, deklaruojamas kintamasis, kuris įgauna reikšmę (visas scenarijus yra kintamųjų, kurie išvardyti atskirti kableliais, deklaracija).

  • Pirmoje eilutėje mes gauname datą parametre kainas ir atskirkite jį tarpais naudodami metodą skilimas. Taigi gauname masyvą, kuriame kiekvienas masyvo elementas, pradedant indeksu 0, atitinka vieną datos elementą prieš ir po tarpo. padalinti (0) - mėnuo, padalinti (1) - numeris, padalinti (2) - eilutė su laiku ir tt Po to kiekvieną datos elementą galima pasiekti masyvo indeksu.

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

  • Kiekvienas mėnuo (chronologine tvarka) atitinka jo pozicijos masyve indeksą (nuo 0 iki 11). Norint konvertuoti teksto reikšmę į skaitinę reikšmę, viena pridedama prie mėnesio indekso (nes mėnesiai numeruojami pradedant nuo 1). Šiuo atveju išraiška, pridėjus vienetą, imama skliausteliuose, nes kitaip bus gauta eilutė, o ne skaičius. Pabaigoje mes darome gabalas () - iškirpkite masyvą nuo galo, kad liktų tik du simboliai (tai svarbu mėnesiams su dviženkliu skaičiumi).

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

  • Iš gautų reikšmių įprastu eilučių pridėjimu atitinkama tvarka suformuojame eilutę ISO formatu.

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

Gauto formato duomenys yra sekundžių skaičius nuo 1970 m. iki tam tikro momento ateityje. Gauto formato duomenų naudoti trigeriuose beveik neįmanoma, nes Zabbix leidžia dirbti tik su makrokomandomis {Data} и {Laikas}, kurie pateikia datą ir laiką patogiu formatu.

  • Tada galime gauti dabartinę datą JavaScript Unix Timestamp formatu ir atimti ją iš gautos sertifikato galiojimo datos, kad gautume milisekundžių skaičių nuo dabar iki sertifikato galiojimo pabaigos.

`now = Date.now();`

  • Gautą vertę padaliname iš tūkstančio, kad gautume sekundes Zabbix.

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

Trigeryje galite nurodyti išraišką „paskutinis“, po kurio seka skaitmenų rinkinys, atitinkantis sekundžių skaičių per laikotarpį, į kurį norite atsakyti, pavyzdžiui, savaitėmis. Taigi aktyviklis praneš, kad sertifikato galiojimas baigiasi po savaitės.

PASTABA. Atkreipkite dėmesį į naudojimą parseInt() funkcijoje grįžtitrupmeninį skaičių, gautą padalijus milisekundes, paversti sveikuoju skaičiumi. Taip pat galite naudoti parseFloat() ir saugoti trupmeninius duomenis.

Žiūrėti reportažą

Šaltinis: www.habr.com

Добавить комментарий