Praktické problémy v Zabbixe riešime pomocou JavaScriptu

Praktické problémy v Zabbixe riešime pomocou JavaScriptu
Tichon Uskov, inžinier integračného tímu Zabbix

Zabbix je prispôsobiteľná platforma, ktorá sa používa na monitorovanie akéhokoľvek druhu údajov. Od prvých verzií Zabbix mali správcovia monitorovania možnosť spúšťať rôzne skripty Akcia pre kontroly cieľových sieťových uzlov. Spustenie skriptov zároveň viedlo k množstvu ťažkostí, vrátane potreby podpory skriptov, ich doručovania do komunikačných uzlov a proxy, ako aj podpory rôznych verzií.

JavaScript pre Zabbix

V apríli 2019 bol predstavený Zabbix 4.2 s predspracovaním JavaScriptu. Mnoho ľudí bolo nadšených myšlienkou opustiť písanie skriptov, ktoré niekam prenesú údaje, strávia ich a poskytnú vo formáte, ktorému Zabbix rozumie, a vykonávajú jednoduché kontroly, ktoré dostanú údaje, ktoré nie sú pripravené na ukladanie a spracovanie v Zabbixe, a potom spracujte tento dátový tok pomocou nástrojov Zabbix a JavaScript. V spojení s nízkoúrovňovým objavovaním a závislými položkami, ktoré sa objavili v Zabbix 3.4, sme získali pomerne flexibilný koncept triedenia a správy prijatých údajov.

V Zabbix 4.4 sa ako logické pokračovanie predbežného spracovania v JavaScripte objavila nová notifikačná metóda – Webhook, pomocou ktorej možno notifikácie Zabbixu jednoducho integrovať s aplikáciami tretích strán.

JavaScript a duktapes

Prečo boli vybraté JavaScript a Duktape? Zvažovali sa rôzne možnosti jazykov a motorov:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - duktape
  • Javascript - JerryScript
  • Vložený Python
  • Vložený Perl

Hlavnými kritériami výberu boli rozšírenosť, jednoduchosť integrácie motora do produktu, nízka spotreba zdrojov a celkový výkon motora a bezpečnosť zavedenia kódu v tomto jazyku do monitorovania. Na základe kombinácie indikátorov zvíťazil JavaScript na engine Duktape.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu

Kritériá výberu a testovanie výkonu

Vlastnosti duktape:

— Štandardná ECMAScript E5/E5.1
- Moduly Zabbix pre Duktape:

  • Zabbix.log() – umožňuje zapisovať správy s rôznymi úrovňami podrobností priamo do protokolu servera Zabbix, čo umožňuje korelovať chyby, napríklad vo webhooku so stavom servera.
  • CurlHttpRequest() - umožňuje zadávať HTTP požiadavky do siete, na ktorej je založené používanie Webhooku.
  • atob() a btoa() - umožňuje kódovať a dekódovať reťazce vo formáte Base64.

POZNÁMKA. Duktape vyhovuje normám ACME. Zabbix používa verziu skriptu z roku 2015. Následné zmeny sú menšie, takže ich možno ignorovať..

Mágia JavaScriptu

Celé kúzlo JavaScriptu spočíva v dynamickom písaní a pretypovaní: reťazec, numerický a booleovský.

To znamená, že nie je potrebné vopred deklarovať, aký typ má premenná vracať hodnotu.

V matematických operáciách sa hodnoty vrátené operátormi funkcií prevedú na čísla. Výnimkou takýchto operácií je sčítanie, pretože ak je aspoň jeden z výrazov reťazec, konverzia reťazca sa použije na všetky výrazy.

POZNÁMKA. Metódy zodpovedné za takéto transformácie sú zvyčajne implementované v rodičovských prototypoch objektu, hodnota и natiahnuť. hodnota volaná pri numerickom prevode a vždy pred metódou natiahnuť. Metóda hodnota musí vrátiť primitívne hodnoty, inak sa jeho výsledok ignoruje.

Na objekt sa volá metóda hodnota. Ak sa nenájde alebo nevráti primitívnu hodnotu, zavolá sa metóda natiahnuť. Ak metóda natiahnuť nenájdené, hľadám hodnota v prototype objektu a všetko sa opakuje, kým sa nedokončí spracovanie hodnoty a všetky hodnoty vo výraze sa neprenesú do rovnakého typu. Ak objekt implementuje metódu natiahnuť, ktorý vracia primitívnu hodnotu, potom sa používa na konverziu reťazca. Výsledkom aplikácie tejto metódy však nie je nevyhnutne reťazec.

Napríklad, ak pre pre objekt 'objje definovaná metóda natiahnuť,

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

metóda natiahnuť vráti presne reťazec a pri pridaní reťazca s číslom dostaneme zlepený reťazec:

`obj + 1 // '2001'` 

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

Ale ak prepíšeš natiahnuť, aby metóda vrátila číslo, pri sčítaní objektu sa vykoná matematická operácia s numerickým prevodom a získa sa výsledok matematického sčítania.

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

`obj + 1 // '2001'`

V tomto prípade, ak vykonáme sčítanie pomocou struny, vykoná sa konverzia struny a dostaneme zlepenú strunu.

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

To je dôvod veľkého počtu chýb začínajúcich používateľov JavaScriptu.

Metóda natiahnuť môžete napísať funkciu, ktorá zvýši aktuálnu hodnotu objektu o 1.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu
Spustenie skriptu za predpokladu, že premenná sa rovná 3 a tiež sa rovná 4.

V porovnaní s obsadením (==) sa metóda vykoná zakaždým natiahnuť s funkciou zvýšenia hodnoty. V súlade s tým sa pri každom ďalšom porovnaní hodnota zvyšuje. Tomu sa dá predísť použitím porovnávania bez pretypovania (===).

Praktické problémy v Zabbixe riešime pomocou JavaScriptu
Porovnanie bez typového odliatku

POZNÁMKA. Nepoužívajte porovnávanie obsadenia zbytočne.

V prípade zložitých skriptov, ako sú webhooky so zložitou logikou, ktoré vyžadujú porovnanie s typovým pretypovaním, sa odporúča vopred zapísať kontroly hodnôt, ktoré vracajú premenné a spracovávajú nekonzistencie a chyby.

Webhook Media

Koncom roka 2019 a začiatkom roku 2020 integračný tím Zabbix aktívne vyvíjal webhooky a integrované integrácie, ktoré prichádzajú s distribúciou Zabbix.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu
Odkaz na dokumentácia

predspracovania

  • Nástup predspracovania v JavaScripte umožnil opustiť väčšinu externých skriptov a momentálne v Zabbixe môžete získať akúkoľvek hodnotu a previesť ju na úplne inú hodnotu.
  • Predspracovanie v Zabbixe je implementované kódom JavaScript, ktorý sa po kompilácii do bajtkódu prevedie na funkciu, ktorá berie ako parameter jednu hodnotu hodnotu ako reťazec (reťazec môže obsahovať číslicu aj číslo).
  • Keďže výstupom je funkcia, na konci sa vyžaduje skript návrat.
  • V kóde je možné použiť vlastné makrá.
  • Zdroje môžu byť obmedzené nielen na úrovni operačného systému, ale aj programovo. Kroku predbežného spracovania je pridelených maximálne 10 megabajtov pamäte RAM a časový limit spustenia je 10 sekúnd.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu

POZNÁMKA. Hodnota časového limitu 10 sekúnd je dosť veľa, pretože zhromažďovanie podmienených tisícok dátových položiek za 1 sekundu podľa dosť „ťažkého“ scenára predspracovania môže Zabbix spomaliť. Preto sa neodporúča používať predspracovanie na spúšťanie plnohodnotných skriptov JavaScript prostredníctvom takzvaných tieňových dátových prvkov (dummy items), ktoré sa spúšťajú len na vykonanie predspracovania.

Svoj kód môžete skontrolovať pomocou testu predbežného spracovania alebo pomocou pomôcky 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`

Praktické úlohy

Úloha 1

Nahraďte vypočítanú položku predbežným spracovaním.

Podmienka: Získajte teplotu v stupňoch Fahrenheita zo snímača a uložte ju v stupňoch Celzia.

Predtým by sme vytvorili položku, ktorá zhromažďuje teplotu v stupňoch Fahrenheita. Potom ďalšia údajová položka (vypočítaná), ktorá by pomocou vzorca previedla Fahrenheita na stupne Celzia.

Problémy:

  • Je potrebné duplikovať dátové prvky a uložiť všetky hodnoty do databázy.
  • Musíte sa dohodnúť na intervaloch pre „nadradenú“ údajovú položku, ktorá sa počíta a používa vo vzorci, a pre vypočítanú údajovú položku. V opačnom prípade môže vypočítaná položka prejsť do nepodporovaného stavu alebo vypočítať predchádzajúcu hodnotu, čo ovplyvní spoľahlivosť výsledkov monitorovania.

Jedným z riešení bolo upustiť od flexibilných kontrolných intervalov v prospech pevných intervalov, aby sa zabezpečilo, že vypočítaná položka sa vyhodnotí po položke, ktorá prijíma údaje (v našom prípade teplota v stupňoch Fahrenheita).

Ak ale napríklad použijeme šablónu na kontrolu veľkého množstva zariadení a kontrola sa vykonáva raz za 30 sekúnd, Zabbix „hackuje“ 29 sekúnd a v poslednej sekunde začne kontrolovať a počítať. To vytvára frontu a ovplyvňuje výkon. Preto sa odporúča používať pevné intervaly len vtedy, ak je to naozaj nevyhnutné.

V tomto probléme je optimálnym riešením jednoriadkové predbežné spracovanie JavaScriptu, ktoré prevádza stupne Fahrenheita na stupne Celzia:

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

Je to rýchle a jednoduché, nemusíte vytvárať zbytočné dátové položky a viesť na nich históriu a môžete využiť aj flexibilné intervaly kontrol.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu

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

Ak je však v hypotetickej situácii potrebné pridať prijatý dátový prvok, napríklad s akoukoľvek konštantou definovanou v makre, treba vziať do úvahy, že parameter hodnotu expanduje do reťazca. Pri operácii pridávania reťazcov sa dva reťazce jednoducho spoja do jedného.

Praktické problémy v Zabbixe riešime pomocou JavaScriptu

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

Na získanie výsledku matematickej operácie je potrebné previesť typy získaných hodnôt do číselného formátu. Na to môžete použiť funkciu parseInt(), ktorý vytvára celé číslo, funkciu parseFloat(), ktorý vytvára desatinné číslo alebo funkciu číslo, ktorý vráti celé číslo alebo desatinné číslo.

2 Úloha

Získajte čas v sekundách do konca certifikátu.

Podmienka: služba vydáva dátum vypršania platnosti certifikátu vo formáte „12. február 12:33:56 2022 GMT“.

V ECMAScript5 date.parse() akceptuje dátum vo formáte ISO 8601 (RRRR-MM-DDTHH:mm:ss.sssZ). Je potrebné naň preniesť reťazec vo formáte MMM DD RRRR HH:mm:ss ZZ

problém: Hodnota mesiaca je vyjadrená ako text, nie ako číslo. Údaje v tomto formáte Duktape neprijíma.

Príklad riešenia:

  • V prvom rade je deklarovaná premenná, ktorá nadobúda hodnotu (celý skript je deklarácia premenných, ktoré sú uvedené oddelené čiarkami).

  • V prvom riadku dostaneme dátum v parametri hodnotu a oddeľte ho medzerami pomocou metódy rozdeliť. Tak dostaneme pole, kde každý prvok poľa, začínajúci na indexe 0, zodpovedá jednému prvku dátumu pred a za medzerou. rozdeliť (0) - mesiac, rozdeliť (1) - číslo, rozdeliť (2) - reťazec s časom atď. Potom je možné pristupovať ku každému prvku dátumu pomocou indexu v poli.

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

  • Každý mesiac (v chronologickom poradí) zodpovedá indexu jeho pozície v poli (od 0 do 11). Ak chcete previesť textovú hodnotu na číselnú hodnotu, do indexu mesiaca sa pridá jedna (pretože mesiace sú číslované od 1). V tomto prípade sa výraz s pridaním jednotky berie do zátvoriek, pretože inak sa získa reťazec, nie číslo. Na konci robíme plátok () - odstrihnite pole od konca, aby zostali iba dva znaky (čo je dôležité pre mesiace s dvojciferným číslom).

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

  • Zo získaných hodnôt vytvoríme reťazec vo formáte ISO obvyklým pridávaním reťazcov v príslušnom poradí.

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

Údaje vo výslednom formáte predstavujú počet sekúnd od roku 1970 do určitého bodu v budúcnosti. Využitie dát v prijatom formáte v spúšťačoch je takmer nemožné, pretože Zabbix umožňuje operovať len s makrami {Dátum} и {Čas}, ktoré vracajú dátum a čas v užívateľsky príjemnom formáte.

  • Potom môžeme získať aktuálny dátum v JavaScripte vo formáte Unix Timestamp a odpočítať ho od výsledného dátumu vypršania platnosti certifikátu, aby sme získali počet milisekúnd odteraz do vypršania platnosti certifikátu.

`now = Date.now();`

  • Prijatú hodnotu vydelíme tisíckou, aby sme dostali sekundy v Zabbixe.

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

V spúšťači môžete zadať výraz „posledný“, za ktorým nasleduje skupina číslic, ktorá zodpovedá počtu sekúnd v období, na ktoré chcete odpovedať, napríklad v týždňoch. Spúšťač teda upozorní, že platnosť certifikátu vyprší o týždeň.

POZNÁMKA. Dávajte pozor na používanie parseInt() vo funkcii návratpreviesť zlomkové číslo vyplývajúce z delenia milisekúnd na celé číslo. Môžete tiež použiť parseFloat() a ukladať zlomkové údaje.

Pozrite si reportáž

Zdroj: hab.com

Pridať komentár