Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla
Tikhon Uskov, Zabbix-integraatiotiimin insinööri

Zabbix on muokattavissa oleva alusta, jota käytetään kaikenlaisten tietojen valvontaan. Zabbixin varhaisista versioista lähtien valvontajärjestelmänvalvojat ovat voineet suorittaa erilaisia ​​komentosarjoja kautta Toiminnot kohdeverkkosolmujen tarkistuksia varten. Samanaikaisesti komentosarjojen käynnistäminen johti useisiin vaikeuksiin, kuten tarpeeseen tukea komentosarjoja, niiden toimittamista viestintäsolmuihin ja välityspalvelimiin sekä tuki eri versioille.

JavaScript Zabbixille

Huhtikuussa 2019 Zabbix 4.2 esiteltiin JavaScript-esikäsittelyllä. Monet ihmiset innostuivat ajatuksesta luopua skriptien kirjoittamisesta, jotka vievät dataa jonnekin, sulattavat sen ja tarjoavat sen Zabbixin ymmärtämässä muodossa ja suorittavat yksinkertaisia ​​tarkistuksia, jotka vastaanottavat tiedot, jotka eivät ole valmiita Zabbixin tallentamiseen ja käsittelyyn. käsittele sitten tämä tietovirta Zabbix- ja JavaScript-työkaluilla. Yhdessä Zabbix 3.4:ssä ilmestyneiden matalan tason etsintä- ja riippuvaisten kohteiden kanssa saimme melko joustavan konseptin vastaanotettujen tietojen lajitteluun ja hallintaan.

Zabbix 4.4:ssä on looginen jatko JavaScript-esikäsittelylle, uusi ilmoitusmenetelmä - Webhook, jonka avulla Zabbix-ilmoitukset voidaan helposti integroida kolmansien osapuolien sovelluksiin.

JavaScript ja Duktapes

Miksi JavaScript ja Duktape valittiin? Erilaisia ​​vaihtoehtoja kielille ja moottoreille harkittiin:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Sulautettu Python
  • Sulautettu Perl

Tärkeimmät valintakriteerit olivat yleisyys, moottorin tuotteeseen integroinnin helppous, alhainen resurssien kulutus ja moottorin kokonaissuorituskyky sekä tällä kielellä olevan koodin käytön turvallisuus valvontaan. Indikaattorien yhdistelmän perusteella JavaScript voitti Duktape-moottorin.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla

Valintakriteerit ja suorituskyvyn testaus

Duktapen ominaisuudet:

— Vakio ECMAScript E5/E5.1
— Zabbix-moduulit Duktapelle:

  • Zabbix.log() - voit kirjoittaa eritasoisia viestejä suoraan Zabbix-palvelimen lokiin, mikä mahdollistaa virheiden korreloinnin esimerkiksi Webhookissa palvelimen tilaan.
  • CurlHttpRequest() - mahdollistaa HTTP-pyyntöjen tekemisen verkkoon, johon Webhookin käyttö perustuu.
  • atob() ja btoa() - voit koodata ja purkaa merkkijonoja Base64-muodossa.

HUOM. Duktape täyttää ACME-standardit. Zabbix käyttää käsikirjoituksen vuoden 2015 versiota. Myöhemmät muutokset ovat pieniä, joten ne voidaan jättää huomiotta..

JavaScript magia

Kaikki JavaScriptin taika piilee dynaamisessa kirjoittamisessa ja kirjoituksissa: merkkijono, numeerinen ja boolean.

Tämä tarkoittaa, että ei ole tarpeen ilmoittaa etukäteen, minkä tyyppisen muuttujan tulee palauttaa arvo.

Matemaattisissa operaatioissa funktiooperaattoreiden palauttamat arvot muunnetaan numeroiksi. Poikkeuksena tällaisiin operaatioihin on summaus, koska jos ainakin yksi termeistä on merkkijono, merkkijonomuunnos tehdään kaikkiin termeihin.

HUOM. Tällaisista muunnoksista vastaavat menetelmät on yleensä toteutettu objektin pääprototyypeissä, jonkin arvo и merkkijono. jonkin arvo kutsutaan numeerisen muunnoksen aikana ja aina ennen menetelmää merkkijono. Menetelmä jonkin arvo täytyy palauttaa primitiiviset arvot, muuten sen tulos jätetään huomiotta.

Objektille kutsutaan menetelmää jonkin arvo. Jos sitä ei löydy tai se ei palauta primitiivistä arvoa, menetelmää kutsutaan merkkijono. Jos menetelmä merkkijono ei löydy, etsitään jonkin arvo objektin prototyypissä, ja kaikki toistetaan, kunnes arvon käsittely on valmis ja kaikki lausekkeen arvot valetaan samaan tyyppiin. Jos objekti toteuttaa menetelmän merkkijono, joka palauttaa primitiivisen arvon, sitä käytetään merkkijonon muuntamiseen. Tämän menetelmän soveltamisen tulos ei kuitenkaan välttämättä ole merkkijono.

Esimerkiksi, jos kohteelle 'obj' menetelmä on määritelty merkkijono,

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

метод merkkijono palauttaa täsmälleen merkkijonon, ja kun lisäät merkkijonon numerolla, saadaan liimattu merkkijono:

`obj + 1 // '2001'` 

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

Mutta jos kirjoitat uudelleen merkkijono, jolloin menetelmä palauttaa luvun, objektia lisättäessä suoritetaan matemaattinen operaatio numeerisella muunnoksella ja saadaan matemaattisen summauksen tulos.

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

`obj + 1 // '2001'`

Tässä tapauksessa, jos suoritamme lisäyksen merkkijonolla, suoritetaan merkkijonon muunnos ja saadaan liimattu merkkijono.

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

Tämä on syy siihen, että aloittelevat JavaScript-käyttäjät tekevät suuren määrän virheitä.

Menetelmä merkkijono voit kirjoittaa funktion, joka lisää objektin nykyistä arvoa yhdellä.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla
Skriptin suorittaminen edellyttäen, että muuttuja on yhtä suuri kuin 3 ja se on myös yhtä suuri kuin 4.

Castiin (==) verrattuna menetelmä suoritetaan joka kerta merkkijono arvonlisäystoiminnolla. Vastaavasti jokaisella myöhemmällä vertailulla arvo kasvaa. Tämä voidaan välttää käyttämällä ei-cast-vertailua (===).

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla
Vertailu ilman tyyppivalua

HUOM. Älä käytä Cast-vertailua tarpeettomasti.

Monimutkaisille skripteille, kuten monimutkaisen logiikan Webhookeille, jotka vaativat vertailua tyyppisuorittamiseen, on suositeltavaa kirjoittaa etukäteen tarkistuksia arvoille, jotka palauttavat muuttujia ja käsittelevät epäjohdonmukaisuuksia ja virheitä.

Webhook Media

Vuoden 2019 lopulla ja vuoden 2020 alussa Zabbix-integraatiotiimi on kehittänyt aktiivisesti Webhookeja ja valmiita integraatioita, jotka tulevat Zabbix-jakelun mukana.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla
Linkki dokumentointi

esikäsittely

  • Esikäsittelyn tulo JavaScriptissä mahdollisti useimpien ulkoisten komentosarjojen luopumisen, ja tällä hetkellä Zabbixissa voit saada minkä tahansa arvon ja muuntaa sen täysin erilaiseksi arvoksi.
  • Esikäsittely Zabbixissa toteutetaan JavaScript-koodilla, joka tavukoodiksi käännettynä muunnetaan funktioksi, joka ottaa yhden arvon parametriksi arvo merkkijonona (merkkijono voi sisältää sekä numeron että numeron).
  • Koska tulos on funktio, komentosarjan lopussa vaaditaan palata.
  • Koodissa on mahdollista käyttää mukautettuja makroja.
  • Resursseja voidaan rajoittaa paitsi käyttöjärjestelmän tasolla, myös ohjelmallisesti. Esikäsittelyvaiheelle on varattu enintään 10 megatavua RAM-muistia ja ajoaikarajoitus 10 sekuntia.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla

HUOM. 10 sekunnin aikakatkaisuarvo on aika paljon, koska ehdollisten tuhansien tietokohteiden kerääminen 1 sekunnissa melko "raskaan" esikäsittelyskenaarion mukaan voi hidastaa Zabbixia. Siksi ei ole suositeltavaa käyttää esikäsittelyä täysimittaisten JavaScript-komentosarjojen suorittamiseen ns. varjotietoelementtien (dummy-elementtien) kautta, jotka ajetaan vain esikäsittelyn suorittamiseen..

Voit tarkistaa koodisi esikäsittelytestillä tai käyttämällä apuohjelmaa 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`

Käytännön tehtäviä

Tehtävä 1

Korvaa laskettu nimike esikäsittelyllä.

Kunto: Hae lämpötila Fahrenheitina anturista tallennettavaksi Celsius-asteina.

Aiemmin loimme kohteen, joka kerää lämpötilan Fahrenheit-asteina. Sen jälkeen toinen tietoyksikkö (laskettu), joka muuttaisi Fahrenheitin Celsiuksiksi kaavan avulla.

Ongelmat:

  • Tietoelementit on kopioitava ja kaikki arvot on tallennettava tietokantaan.
  • Sinun tulee sopia kaavassa laskettavan ja käytetyn "emo"-tietoalkion ja lasketun tietokohteen välit. Muussa tapauksessa laskettu kohde voi mennä tukemattomaan tilaan tai laskea aikaisemman arvon, mikä vaikuttaa seurantatulosten luotettavuuteen.

Yksi ratkaisu oli siirtyä joustavista tarkistusväleistä kiinteisiin aikaväleihin sen varmistamiseksi, että laskettu kohde arvioidaan sen kohteen jälkeen, joka vastaanottaa tiedot (tässä tapauksessa lämpötila Fahrenheit-asteina).

Mutta jos esimerkiksi käytämme mallia tarkastamaan suuren määrän laitteita ja tarkistus suoritetaan kerran 30 sekunnissa, Zabbix "hakkertelee" 29 sekuntia ja viimeisellä sekunnilla se alkaa tarkistaa ja laskea. Tämä luo jonon ja vaikuttaa suorituskykyyn. Siksi on suositeltavaa käyttää kiinteitä intervalleja vain, jos se on todella välttämätöntä.

Tässä ongelmassa optimaalinen ratkaisu on yksirivinen JavaScript-esikäsittely, joka muuntaa Fahrenheit-asteet Celsius-asteiksi:

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

Se on nopeaa ja helppoa, sinun ei tarvitse luoda tarpeettomia tietokohteita ja pitää niistä historiaa, ja voit myös käyttää joustavia tarkistuksia.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla

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

Mutta jos hypoteettisessa tilanteessa on tarpeen lisätä vastaanotettu tietoelementti esimerkiksi mihin tahansa makrossa määriteltyyn vakioon, on otettava huomioon, että parametri arvo laajenee merkkijonoksi. Merkkijonojen lisäystoiminnossa kaksi merkkijonoa yhdistetään yksinkertaisesti yhdeksi.

Ratkaisemme käytännön ongelmia Zabbixissa JavaScriptin avulla

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

Matemaattisen operaation tuloksen saamiseksi on tarpeen muuntaa saatujen arvojen tyypit numeeriseen muotoon. Tätä varten voit käyttää toimintoa parseInt(), joka tuottaa kokonaisluvun, funktion parseFloat(), joka tuottaa desimaaliluvun tai funktion numero, joka palauttaa kokonaisluvun tai desimaaliluvun.

2 Tehtävä

Hae aika sekunneissa varmenteen loppuun.

Kunto: palvelu myöntää varmenteen vanhenemispäivän muodossa "Feb 12 12:33:56 2022 GMT".

ECMAScript5:ssä Date.parse () hyväksyy päivämäärän ISO 8601 -muodossa (VVVV-KK-PPTHH:mm:ss.sssZ). Siihen on syötettävä merkkijono muodossa MMM DD VVVV HH:mm:ss ZZ

ongelma: Kuukauden arvo ilmaistaan ​​tekstinä, ei numerona. Duktape ei hyväksy tässä muodossa olevia tietoja.

Esimerkki ratkaisusta:

  • Ensinnäkin ilmoitetaan muuttuja, joka ottaa arvon (koko komentosarja on muuttujien ilmoitus, jotka on lueteltu pilkuilla eroteltuina).

  • Ensimmäisellä rivillä saamme parametrin päivämäärän arvo ja erota se välilyönneillä menetelmällä jakaa. Siten saadaan taulukko, jossa jokainen taulukon elementti, alkaen indeksistä 0, vastaa yhtä päivämääräelementtiä ennen ja jälkeen välilyönnin. jakaa (0) - kuukausi, jakaa (1) - numero, jakaa (2) - merkkijono ajan kanssa jne. Tämän jälkeen jokaiseen päivämäärän elementtiin pääsee käsiksi taulukon indeksillä.

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

  • Jokainen kuukausi (kronologisessa järjestyksessä) vastaa sen sijainnin indeksiä taulukossa (0-11). Tekstiarvon muuttamiseksi numeerisiksi arvoiksi lisätään kuukausiindeksiin yksi (koska kuukaudet on numeroitu 1:stä alkaen). Tässä tapauksessa lauseke, johon on lisätty yksi, otetaan suluissa, koska muuten saadaan merkkijono, ei numero. Lopussa teemme viipale() - leikkaa matriisi lopusta niin, että jäljelle jää vain kaksi merkkiä (mikä on tärkeää kuukausille kaksinumeroisella numerolla).

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

  • Muodostamme saaduista arvoista ISO-muotoisen merkkijonon lisäämällä merkkijonoja tavanomaisessa järjestyksessä.

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

Tuloksena oleva data on sekuntien lukumäärä vuodesta 1970 johonkin tulevaisuuteen. On lähes mahdotonta käyttää vastaanotetussa muodossa olevaa dataa triggereissä, koska Zabbixin avulla voit käyttää vain makroja {Päivämäärä} и {Aika}, jotka palauttavat päivämäärän ja kellonajan käyttäjäystävällisessä muodossa.

  • Voimme sitten saada nykyisen päivämäärän JavaScriptissä Unix Timestamp -muodossa ja vähentää sen tuloksena olevasta varmenteen vanhenemispäivästä saadaksemme millisekuntien määrän tästä hetkestä varmenteen vanhenemiseen.

`now = Date.now();`

  • Jaamme vastaanotetun arvon tuhannella saadaksemme sekuntia Zabbixissa.

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

Triggerissä voit määrittää lausekkeen 'kestää' ja sen jälkeen joukko numeroita, jotka vastaavat sekuntien määrää ajanjaksolla, johon haluat vastata, esimerkiksi viikkoina. Siten laukaisin ilmoittaa, että varmenne vanhenee viikon kuluttua.

HUOM. Kiinnitä huomiota käyttöön parseInt() toiminnassa palatamuuntaa millisekuntien jaosta saatu murtoluku kokonaisluvuksi. Voit myös käyttää parseFloat() ja tallentaa murto-osia.

Katso raportti

Lähde: will.com

Lisää kommentti