Urang ngajawab masalah praktis dina Zabbix maké JavaScript

Urang ngajawab masalah praktis dina Zabbix maké JavaScript
Tikhon Uskov, Insinyur tim integrasi Zabbix

Zabbix mangrupikeun platform anu disesuaikan anu dianggo pikeun ngawas data naon waé. Kusabab versi Zabbix pangheubeulna, pangurus mantau geus miboga kamampuh pikeun ngajalankeun rupa Aksara via lampah pikeun mariksa titik jaringan target. Dina waktos anu sami, peluncuran naskah nyababkeun sababaraha kasusah, kalebet kabutuhan pikeun ngadukung naskah, pangirimanna ka titik komunikasi sareng proksi, ogé dukungan pikeun vérsi anu béda.

JavaScript pikeun Zabbix

Dina April 2019, Zabbix 4.2 diwanohkeun ku JavaScript preprocessing. Seueur jalma bungah ngeunaan ideu pikeun ngantunkeun tulisan naskah anu nyandak data dimana waé, nyerna sareng nyayogikeun dina format anu kahartos Zabbix, sareng ngalaksanakeun cek saderhana anu bakal nampi data anu henteu siap pikeun disimpen sareng diolah ku Zabbix, sareng teras ngolah aliran data ieu nganggo alat Zabbix sareng JavaScript. Kalayan penemuan tingkat rendah sareng barang gumantung anu muncul dina Zabbix 3.4, kami ngagaduhan konsép anu cukup fleksibel pikeun nyortir sareng ngatur data anu ditampi.

Dina Zabbix 4.4, salaku tuluyan logis tina pra-processing dina JavaScript, metoda bewara anyar geus mucunghul - Webhook, nu bisa dipaké pikeun gampang ngahijikeun bewara Zabbix kalawan aplikasi pihak katilu.

JavaScript jeung Duktapes

Naha JavaScript sareng Duktape dipilih? Rupa-rupa pilihan pikeun basa sareng mesin dianggap:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • JavaScript - JerryScript
  • Python dipasangan
  • Dipasangkeun Perl

Kriteria Pilihan utama nya éta Prévalénsi, betah integrasi mesin kana produk, konsumsi sumberdaya low jeung kinerja sakabéh mesin, sarta kaamanan ngawanohkeun kode dina basa ieu kana monitoring. Dumasar kombinasi indikator, JavaScript meunang dina mesin Duktape.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript

Kriteria Pilihan sareng uji kinerja

Keunggulan Duktape:

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

  • Zabbix.log () - ngidinan Anjeun pikeun nulis pesen kalawan tingkat béda tina jéntré langsung kana log Zabbix Server, nu ngamungkinkeun pikeun correlate kasalahan, Contona, dina Webhook, kalawan kaayaan server.
  • CurlHttpRequest () - ngidinan Anjeun pikeun requests HTTP pikeun jaringan, nu dumasar kana pamakéan Webhook.
  • atob () sarta btoa () - ngidinan Anjeun pikeun encode na decode string dina format Base64.

CATETAN. Duktape sasuai jeung standar ACME. Zabbix ngagunakeun versi 2015 naskah. Parobahan saterasna sakedik, janten tiasa dipaliré..

magic JavaScript

Sadaya keajaiban JavaScript aya dina ngetik dinamis sareng jinis tuang: string, numerik, sareng boolean.

Ieu ngandung harti yén teu perlu dibewarakeun sateuacanna naon tipe variabel kudu balik nilai a.

Dina operasi matematik, nilai-nilai anu dipulangkeun ku operator fungsi dirobih kana angka. Pangecualian pikeun operasi sapertos kitu nyaéta tambihan, sabab upami sahenteuna salah sahiji istilah nyaéta senar, konvérsi string diterapkeun ka sadaya istilah.

CATETAN. Métode anu tanggung jawab pikeun transformasi sapertos kitu biasana dilaksanakeun dina prototipe induk obyék, nilaiOf и kaString. nilaiOf disebut salila konversi numeris tur salawasna saméméh métode kaString. Métode nilaiOf kudu balik nilai primitif, disebutkeun hasilna teu dipaliré.

Hiji métode disebut dina hiji obyék nilaiOF. Lamun teu kapanggih atawa teu balik a nilai primitif, metoda disebut kaString. Lamun métode kaString teu kapanggih, néangan nilaiOf dina prototipe obyék, sareng sadayana diulang dugi ka ngolah nilai réngsé sareng sadaya nilai dina éksprési tuang kana jinis anu sami. Lamun obyék implements métode kaString, nu mulih hiji nilai primitif, mangka éta nu dipaké pikeun konversi string. Sanajan kitu, hasil tina nerapkeun metoda ieu teu merta string a.

Contona, upami pikeun obyék 'objék'Metode ditetepkeun kaString,

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

metode kaString mulih persis string, sarta lamun nambahkeun string kalawan angka, urang meunang string glued:

`obj + 1 // '2001'` 

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

Tapi lamun nulis deui kaString, Ku kituna métode balik angka, nalika obyék ditambahkeun, operasi matematik jeung konversi numerik bakal dipigawé sarta hasil tina tambahan matematik bakal diala.

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

`obj + 1 // '2001'`

Dina hal ieu, lamun urang ngalakukeun tambahan kalawan string a, konversi string dipigawé, sarta kami meunang string glued.

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

Ieu mangrupikeun alesan pikeun seueur kasalahan ku pangguna JavaScript novice.

Metodeu kaString Anjeun tiasa nyerat fungsi anu bakal ningkatkeun nilai obyék ayeuna ku 1.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript
Palaksanaan naskah, upami variabelna sami sareng 3, sareng sami sareng 4.

Upami dibandingkeun sareng tuang (==), metodena dieksekusi unggal waktos kaString kalawan fungsi nambahan nilai. Sasuai, kalawan unggal ngabandingkeun saterusna, nilai naek. Ieu bisa dihindari ku ngagunakeun non-cast ngabandingkeun (===).

Urang ngajawab masalah praktis dina Zabbix maké JavaScript
Babandingan tanpa tipe casting

CATETAN. Ulah Paké Cast Babandingan Unnecessarily.

Pikeun skrip kompleks, sapertos Webhooks kalayan logika kompleks, anu peryogi ngabandingkeun sareng jinis tuang, disarankeun pikeun tos nyerat cék pikeun nilai anu mulangkeun variabel sareng nanganan inconsistencies sareng kasalahan.

Média Webhook

Dina ahir 2019 sareng awal 2020, tim integrasi Zabbix parantos aktip ngembangkeun Webhooks sareng integrasi out-of-the-box anu aya dina distribusi Zabbix.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript
Tautan ka dokuméntasi

Ngalaksanakeun

  • Advent of preprocessing dina JavaScript ngamungkinkeun pikeun abandon lolobana Aksara éksternal, sarta ayeuna di Zabbix anjeun bisa meunangkeun nilai nu mana wae nu tur ngarobah kana nilai lengkep beda.
  • Preprocessing di Zabbix dilaksanakeun ku kode JavaScript, anu, nalika disusun kana bytecode, dirobih janten fungsi anu nyandak hiji nilai salaku parameter. ajen salaku string (string bisa ngandung duanana angka jeung angka).
  • Kusabab kaluaran mangrupikeun fungsi, dina tungtung naskah diperyogikeun kasumpingan.
  • Kasebut nyaéta dimungkinkeun pikeun ngagunakeun macros custom dina kode.
  • Sumberdaya bisa diwatesan teu ukur dina tingkat sistem operasi, tapi ogé programmatically. Léngkah preprocessing dialokasikeun maksimal 10 megabyte RAM sareng wates waktos jalanna 10 detik.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript

CATETAN. Nilai timeout 10 detik cukup loba, sabab ngumpulkeun rébuan kondisional item data dina 1 detik nurutkeun skenario preprocessing rada "beurat" bisa ngalambatkeun turun Zabbix. Ku alatan éta, teu dianjurkeun ngagunakeun preprocessing sangkan ngaéksekusi pinuh-fledged JavaScript Aksara ngaliwatan disebut elemen data kalangkang (item dummy), nu ngajalankeun ngan pikeun ngalakukeun preprocessing..

Anjeun tiasa pariksa kode anjeun ngaliwatan tés preprocessing atawa ngagunakeun utiliti 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

tugas 1

Ngaganti item diitung ku preprocessing.

Kaayaan: Meunangkeun suhu dina Fahrenheit ti sensor pikeun nyimpen dina Celsius.

Saméméhna, urang bakal nyieun hiji item nu ngumpulkeun hawa dina derajat Fahrenheit. Sanggeus éta, item data sejen (diitung) nu bakal ngarobah Fahrenheit ka Celsius ngagunakeun rumus.

Anu jadi masalah:

  • Perlu duplikat elemen data sareng nyimpen sadaya nilai dina pangkalan data.
  • Anjeun kudu satuju kana interval pikeun "indungna" item data nu diitung sarta dipaké dina rumus, sarta pikeun item data diitung. Upami teu kitu, item nu diitung bisa balik kana kaayaan unsupported atawa ngitung nilai saméméhna, nu bakal mangaruhan reliabilitas hasil monitoring.

Hiji leyuran éta mindahkeun jauh ti interval dipariksa fléksibel dina ni'mat interval tetep pikeun mastikeun yén item diitung ieu dievaluasi sanggeus item nu narima data (dina hal urang, suhu dina derajat Fahrenheit).

Tapi lamun, contona, urang ngagunakeun citakan mariksa angka nu gede ngarupakeun alat, sarta dipariksa dipigawé sakali unggal 30 detik, Zabbix "hacks" pikeun 29 detik, sarta dina detik panungtungan dimimitian mariksa jeung ngitung. Ieu nyiptakeun antrian sarta mangaruhan kinerja. Ku alatan éta, dianjurkeun pikeun ngagunakeun interval tetep ngan lamun bener diperlukeun.

Dina masalah ieu, solusi optimal nyaéta hiji-garis JavaScript preprocessing nu ngarobah derajat Fahrenheit kana derajat Celsius:

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

Ieu gancang sarta gampang, anjeun teu perlu nyieun item data perlu tur nyimpen hiji sajarah dina eta, jeung anjeun ogé tiasa make interval fléksibel pikeun cék.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript

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

Tapi, upami dina kaayaan hipotésis perlu pikeun nambihan unsur data anu ditampi, contona, kalayan konstanta anu ditetepkeun dina makro, éta kedah dipertimbangkeun yén parameter ajen expands kana string a. Dina operasi tambahan senar, dua senar ngan saukur digabungkeun jadi hiji.

Urang ngajawab masalah praktis dina Zabbix maké JavaScript

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

Pikeun meunangkeun hasil tina operasi matematik, perlu pikeun ngarobah jenis nilai diala kana format numerik. Pikeun ieu anjeun tiasa nganggo fungsi parseInt(), nu ngahasilkeun integer, hiji fungsi parseFloat(), nu ngahasilkeun decimal, atawa fungsi jumlah, nu mulih integer atawa decimal.

Tugas 2

Meunangkeun waktu dina detik nepi ka ahir sertipikat.

Kaayaan: jasa ngaluarkeun tanggal béakna sertipikat dina format "Feb 12 12:33:56 2022 GMT".

Dina ECMAScript5 date.parse() nampi tanggal dina format ISO 8601 (YYYY-MM-DDTHH: mm: ss.sssZ). Anjeun kedah tuang senar dina format MMM DD YYYY HH:mm:ss ZZ

masalah: Nilai bulan dinyatakeun salaku téks, teu salaku angka. Data dina format ieu teu ditarima ku Duktape.

Contona solusi:

  • Anu mimiti, variabel dinyatakeun anu nyandak nilai (sakabeh naskah mangrupikeun deklarasi variabel anu didaptarkeun dipisahkeun ku koma).

  • Dina baris kahiji urang meunang tanggal dina parameter ajen tur misahkeunana ku spasi ngagunakeun métode Beulah. Ku kituna, urang meunang hiji Asép Sunandar Sunarya, dimana unggal unsur Asép Sunandar Sunarya, dimimitian dina indéks 0, pakait jeung hiji unsur tanggal saméméh jeung sanggeus spasi. pamisah (0) - sasih, pamisah (1) - angka, pamisah (2) - a string kalawan waktu, jsb Sanggeus éta, unggal unsur tanggal bisa diakses ku indéks dina Asép Sunandar Sunarya dina.

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

  • Unggal bulan (dina urutan kronologis) pakait jeung indéks posisi na dina Asép Sunandar Sunarya (ti 0 nepi ka 11). Pikeun ngarobah nilai téks kana nilai numerik, hiji ditambahkeun kana indéks bulan (sabab bulan nu wilanganana dimimitian ti 1). Dina hal ieu, éksprési ditambah hiji dicokot dina kurung, sabab disebutkeun string bakal diala, moal angka. Dina tungtungna urang ngalakukeun nyiksikan() - motong Asép Sunandar Sunarya ti tungtung ninggalkeun ukur dua karakter (anu penting pikeun sababaraha bulan jeung angka dua-angka).

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

  • Kami ngabentuk senar dina format ISO tina nilai anu diala ku tambihan senar biasa dina urutan anu pas.

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

Data dina format hasilna nyaeta jumlah detik ti 1970 nepi ka sababaraha titik dina mangsa nu bakal datang. Ampir teu mungkin ngagunakeun data dina format anu ditampi dina pemicu, sabab Zabbix ngamungkinkeun anjeun ngan ukur beroperasi sareng makro. {Kaping} и {Waktos}, anu ngabalikeun tanggal sareng waktos dina format anu ramah-pamaké.

  • Urang teras tiasa kéngingkeun tanggal ayeuna dina JavaScript dina format Unix Timestamp sareng ngirangan tina tanggal béakna sertipikat anu dihasilkeun pikeun kéngingkeun jumlah milliseconds ti ayeuna dugi ka sertipikat béakna.

`now = Date.now();`

  • Kami ngabagi nilai anu ditampi ku sarébu pikeun kéngingkeun detik dina Zabbix.

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

Dina pemicu, anjeun tiasa netepkeun ekspresi 'panungtungan' dituturkeun ku sakumpulan digit nu pakait jeung jumlah detik dina periode nu Anjeun hoyong ngabales, contona, dina minggu. Ku kituna, pemicu bakal ngabéjaan yén sertipikat kadaluwarsa dina saminggu.

CATETAN. Nengetan panggunaan parseInt() dina fungsi kasumpinganpikeun ngarobah bilangan pecahan hasil tina ngabagi milliseconds kana integer. Anjeun oge bisa make parseFloat() jeung nyimpen data pecahan.

Lalajo laporan

sumber: www.habr.com

Tambahkeun komentar