Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével
Tihon Uskov, a Zabbix integrációs csapat mérnöke

A Zabbix egy testreszabható platform, amelyet bármilyen adat megfigyelésére használnak. A Zabbix korai verzióitól kezdve a felügyeleti adminisztrátoroknak lehetőségük volt különböző szkriptek futtatására Actions a hálózat célpontjaiban végzett ellenőrzésekhez. A szkriptek futtatása számos nehézséget okozott, többek között a szkriptek karbantartásának, kommunikációs csomópontokhoz és proxikhoz való eljuttatásának, valamint különböző verziók támogatásának szükségességét.

JavaScript a Zabbix számára

2019 áprilisában megjelent a Zabbix 4.2 JavaScript előfeldolgozási funkcióval. Sokan a szkriptek írásának elhagyásának ötletével lángoltak, amelyek valahonnan adatokat nyernek, feldolgozzák azokat, és már Zabbix formátumra értelmezve szolgáltatják, és egyszerű ellenőrzéseket hajtanak végre, amelyek nem előkészített Zabbix adatok megszerzésére szolgálnak, majd ezt az adatfolyamot a Zabbix és a JavaScript eszközeivel dolgozzák fel. A Zabbix 3.4-es verziójában megjelent alacsony szintű felfedezés és az attól függő adat elemekkel együtt meglehetősen rugalmas koncepciót hozott létre az adatok rendszerezésére és kezelésére.

A Zabbix 4.4, mint a JavaScript előfeldolgozás logikus folytatása, megjelent egy új értesítési módszer — Webhook, amelyet a Zabbix értesítések harmadik féltől származó alkalmazásokkal való egyszerű integrálására lehet használni.

JavaScript és Duktape

Miért éppen a JavaScript és a Duktape lettek kiválasztva? Különböző nyelvek és motorok opcióit fontolóra vették:

  • Lua – Lua 5.1
  • Lua – LuaJIT
  • JavaScript – Duktape
  • JavaScript – JerryScript
  • Beágyazott Python
  • Beágyazott Perl

A választás fő kritériumai a népszerűség, a motor termékbe való egyszerű integrációja, az alacsony erőforrásszükséglet és a motor teljesítménye, valamint a nyelvbe való kódbeágyazás biztonsága voltak. Az összes mutató alapján a Duktape motoron futó JavaScript győzött.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével

A választási kritériumok és teljesítménytesztelés

A Duktape jellemzői:

— Szabvány ECMAScript E5/E5.1
— Zabbix Zdukape modulok:

  • Zabbix.log() — lehetővé teszi, hogy közvetlenül a Zabbix Server naplóiba írd a különböző részletességi szintű üzeneteket, ami lehetővé teszi a hibák összehasonlítását, például a Webhook és a szerver állapota között.
  • CurlHttpRequest() — lehetővé teszi HTTP-kérések küldését a hálózatba, amely a Webhook alkalmazásának alapja.
  • atob() és btoa() - lehetővé teszi a stringek Base64 formátumban történő kódolását és dekódolását.

MEGJEGYZÉS. A Duktape megfelel az ACME szabványoknak. A Zabbix a 2015-ös verziót használja. A későbbi változások elhanyagolhatók, ezért figyelmen kívül hagyhatók..

A JavaScript varázsa

A JavaScript varázsa a dinamikus típuskülönbségekben és a típusok átkonvertálásában rejlik: stringek, számok és logikai értékek.

Ez azt jelenti, hogy nem szükséges előre megadni, milyen típusú értéket kell visszaadnia a változónak.

Matematikai műveletek során az opciók, amelyeket a funkció operátorai visszaadnak, számokká alakítódnak. Kivétel ez alól az összeadás, mivel ha legalább az egyik összetevő string, az összes további összetevő string formátumra kerül.

MEGJEGYZÉS. Az ilyen átalakításokért felelős metódusok általában az objektumok szülő prototípusaiban találhatók. valueOf és toString. valueOf számábrázoláskor hívódik meg, és mindig a metódus előtt áll toString. A metódus valueOf meg kell, hogy térjen primitív értékeket, különben az eredményét figyelmen kívül hagyják.

Objektumnál a metódus hívódik meg valueOF. Ha nem található, vagy nem ad vissza primitív értéket, akkor a metódus hívódik meg toString. Ha a metódus toString nem található, a keresés folytatódik valueOf az objektum prototípusában, és minden megismétlődik, amíg a folyamat be nem fejeződik és az összes kifejezés értéke azonos típussá nem alakul.. Ha az objektumnál implementálva van egy metódus toString, amely primitív értéket ad vissza, akkor azt használják a string átkonvertáláshoz. Ezek alapján ennek a metódusnak az eredménye nem feltétlenül string.

Például, ha az ‘obj‘ objektumhoz vélhetően a következő metódust definiálják: toString,

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

metódus toString akkor az pontosan stringet ad vissza, és amikor a stringet egy számmal összegzik, az összefűzött stringet kapunk:

`obj + 1 // '2001'` 

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

De ha átírjuk toString, hogy a metódus számot adjon vissza, akkor az objektum összeadásakor matematikai művelet hajtódik végre szám átkonvertálással és matematikai összegzés eredményével kapunk.

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

`obj + 1 // '2001'`

Ezáltal, ha stringgel végezzük el az összeadást, string átkonvertálás történik, és a végén a szöveg összefűzése lesz.

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

Ez a kezdő JavaScript felhasználók számos hibájának oka.

A metódus toString Lehet írni egy funkciót, amely növeli az objektum aktuális értékét 1-el.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével
A szkript végrehajtása azon a feltételen alapul, hogy a változó 3 és 4 is egyben.

Típusok összehasonlításakor (==) minden alkalommal végrehajtódik a módszer toString az érték növelésével. Ennek megfelelően minden egyes összehasonlítás során az érték nő. Ezt elkerülhetjük, ha a típusok nélküli összehasonlítást (===) használjuk.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével
Típusok nélküli összehasonlítás

MEGJEGYZÉS. Ne használj típusokkal való összehasonlítást szükségtelenül..

Összetett szkriptekhez, például Webhookokhoz bonyolult logikával, ahol szükséges a típusokkal való összehasonlítás, javasolt előzetesen ellenőrzéseket készíteni a változók által visszaadott értékekre, és kezelni az eltéréseket és hibákat.

Webhook Media

2019 végén és 2020 elején a Zabbix integrációs csapata aktívan fejlesztette a Webhookokat és az „out of the box” integrációkat, amelyek a Zabbix disztribúcióval kerülnek szállításra.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével
Link a a dokumentációval

Előfeldolgozás

  • A JavaScript előfeldolgozás megjelenése lehetővé tette a legtöbb külső szkripttől való megszabadulást, és jelenleg a Zabbix bármilyen értéket kaphat, és átalakíthatja azt egy másik értékké.
  • Az előfeldolgozás a Zabbixben JavaScript kóddal valósul meg, amely a bytekódba történő fordításkor olyan függvénnyé alakul, amely egyetlen értéket fogad el paraméterként érték stringként (a stringben lehet szám és szám is).
  • Mivel a kimenet egy függvény, a szkript végén kötelező return.
  • Lehetséges felhasználói makrókat használni a kódban.
  • Az erőforrásokat nemcsak operációs rendszer szinten, hanem programozottan is korlátozni lehet. Az előfeldolgozási lépéshez legfeljebb 10 megabyte RAM és 10 másodperces végrehajtási időkorlát áll rendelkezésre.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével

MEGJEGYZÉS. A 10 másodperces időtúllépési értékek elég jelentősek, mivel feltételezett ezer adatgyűjtés 1 másodperc alatt egy eléggé „nehéz” előfeldolgozási forgatókönyv miatt lelassíthatja a Zabbixot. Ezért nem javasolt előfeldolgozást végezni a JavaScript teljes körű szkriptjeinek végrehajtására az úgynevezett „árnyék adatpontok” (dummy items) segítségével, amelyek csak az előfeldolgozás elvégzésére kerülnek végrehajtásra..

A kódodat tesztelheted a preprocesszáló teszten vagy egy segédprogram segítségével 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`

Gyakorlati feladatok

Feladat 1

Helyettesíteni kell a számított adatpontot preprocesszorral.

Kondíció: a hőmérsékletet Fahrenheit fokban kapjuk a Celsius fokban való tároláshoz.

Korábban létrehoztunk egy adatpontot, amely a hőmérsékletet Fahrenheit fokban gyűjtötte. Ezt követően – egy másik adatpontot (számított), amely a képlettel Fahrenheit fokot Celsius fokra alakít.

Problems:

  • Dupláznunk kell az adatpontokat és tárolnunk kell az összes értéket az adatbázisban.
  • Összhangba kell hozni a "szülő" adatpont intervallumait, amelyeket a képletben használnak, és a számított adatpont intervallumait. Ellenkező esetben a számított adatpont hibás állapotba kerülhet, vagy az előző értéket számíthatja, mely hatással lesz a monitorozás megbízhatóságára.

Egyik megoldás volt, hogy a rugalmas ellenőrzési intervallumokat cseréljük ki fix intervallumokra, hogy garantálhassuk a számított adatpont kiszámítását a nyersadatpont után (ebben az esetben a Fahrenheit fokban mért hőmérsékletet).

De, ha például a sablont számos eszköz ellenőrzésére használjuk, és az ellenőrzést 30 másodpercenként végezzük, a Zabbix 29 másodpercen keresztül "hálátlan", és az utolsó másodpercben indul el az ellenőrzésekkel és számításokkal. Ez sorban álláshoz vezet és befolyásolja a teljesítményt. Ezért ajánlott fix intervallumok használata, csak ha valóban szükséges.

Ebben a feladatban az optimális megoldás egy olyan egysoros preprocesszor JavaScript-ben, amely átváltja a Fahrenheit fokot Celsius fokra:

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

Ez gyors és egyszerű, nem szükséges felesleges adatpontokat létrehozni és tárolni a történetüket, valamint használhatók rugalmas intervallumok a ellenőrzésekhez.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével

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

De ha egy hipotetikus helyzetben szükséges, hogy a kapott adatpontot összeadjuk például egy, a makróban meghatározott konstanssal, figyelembe kell venni, hogy a paraméter érték összevonásra kerül. A karakterláncok összeadásakor a két karakterlánc egyszerűen egyesül egyetlen karakterlánccá.

Gyakorlati feladatok megoldása Zabbixban JavaScript segítségével

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

A matematikai művelet eredményének megszerzéséhez szükséges a kapott értékek típusainak numerikus formátumra való átkonvertálása. Ehhez használhatjuk a parseInt(), amely egész számot ad vissza, a parseFloat(), amely tizedes számot ad vissza, vagy a number, amely egész számot vagy tizedes számot ad vissza.

2. feladat

A tanúsítvány lejárati idejét másodpercekben kell megkapni.

Kondíció: egy bizonyos szolgáltatás a tanúsítvány lejárati dátumát a "Feb 12 12:33:56 2022 GMT" formátumban adja meg.

Az ECMAScript5 YYYY-MMM-DD formátum ISO 8601 formátumban (YYYY-MM-DDTHH:mm:ss.sssZ) várja a dátumot. A szükséges formátumba kell átkonvertálni a hónap nevével kifejezett szöveges értéket, nem számot. Az ilyen formátumban lévő adatok nem fogadhatók el Duktape által.

ProblémaPélda megoldás

Először deklarálunk egy változót, amely az értéket fogja tartalmazni (az egész szkript változók deklarálásából áll, amelyek vesszővel vannak felsorolva).:

  • Az első sorban a dátumot a paraméterből kapjuk meg

  • , és a szóközökkel osztjuk fel a érték split metódus segítségével. Így egy tömböt kapunk, ahol az egyes tömbelemek, az 0-ás indexet kezdve, a dátum egy-egy elemével felelnek meg a szóköz előtt és után.split(0) — hónap, split(1) — nap, split(2) — az időtartammal és így tovább. Ezt követően a dátum egyes elemeihez index szerint lehet hozzáférni a tömbben. `var split = value.split(' '),`

Minden hónaphoz (krónológiai sorrendben) megfelel egy index a tömbben (0-tól 11-ig). A szöveges érték numerikussá konvertálásához a hónap indexéhez egyet kell hozzáadni (mivel a hónapok számozása 1-től kezdődik). Ezenkívül az egyesítési kifejezést zárójelbe helyezzük, mert különben szöveget, nem számot kapnánk. A végén végrehajtjuk a

  • slice() — a tömb végéről csonkítva, hogy csak két számjegy maradjon (ami fontos a két számjegyű hónapokhoz). `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),`

A kapott értékekből olyan ISO formátumú karakterláncot kell létrehoznunk, amelyet a megfelelő sorrendben egyszerű karakterláncok összegzésével kapunk.

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

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

A kapott formátumban lévő adatok — másodpercek száma 1970-től egy jövőbeli pillanatig. A kapott formátumban lévő adatokat gyakorlatilag lehetetlen felhasználni a triggerekben, mivel a Zabbix csak makrókkal tud operálni. {Date} és {Time}, amelyek dátumot és időt adnak vissza felhasználóbarát formátumban.

  • Ezt követően JavaScript-ben megkaphatjuk az aktuális dátumot Unix Timestamp formátumban, és kivonhatjuk ezt a kapott lejárati dátumból, hogy megkapjuk a millisekundák számát az aktuális pillanattól a tanúsítvány lejárati pillanatáig.

`now = Date.now();`

  • A kapott értéket elosztjuk ezerrel, hogy másodperceket kapjunk Zabbix-ben.

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

A triggerben megadhatjuk a kifejezést 'last<' és egy számot, amely megfelel a másodpercek számának a reagálni kívánt időszakban, például hetekben. Így a trigger figyelmeztetni fog arra, hogy a tanúsítvány lejárati ideje egy héten belül lesz.

MEGJEGYZÉS. Figyeljünk a használatra parseInt() a funkcióban return, hogy a millisekundumban kapott osztás eredményeként kapott törtszámot egész számra konvertáljuk. Emellett használhatunk parseFloat() és tárolhatjuk a tört adatokat..

Beszámoló megtekintése

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster