V Zabbixu rešujemo praktične probleme z uporabo JavaScripta

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta
Tihon Uskov, inženir ekipe za integracijo Zabbix

Zabbix je prilagodljiva platforma, ki se uporablja za spremljanje vseh vrst podatkov. Od najzgodnejših različic Zabbixa so skrbniki za spremljanje imeli možnost zagnati različne skripte prek Proces za preglede ciljnih omrežnih vozlišč. Hkrati je uvedba skriptov privedla do številnih težav, vključno s potrebo po podpori skriptov, njihove dostave komunikacijskim vozliščem in posrednikom ter podpore za različne različice.

JavaScript za Zabbix

Aprila 2019 je bil predstavljen Zabbix 4.2 s predprocesiranjem JavaScript. Veliko ljudi se je navdušilo nad idejo o opustitvi pisanja skriptov, ki nekam vzamejo podatke, jih prebavijo in posredujejo v formatu, ki ga Zabbix razume, ter izvedejo preprosta preverjanja, ki bodo prejela podatke, ki niso pripravljeni za shranjevanje in obdelavo s strani Zabbixa, in nato obdelajte ta tok podatkov z orodji Zabbix in JavaScript. V povezavi z nizkonivojskim odkrivanjem in odvisnimi elementi, ki so se pojavili v Zabbixu 3.4, smo dobili dokaj prilagodljiv koncept za razvrščanje in upravljanje prejetih podatkov.

V Zabbix 4.4 se je kot logično nadaljevanje predprocesiranja v JavaScriptu pojavil nov način obveščanja - Webhook, s katerim je mogoče enostavno integrirati Zabbix obvestila z aplikacijami tretjih oseb.

JavaScript in Duktapes

Zakaj sta bila izbrana JavaScript in Duktape? Upoštevane so bile različne možnosti za jezike in motorje:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • Javascript - Duktape
  • Javascript – JerryScript
  • Vdelan Python
  • Vgrajen Perl

Glavni kriteriji za izbor so bili razširjenost, enostavnost integracije motorja v izdelek, nizka poraba virov in splošna zmogljivost motorja ter varnost vnosa kode v tem jeziku v spremljanje. Na podlagi kombinacije indikatorjev je JavaScript zmagal na motorju Duktape.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta

Izbirna merila in testiranje delovanja

Lastnosti Duktape:

— Standardno ECMAScript E5/E5.1
- Moduli Zabbix za Duktape:

  • Zabbix.log() - omogoča pisanje sporočil z različnimi stopnjami podrobnosti neposredno v dnevnik strežnika Zabbix, kar omogoča povezovanje napak, na primer v Webhooku, s stanjem strežnika.
  • CurlHttpRequest() - omogoča pošiljanje HTTP zahtevkov v omrežje, na katerih temelji uporaba Webhooka.
  • atob() in btoa() - omogočata kodiranje in dekodiranje nizov v formatu Base64.

OPOMBA. Duktape ustreza standardom ACME. Zabbix uporablja različico skripta iz leta 2015. Naknadne spremembe so manjše, zato jih lahko prezremo..

čarovnija JavaScripta

Vsa čarovnija JavaScripta je v dinamičnem tipkanju in pretvorbi tipov: nizov, števil in logičnih vrednosti.

To pomeni, da ni treba vnaprej navesti, kateri tip naj spremenljivka vrne vrednost.

Pri matematičnih operacijah se vrednosti, ki jih vrnejo funkcijski operaterji, pretvorijo v števila. Izjema pri takšnih operacijah je seštevanje, ker če je vsaj eden od izrazov niz, se pretvorba niza uporabi za vse izraze.

OPOMBA. Metode, odgovorne za takšne transformacije, so običajno implementirane v nadrejene prototipe objekta, vrednostOf и toString. vrednostOf poklican med numerično pretvorbo in vedno pred metodo toString... Metoda vrednostOf mora vrniti primitivne vrednosti, sicer se rezultat prezre.

Metoda se kliče na objektu valueOF. Če ni najdena ali ne vrne primitivne vrednosti, se metoda pokliče toString. Če metoda toString ni najden, iščem vrednostOf v prototipu predmeta in vse se ponavlja, dokler obdelava vrednosti ni končana in vse vrednosti v izrazu niso uvrščene v isti tip. Če predmet implementira metodo toString, ki vrne primitivno vrednost, potem je ta uporabljena za pretvorbo nizov. Vendar pa rezultat uporabe te metode ni nujno niz.

Na primer, če za za objekt 'obj' metoda je definirana toString,

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

Metoda toString vrne točno niz, pri dodajanju niza s številko pa dobimo zlepljen niz:

`obj + 1 // '2001'` 

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

Če pa prepišeš toString, tako da metoda vrne število, ko je predmet seštevan, bo izvedena matematična operacija z numerično pretvorbo in rezultat matematičnega seštevanja.

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

`obj + 1 // '2001'`

Če v tem primeru izvedemo seštevanje z nizom, se izvede pretvorba niza in dobimo zlepljen niz.

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

To je razlog za veliko število napak začetnikov JavaScript uporabnikov.

Metoda toString lahko napišete funkcijo, ki bo povečala trenutno vrednost objekta za 1.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta
Izvedba skripte pod pogojem, da je spremenljivka enaka 3 in je tudi enaka 4.

V primerjavi z ulitkom (==) se metoda izvede vsakič toString s funkcijo povečanja vrednosti. Temu primerno se z vsako naslednjo primerjavo vrednost poveča. Temu se je mogoče izogniti z uporabo neoddane primerjave (===).

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta
Primerjava brez vlivanja tipa

OPOMBA. Ne uporabljajte primerjave zasedb po nepotrebnem.

Za zapletene skripte, kot so Webhooki s kompleksno logiko, ki zahtevajo primerjavo s pretvorbo tipa, je priporočljivo predhodno napisati preverjanja za vrednosti, ki vračajo spremenljivke in obravnavajo nedoslednosti in napake.

Webhook Media

Konec leta 2019 in v začetku leta 2020 je skupina za integracijo Zabbix aktivno razvijala Webhooks in že pripravljene integracije, ki prihajajo z distribucijo Zabbix.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta
Povezava do dokumentacijo

Predobdelava

  • Pojav predprocesiranja v JavaScriptu je omogočil opustitev večine zunanjih skriptov in trenutno lahko v Zabbixu dobite katero koli vrednost in jo pretvorite v popolnoma drugačno vrednost.
  • Predprocesiranje v Zabbixu se izvaja s kodo JavaScript, ki se, ko je prevedena v bajtno kodo, pretvori v funkcijo, ki sprejme eno samo vrednost kot parameter vrednost kot niz (niz lahko vsebuje tako števko kot številko).
  • Ker je rezultat funkcija, je na koncu skripta zahtevana vrnitev.
  • V kodi je mogoče uporabiti makre po meri.
  • Vire je mogoče omejiti ne le na ravni operacijskega sistema, ampak tudi programsko. Koraku predprocesiranja je dodeljenih največ 10 megabajtov RAM-a in časovna omejitev 10 sekund.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta

OPOMBA. Vrednost časovne omejitve 10 sekund je precej velika, saj lahko zbiranje pogojnih tisoč podatkovnih elementov v 1 sekundi po precej "težkem" scenariju predprocesiranja upočasni Zabbix. Zato ni priporočljivo uporabljati predprocesiranja za izvajanje polnopravnih skriptov JavaScript prek tako imenovanih senčnih podatkovnih elementov (navideznih elementov), ​​ki se izvajajo samo za izvajanje predobdelave..

Svojo kodo lahko preverite s preizkusom predprocesiranja ali s pomočjo pripomočka 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`

Praktične naloge

Naloga 1

Zamenjajte izračunano postavko s predhodno obdelavo.

Pogoj: Pridobite temperaturo v Fahrenheitih iz senzorja za shranjevanje v Celziju.

Prej bi ustvarili element, ki zbira temperaturo v stopinjah Fahrenheita. Po tem še ena podatkovna postavka (izračunana), ki bi pretvorila Fahrenheite v Celzije s pomočjo formule.

Težave:

  • Potrebno je podvojiti podatkovne elemente in shraniti vse vrednosti v bazo podatkov.
  • Dogovoriti se morate o intervalih za "nadrejeno" podatkovno postavko, ki je izračunana in uporabljena v formuli, ter za izračunano podatkovno postavko. V nasprotnem primeru lahko izračunana postavka preide v nepodprto stanje ali izračuna prejšnjo vrednost, kar bo vplivalo na zanesljivost rezultatov spremljanja.

Ena od rešitev je bila, da se odmaknemo od prilagodljivih intervalov preverjanja v korist fiksnih intervalov, da zagotovimo, da se izračunani element ovrednoti po elementu, ki prejme podatke (v našem primeru temperatura v stopinjah Fahrenheita).

Če pa na primer uporabimo predlogo za preverjanje velikega števila naprav in se preverjanje izvaja enkrat na 30 sekund, Zabbix "heka" 29 sekund, zadnjo sekundo pa začne preverjati in računati. To ustvari čakalno vrsto in vpliva na zmogljivost. Zato je priporočljivo uporabljati fiksne intervale le, če je to res potrebno.

V tem problemu je optimalna rešitev enovrstična predprocesiranje JavaScripta, ki pretvori stopinje Fahrenheita v stopinje Celzija:

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

Je hiter in enostaven, ni vam treba ustvarjati nepotrebnih podatkovnih postavk in hraniti zgodovino o njih, za preverjanja pa lahko uporabite tudi prilagodljive intervale.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta

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

Toda, če je v hipotetični situaciji treba dodati prejeti podatkovni element, na primer, s katero koli konstanto, definirano v makru, je treba upoštevati, da parameter vrednost razširi v niz. Pri operaciji dodajanja nizov sta dva niza preprosto združena v enega.

V Zabbixu rešujemo praktične probleme z uporabo JavaScripta

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

Da bi dobili rezultat matematične operacije, je potrebno pretvoriti vrste dobljenih vrednosti v numerično obliko. Za to lahko uporabite funkcijo parseInt(), ki proizvede celo število, funkcijo parseFloat(), ki proizvede decimalko ali funkcijo Številka, ki vrne celo število ali decimalko.

Izziv 2

Pridobite čas v sekundah do konca potrdila.

Pogoj: storitev izda datum veljavnosti potrdila v obliki "Feb 12 12:33:56 2022 GMT".

V ECMAScript5 Date.parse () sprejme datum v formatu ISO 8601 (LLLL-MM-DDTHH:mm:ss.sssZ). Nanj je potrebno oddati niz v obliki MMM DD LLLL HH:mm:ss ZZ

problem: Mesečna vrednost je izražena kot besedilo, ne kot številka. Duktape ne sprejema podatkov v tej obliki.

Primer rešitve:

  • Najprej se deklarira spremenljivka, ki sprejme vrednost (celoten skript je deklaracija spremenljivk, ki so navedene ločene z vejicami).

  • V prvi vrstici dobimo datum v parametru vrednost in ga ločite s presledki z uporabo metode po delih. Tako dobimo matriko, kjer vsak element matrike, z začetkom pri indeksu 0, ustreza enemu elementu datuma pred in za presledkom. razdeliti (0) - mesec, razdeliti (1) - številka, razdeliti (2) - niz s časom itd. Po tem je do vsakega elementa datuma mogoče dostopati z indeksom v matriki.

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

  • Vsak mesec (v kronološkem vrstnem redu) ustreza indeksu svojega položaja v nizu (od 0 do 11). Če želite besedilno vrednost pretvoriti v številsko vrednost, se indeksu meseca doda ena (ker so meseci oštevilčeni z začetkom 1). V tem primeru izraz z dodatkom ena vzamemo v oklepaj, ker drugače dobimo niz in ne številko. Na koncu naredimo rezina () - matriko odrežite od konca, da ostaneta samo dva znaka (kar je pomembno pri mesecih z dvomestno številko).

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

  • Iz dobljenih vrednosti z običajnim seštevanjem nizov v ustreznem vrstnem redu oblikujemo niz v formatu ISO.

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

Podatki v dobljenem formatu so število sekund od leta 1970 do neke točke v prihodnosti. Skoraj nemogoče je uporabiti podatke v prejeti obliki v sprožilcih, saj Zabbix omogoča delovanje samo z makri {Datum} и {čas}, ki vrnejo datum in uro v uporabniku prijazni obliki.

  • Nato lahko dobimo trenutni datum v JavaScriptu v obliki časovnega žiga Unix in ga odštejemo od dobljenega datuma poteka potrdila, da dobimo število milisekund od zdaj do poteka veljavnosti potrdila.

`now = Date.now();`

  • Prejeto vrednost delimo s tisoč, da dobimo sekunde v Zabbixu.

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

V sprožilcu lahko določite izraz 'zadnji', ki mu sledi niz števk, ki ustreza številu sekund v obdobju, na katerega se želite odzvati, na primer v tednih. Tako bo sprožilec obvestil, da certifikat poteče čez teden dni.

OPOMBA. Bodite pozorni na uporabo parseInt() v funkciji vrnitevza pretvorbo delnega števila, ki izhaja iz deljenja milisekund, v celo število. Uporabite lahko tudi parseFloat() in shranite delne podatke.

Oglejte si poročilo

Vir: www.habr.com

Dodaj komentar