Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript
Tikhon Uskov, Zabbix entegrasyon ekip enjenyè

Zabbix se yon platfòm customizable ki itilize pou kontwole nenpòt kalite done. Depi premye vèsyon Zabbix yo, administratè siveyans yo te gen kapasite pou yo kouri plizyè script atravè Aksyon pou chèk sou nœuds rezo sib. An menm tan an, lansman scripts te mennen nan yon kantite difikilte, tankou bezwen pou sipòte scripts, livrezon yo nan nœuds kominikasyon ak proxy, osi byen ke sipò pou diferan vèsyon.

JavaScript pou Zabbix

Nan mwa avril 2019, Zabbix 4.2 te prezante ak JavaScript preprocessing. Anpil moun te eksite sou lide abandone ekriti ekriti ki pran done yon kote, dijere yo epi bay li nan yon fòma ke Zabbix konprann, epi fè chèk senp ki pral resevwa done ki pa pare pou estoke ak trete pa Zabbix, ak Lè sa a, trete kouran done sa a lè l sèvi avèk Zabbix ak zouti JavaScript. An konjonksyon avèk dekouvèt nivo ki ba ak atik depandan ki te parèt nan Zabbix 3.4, nou te resevwa yon konsèp san patipri fleksib pou klasman ak jere done yo resevwa yo.

Nan Zabbix 4.4, kòm yon kontinyasyon lojik nan pre-pwosesis nan JavaScript, yon nouvo metòd notifikasyon parèt - Webhook, ki ka itilize fasilman entegre notifikasyon Zabbix ak aplikasyon pou twazyèm pati.

JavaScript ak Duktapes

Poukisa yo te chwazi JavaScript ak Duktape? Yo te konsidere plizyè opsyon pou lang ak motè:

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

Kritè seleksyon prensipal yo te prévalence, fasilite nan entegrasyon motè a nan pwodwi a, konsomasyon resous ki ba ak pèfòmans jeneral motè a, ak sekirite nan entwodwi kòd nan lang sa a nan siveyans. Ki baze sou konbinezon an nan endikatè, JavaScript te genyen sou motè a Duktape.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript

Kritè seleksyon ak tès pèfòmans

Karakteristik Duktape:

— Estanda ECMAScript E5/E5.1
- Zabbix modil pou Duktape:

  • Zabbix.log() - pèmèt ou ekri mesaj ki gen diferan nivo detay dirèkteman nan jounal sèvè Zabbix la, sa ki fè li posib korelasyon erè, pou egzanp, nan yon Webhook, ak eta a sèvè.
  • CurlHttpRequest() - pèmèt ou fè demann HTTP nan rezo a, sou ki itilize Webhook la baze.
  • atob() ak btoa() - pèmèt ou kode ak dekode fisèl nan fòma Base64.

REMAK. Duktape konfòm ak estanda ACME. Zabbix itilize vèsyon an 2015 nan script la. Chanjman ki vin apre yo se minè, kidonk yo ka inyore..

JavaScript majik

Tout maji JavaScript se nan sezisman dinamik ak depoze kalite: fisèl, nimerik, ak boolean.

Sa vle di ke li pa nesesè pou deklare davans ki kalite varyab la ta dwe retounen yon valè.

Nan operasyon matematik, valè yo retounen pa operatè fonksyon yo konvèti nan nimewo. Eksepsyon nan operasyon sa yo se adisyon, paske si omwen youn nan tèm yo se yon fisèl, konvèsyon fisèl yo aplike nan tout tèm.

REMAK. Metòd ki responsab transfòmasyon sa yo anjeneral aplike nan pwototip paran objè a, valè и toString. valè rele pandan konvèsyon nimerik ak toujou anvan metòd la toString. Metòd valè dwe retounen valè primitif, otreman rezilta li yo inyore.

Yo rele yon metòd sou yon objè valèOF. Si li pa jwenn oswa li pa retounen yon valè primitif, yo rele metòd la toString. Si metòd la toString pa jwenn, chache valè nan pwototip objè a, ak tout bagay repete jiskaske pwosesis la nan valè a fini ak tout valè nan ekspresyon an jete nan menm kalite a.. Si objè a aplike yon metòd toString, ki retounen yon valè primitif, Lè sa a, se li ki itilize pou konvèsyon fisèl. Sepandan, rezilta a nan aplike metòd sa a se pa nesesèman yon fisèl.

Pou egzanp, si pou pou objè 'objè' metòd defini toString,

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

metòd toString retounen egzakteman yon fisèl, epi lè ajoute yon fisèl ak yon nimewo, nou jwenn yon fisèl kole:

`obj + 1 // '2001'` 

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

Men, si ou reekri toString, pou metòd la retounen yon nimewo, lè yo ajoute objè a, yo pral fè yon operasyon matematik ak yon konvèsyon nimerik epi yo pral jwenn rezilta adisyon matematik la.

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

`obj + 1 // '2001'`

Nan ka sa a, si nou fè adisyon ak yon fisèl, yon konvèsyon fisèl fèt, epi nou jwenn yon fisèl kole.

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

Sa a se rezon ki fè yon gwo kantite erè pa itilizatè JavaScript inisyasyon.

Metòd la toString ou ka ekri yon fonksyon ki pral ogmante valè aktyèl objè a pa 1.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript
Egzekisyon script la, depi varyab la egal a 3, epi li egal a 4 tou.

Lè yo konpare ak yon jete (==), metòd la egzekite chak fwa toString ak fonksyon ogmantasyon valè. An konsekans, ak chak konparezon ki vin apre, valè a ogmante. Sa a ka evite lè w itilize konparezon ki pa jete (===).

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript
Konparezon san yo pa depoze kalite

REMAK. Pa sèvi ak konparezon jete san nesesite.

Pou scripts konplèks, tankou Webhooks ak lojik konplèks, ki mande pou konpare ak kalite Distribisyon, li rekòmande pou pre-ekri chèk pou valè yo ki retounen varyab ak jere enkonsistans ak erè.

Webhook Media

Nan fen ane 2019 ak kòmansman ane 2020, ekip entegrasyon Zabbix la te devlope aktivman Webhooks ak entegrasyon ki soti nan bwat ki vini ak distribisyon Zabbix la.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript
Link to dokimantasyon

Preprocesman

  • Avènement de preprocessing nan JavaScript te fè li posib abandone pifò scripts ekstèn, ak kounye a nan Zabbix ou ka jwenn nenpòt valè ak konvèti li nan yon valè konplètman diferan.
  • Preprocessing nan Zabbix aplike pa kòd JavaScript, ki, lè konpile nan bytecode, konvèti nan yon fonksyon ki pran yon valè sèl kòm yon paramèt. valè kòm yon fisèl (yon fisèl ka genyen tou de yon chif ak yon nimewo).
  • Depi pwodiksyon an se yon fonksyon, nan fen script la obligatwa retounen.
  • Li posib pou itilize makro koutim nan kòd la.
  • Resous yo ka limite pa sèlman nan nivo sistèm operasyon an, men tou pwogramasyon. Etap pre-pwosesis la resevwa yon maksimòm 10 megabyte RAM ak yon limit tan pou kouri nan 10 segonn.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript

REMAK. Valè delè 10 segonn se byen anpil, paske kolekte plizyè milye atik done kondisyonèl nan 1 segonn dapre yon senaryo preprocessing olye "lou" ka ralanti Zabbix. Se poutèt sa, li pa rekòmande pou itilize pre-pwosesis pou egzekite scripts JavaScript plen véritable atravè sa yo rele eleman done lonbraj yo (atik enbesil), ki kouri sèlman pou fè pre-pwosesis..

Ou ka tcheke kòd ou a atravè tès pre-pwosesis la oswa lè l sèvi avèk sèvis piblik la 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`

Travay pratik

Objektif Travay la 1

Ranplase atik kalkile ak preprocessing.

Kondisyon: Jwenn tanperati a nan Fahrenheit nan Capteur a nan magazen an Sèlsiyis.

Précédemment, nou ta kreye yon atik ki kolekte tanperati a an degre Fahrenheit. Apre sa, yon lòt atik done (kalkile) ki ta konvèti Fahrenheit nan Celsius lè l sèvi avèk yon fòmil.

Pwoblèm:

  • Li nesesè pou kopi eleman done yo epi estoke tout valè yo nan baz done a.
  • Ou dwe dakò sou entèval yo pou atik done "paran" ki kalkile epi itilize nan fòmil la, ak pou atik done kalkile a. Sinon, atik la kalkile ka ale nan yon eta ki pa sipòte oswa kalkile yon valè anvan, ki pral afekte fyab nan rezilta siveyans yo.

Yon solisyon se te deplase lwen entèval chèk fleksib an favè entèval fiks yo asire ke atik la kalkile evalye apre atik la ki resevwa done yo (nan ka nou an, tanperati a an degre Fahrenheit).

Men, si, pou egzanp, nou itilize modèl la pou tcheke yon gwo kantite aparèy, epi chèk la fèt yon fwa chak 30 segonn, Zabbix "rache" pou 29 segonn, ak nan dènye segonn li kòmanse tcheke ak kalkile. Sa a kreye yon keu epi afekte pèfòmans. Se poutèt sa, li rekòmande pou itilize entèval fiks sèlman si li vrèman nesesè.

Nan pwoblèm sa a, solisyon pi bon an se yon pre-pwosesis JavaScript yon sèl-liy ki konvèti degre Fahrenheit an degre Sèlsiyis:

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

Li rapid ak fasil, ou pa bezwen kreye atik done ki pa nesesè epi kenbe yon istwa sou yo, epi ou ka tou itilize entèval fleksib pou chèk yo.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript

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

Men, si nan yon sitiyasyon ipotetik li nesesè ajoute eleman done resevwa a, pou egzanp, ak nenpòt konstan defini nan makro a, li dwe pran an kont ke paramèt la. valè elaji nan yon fisèl. Nan yon operasyon adisyon fisèl, de fisèl yo tou senpleman konbine nan yon sèl.

Nou rezoud pwoblèm pratik nan Zabbix lè l sèvi avèk JavaScript

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

Pou jwenn rezilta yon operasyon matematik, li nesesè konvèti kalite valè yo jwenn nan yon fòma nimerik. Pou sa ou ka itilize fonksyon an parseInt(), ki pwodui yon nonb antye relatif, yon fonksyon parseFloat(), ki pwodui yon desimal, oswa yon fonksyon nimewo, ki retounen yon nonm antye oswa yon desimal.

Travay 2

Jwenn tan an nan segonn jouk nan fen sètifika a.

Kondisyon: yon sèvis bay yon dat ekspirasyon sètifika nan fòma "12 fevriye 12:33:56 2022 GMT".

Nan ECMAScript5 dat.parse() aksepte yon dat nan fòma ISO 8601 (AAAA-MM-DDTHH:mm:ss.sssZ). Li nesesè pou voye yon kòd sou li nan fòma MMM DD AAAA HH:mm:ss ZZ

pwoblèm: Valè mwa a eksprime kòm tèks, pa kòm yon nimewo. Done nan fòma sa a pa aksepte pa Duktape.

Egzanp solisyon:

  • Premye a tout, yo deklare yon varyab ki pran yon valè (script la tout antye se yon deklarasyon sou varyab ki nan lis separe pa vigil).

  • Nan premye liy lan nou jwenn dat la nan paramèt la valè epi separe li ak espas lè l sèvi avèk metòd la fann. Kidonk, nou jwenn yon etalaj, kote chak eleman nan etalaj la, kòmanse nan endèks 0, koresponn ak yon sèl eleman dat anvan ak apre yon espas. fann (0) - mwa, fann (1) - nimewo, fann (2) - yon fisèl ak tan, elatriye Apre sa, chak eleman nan dat la ka jwenn aksè pa endèks nan etalaj la.

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

  • Chak mwa (nan lòd kwonolojik) koresponn ak endèks pozisyon li nan etalaj la (soti nan 0 a 11). Pou konvèti yon valè tèks nan yon valè nimerik, yo ajoute youn nan endèks mwa a (paske mwa yo nimewote kòmanse nan 1). Nan ka sa a, ekspresyon an ak adisyon a nan yon sèl pran nan parantèz, paske otreman yo pral jwenn yon fisèl, pa yon nimewo. Nan fen nou fè tranch () - koupe etalaj la soti nan fen a kite sèlman de karaktè (ki enpòtan pou mwa ak yon nimewo de chif).

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

  • Nou fòme yon fisèl nan fòma ISO soti nan valè yo jwenn pa adisyon abityèl nan fisèl nan lòd ki apwopriye a.

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

Done yo nan fòma ki kapab lakòz yo se kantite segonn soti nan 1970 nan kèk pwen nan tan kap vini an. Li prèske enposib pou itilize done nan fòma resevwa a nan deklanche, paske Zabbix pèmèt ou opere sèlman ak makro. {Dat} и {tan}, ki retounen dat ak lè a nan yon fòma ki fasil pou itilizatè.

  • Lè sa a, nou ka jwenn dat aktyèl la nan JavaScript nan fòma Unix Timestamp epi fè soustraksyon li nan dat ekspirasyon sètifika a ki kapab lakòz pou jwenn kantite milisgond depi kounye a jiskaske sètifika a ekspire.

`now = Date.now();`

  • Nou divize valè a resevwa pa mil pou jwenn segonn nan Zabbix.

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

Nan deklanche a, ou ka presize ekspresyon an 'dènye' ki te swiv pa yon seri chif ki koresponn ak kantite segonn nan peryòd ou vle reponn a, pou egzanp, nan semèn. Kidonk, deklanche a pral fè konnen sètifika a ekspire nan yon semèn.

REMAK. Peye atansyon sou itilizasyon an parseInt() nan fonksyon retounenkonvèti nimewo fraksyon ki soti nan divizyon milisgond nan yon nonb antye. Ou ka itilize tou parseFloat() epi estoke done fraksyon.

Gade rapò

Sous: www.habr.com

Add nouvo kòmantè