Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript
Tikhon Uskov, insinyur tim integrasi Zabbix

Zabbix minangka platform sing bisa disesuaikan sing digunakake kanggo ngawasi data apa wae. Wiwit versi paling awal saka Zabbix, administrator ngawasi nduweni kemampuan kanggo mbukak macem-macem skrip liwat tumindak kanggo mriksa node jaringan target. Ing wektu sing padha, peluncuran skrip nyebabake sawetara kesulitan, kalebu kayata kabutuhan kanggo ndhukung skrip, pangiriman menyang simpul komunikasi lan proxy, uga dhukungan kanggo versi sing beda-beda.

JavaScript kanggo Zabbix

Ing April 2019, Zabbix 4.2 dikenalake karo praproses JavaScript. Akeh wong sing seneng banget babagan gagasan kanggo ninggalake skrip nulis sing njupuk data ing endi wae, nyerna lan nyedhiyakake ing format sing dimangerteni Zabbix, lan nindakake pamriksan prasaja sing bakal nampa data sing durung siap kanggo panyimpenan lan diproses dening Zabbix, lan banjur proses stream data iki nggunakake alat Zabbix lan JavaScript. Magepokan karo panemuan tingkat rendah lan item gumantung sing muncul ing Zabbix 3.4, kita entuk konsep sing cukup fleksibel kanggo ngurutake lan ngatur data sing ditampa.

Ing Zabbix 4.4, minangka tutugan logis saka pra-proses ing JavaScript, cara kabar anyar wis muncul - Webhook, sing bisa digunakake kanggo nggabungake kabar Zabbix kanthi gampang karo aplikasi pihak katelu.

JavaScript lan Duktapes

Napa JavaScript lan Duktape dipilih? Macem-macem pilihan kanggo basa lan mesin dianggep:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • Javascript - JerryScript
  • Python sing dipasang
  • Semat Perl

Kritéria pilihan utama yaiku prevalensi, gampang integrasi mesin menyang produk, konsumsi sumber daya sing sithik lan kinerja mesin sakabèhé, lan safety ngenalke kode ing basa iki kanggo ngawasi. Adhedhasar kombinasi indikator, JavaScript menang ing mesin Duktape.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript

Kriteria pilihan lan tes kinerja

Fitur Duktape:

- Standar ECMAScript E5/E5.1
- Modul Zabbix kanggo Duktape:

  • Zabbix.log () - ngijini sampeyan kanggo nulis pesen karo macem-macem tingkat rinci langsung menyang log Zabbix Server, kang ndadekake iku bisa kanggo korelasi kasalahan, Contone, ing Webhook, karo negara server.
  • CurlHttpRequest () - ngijini sampeyan kanggo nggawe panjalukan HTTP kanggo jaringan, kang adhedhasar nggunakake Webhook.
  • atob () lan btoa () - ngijini sampeyan kanggo encode lan decode strings ing format Base64.

CATETAN. Duktape tundhuk karo standar ACME. Zabbix nggunakake skrip versi 2015. Owah-owahan sakteruse mung cilik, mula bisa diabaikan..

JavaScript Magic

Kabeh keajaiban JavaScript dumunung ing ngetik dinamis lan jinis casting: string, numerik, lan boolean.

Iki tegese ora perlu ngumumake luwih dhisik apa jinis variabel sing kudu ngasilake nilai.

Ing operasi matematika, nilai sing dibalekake dening operator fungsi diowahi dadi angka. Pangecualian kanggo operasi kasebut yaiku tambahan, amarga yen paling ora salah siji saka istilah kasebut minangka string, konversi string ditrapake kanggo kabeh istilah.

CATETAN. Cara sing tanggung jawab kanggo transformasi kasebut biasane ditindakake ing prototipe induk obyek, regane ΠΈ toString. regane disebut sak konversi numerik lan tansah sadurunge cara toString. Metode regane kudu ngasilake nilai primitif, yen ora, asile ora digatekake.

Metode diarani obyek nilaiOF. Yen ora ditemokake utawa ora ngasilake nilai primitif, metode kasebut diarani toString. Yen cara toString ora ketemu, nggoleki regane ing prototipe obyek, lan kabeh diulang nganti pangolahan nilai rampung lan kabeh nilai ing ekspresi dibuwang menyang jinis sing padha. Yen obyek nindakake metode toString, sing ngasilake nilai primitif, banjur digunakake kanggo konversi senar. Nanging, asil nglamar cara iki ora kudu senar.

Contone, yen kanggo obyek 'obj' cara ditetepake toString,

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

cara toString ngasilake persis senar, lan nalika nambah senar karo nomer, kita njaluk senar terpaku:

`obj + 1 // '2001'` 

`obj + 'a' // β€˜200a'`

Nanging yen sampeyan nulis maneh toStringsupaya cara kanggo ngasilake nomer, nalika obyek ditambahake, operasi math karo konversi numerik bakal dileksanakake lan asil saka tambahan math bakal dijupuk.

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

`obj + 1 // '2001'`

Ing kasus iki, yen kita nindakake tambahan karo senar, konversi senar dileksanakake, lan kita njaluk senar glued.

`obj + 'a' // β€˜200a'`

Iki minangka alesan kanggo akeh kesalahan dening pangguna JavaScript pemula.

Metode toString sampeyan bisa nulis fungsi sing bakal nambah nilai obyek saiki kanthi 1.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript
Eksekusi script, kasedhiya yen variabel padha karo 3, lan uga padha karo 4.

Yen dibandhingake karo cast (==), cara dieksekusi saben wektu toString kanthi fungsi nambah nilai. Patut, karo saben comparison sakteruse, Nilai mundhak. Iki bisa nyingkiri kanthi nggunakake non-cast comparison (===).

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript
Comparison tanpa jinis casting

CATETAN. Aja Gunakake Cast Comparison tanpa perlu.

Kanggo skrip rumit, kayata Webhooks kanthi logika rumit, sing mbutuhake perbandingan karo jinis casting, disaranake kanggo nulis sadurunge mriksa kanggo nilai sing ngasilake variabel lan nangani inconsistencies lan kesalahan.

Webhook Media

Ing pungkasan 2019 lan awal 2020, tim integrasi Zabbix wis aktif ngembangake Webhooks lan integrasi out-of-the-box sing teka karo distribusi Zabbix.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript
Link menyang dokumentasi

Preprocessing

  • Tekane saka preprocessing ing JavaScript ndadekake iku bisa kanggo ninggalake paling script external, lan saiki ing Zabbix sampeyan bisa njaluk sembarang nilai lan ngowahi menyang Nilai temen beda.
  • Preprocessing ing Zabbix dileksanakake dening kode JavaScript, sing, nalika disusun dadi bytecode, diowahi dadi fungsi sing njupuk nilai siji minangka parameter. Nilai minangka senar (senar bisa ngemot angka lan nomer).
  • Wiwit output minangka fungsi, ing mburi script dibutuhake bali.
  • Sampeyan bisa nggunakake macro khusus ing kode kasebut.
  • Sumber daya bisa diwatesi ora mung ing tingkat sistem operasi, nanging uga kanthi program. Langkah preprocessing dialokasikan maksimal 10 megabyte RAM lan watesan wektu mbukak 10 detik.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript

CATETAN. Nilai wektu entek 10 detik cukup akeh, amarga ngumpulake ewu item data sing kondisional sajrone 1 detik miturut skenario preprocessing sing rada "abot" bisa nyuda Zabbix. Mulane, ora dianjurake kanggo nggunakake preprocessing kanggo nglakokake skrip JavaScript lengkap liwat unsur data bayangan (item goblok) sing diarani mung kanggo nindakake preprocessing..

Sampeyan bisa mriksa kode liwat test preprocessing utawa nggunakake sarana 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`

Tugas praktis

Tujuan 1

Ganti item sing diwilang karo preprocessing.

Kahanan: Entuk suhu ing Fahrenheit saka sensor kanggo nyimpen ing Celsius.

Sadurunge, kita bakal nggawe item sing ngumpulake suhu ing derajat Fahrenheit. Sawise iku, item data liyane (diwilang) sing bakal ngowahi Fahrenheit dadi Celsius nggunakake rumus.

Masalah:

  • Sampeyan perlu kanggo duplikat unsur data lan nyimpen kabeh nilai ing database.
  • Sampeyan kudu setuju ing interval kanggo item data "tiyang sepah" sing diwilang lan digunakake ing rumus, lan kanggo item data diwilang. Yen ora, item sing diwilang bisa dadi ora didhukung utawa ngetung nilai sadurunge, sing bakal mengaruhi linuwih asil pemantauan.

Salah sawijining solusi yaiku kanggo pindhah saka interval mriksa fleksibel kanggo interval tetep kanggo mesthekake yen item sing diitung dievaluasi sawise item sing nampa data kasebut (ing kasus kita, suhu ing derajat Fahrenheit).

Nanging yen, contone, kita nggunakake cithakan kanggo mriksa nomer akeh piranti, lan mriksa wis dileksanakake sapisan saben 30 detik, Zabbix "hacks" kanggo 29 detik, lan ing detik pungkasan wiwit mriksa lan ngitung. Iki nggawe antrian lan mengaruhi kinerja. Mulane, dianjurake kanggo nggunakake interval tetep mung yen pancene perlu.

Ing masalah iki, solusi sing paling optimal yaiku preprocessing JavaScript siji-baris sing ngowahi derajat Fahrenheit dadi derajat Celsius:

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

Iku cepet lan gampang, sampeyan ora perlu kanggo nggawe item data rasah lan tetep sajarah ing, lan sampeyan uga bisa nggunakake interval fleksibel kanggo mriksa.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript

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

Nanging, yen ing kahanan hipotetis perlu nambah unsur data sing ditampa, umpamane, kanthi konstan sing ditetepake ing makro, kudu digatekake yen parameter kasebut Nilai ngembang dadi senar. Ing operasi tambahan senar, rong senar mung digabung dadi siji.

Kita ngatasi masalah praktis ing Zabbix nggunakake JavaScript

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

Kanggo entuk asil operasi matΓ©matika, perlu ngowahi jinis-jinis nilai sing dipikolehi menyang format numerik. Kanggo iki sampeyan bisa nggunakake fungsi parseInt(), sing ngasilake integer, fungsi parseFloat(), sing ngasilake desimal, utawa fungsi nomer, sing ngasilake integer utawa desimal.

Masalah 2

Entuk wektu ing sawetara detik nganti pungkasan sertifikat.

Kahanan: layanan ngetokake tanggal kadaluwarsa sertifikat ing format "Feb 12 12:33:56 2022 GMT".

Ing ECMAScript5 date.parse() nampa tanggal ing format ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). Sampeyan kudu ngirim string menyang format MMM DD YYYY HH:mm:ss ZZ

masalah: Nilai sasi ditulis minangka teks, ora minangka nomer. Data ing format iki ora ditampa dening Duktape.

Tuladha Solusi:

  • Kaping pisanan, variabel diumumake sing njupuk nilai (kabeh skrip minangka deklarasi variabel sing didhaptar dipisahake karo koma).

  • Ing baris pisanan kita entuk tanggal ing parameter Nilai lan misahake kanthi spasi nggunakake metode kasebut pamisah. Mangkono, kita entuk array, ing ngendi saben unsur saka array, wiwit indeks 0, cocog karo siji unsur tanggal sadurunge lan sawise spasi. pamisah (0) - wulan, pamisah (1) - nomer, pamisah (2) - senar karo wektu, etc. SawisΓ© iku, saben unsur tanggal bisa diakses dening indeks ing Uploaded.

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

  • Saben wulan (ing urutan kronologis) cocog karo indeks posisi ing larik (saka 0 nganti 11). Kanggo ngowahi nilai teks dadi angka numerik, siji ditambahake menyang indeks sasi (amarga sasi diwenehi nomer wiwit 1). Ing kasus iki, ekspresi kanthi tambahan siji dijupuk ing kurung, amarga yen ora, senar bakal dipikolehi, dudu nomer. Ing pungkasan kita nindakake irisan() - Cut Uploaded saka mburi kanggo ninggalake mung rong karakter (sing penting kanggo sasi karo nomer loro-digit).

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

  • Kita mbentuk senar ing format ISO saka nilai sing dipikolehi kanthi tambahan senar biasa ing urutan sing cocog.

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

Data ing format sing diasilake yaiku jumlah detik saka 1970 nganti sawetara titik ing mangsa ngarep. Meh mokal kanggo nggunakake data ing format sing ditampa ing pemicu, amarga Zabbix ngidini sampeyan kanggo operate mung karo macro. {Tanggal} ΠΈ {Wektu}, sing ngasilake tanggal lan wektu ing format sing ramah pangguna.

  • Banjur kita bisa entuk tanggal saiki ing JavaScript ing format Unix Timestamp lan nyuda saka tanggal kadaluwarsa sertifikat sing diasilake kanggo entuk jumlah milidetik wiwit saiki nganti sertifikat kadaluwarsa.

`now = Date.now();`

  • Kita dibagi nilai sing ditampa kanthi sewu kanggo entuk detik ing Zabbix.

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

Ing pemicu, sampeyan bisa nemtokake ekspresi 'pungkasan' diterusake karo sakumpulan digit sing cocog karo jumlah detik ing wektu sing sampeyan pengin nanggapi, contone, ing minggu. Mangkono, pemicu bakal ngabari yen sertifikat kadaluwarsa sajrone seminggu.

CATETAN. Pay manungsa waΓ© kanggo panggunaan parseInt() ing fungsi balikanggo ngowahi nomer pecahan asil saka divisi saka milliseconds kanggo integer. Sampeyan uga bisa nggunakake parseFloat() lan nyimpen data pecahan.

Watch laporan

Source: www.habr.com

Add a comment