Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript
Tikhon Uskov, Zabbix integration team engineer

Ang Zabbix usa ka napasadya nga plataporma nga gigamit sa pag-monitor sa bisan unsang klase sa datos. Sukad sa labing una nga mga bersyon sa Zabbix, ang mga tagdumala sa pagmonitor adunay katakus sa pagpadagan sa lainlaing mga script pinaagi sa mga lihok para sa mga pagsusi sa target nga network nodes. Sa parehas nga oras, ang paglansad sa mga script misangpot sa daghang mga kalisud, lakip na ang panginahanglan sa pagsuporta sa mga script, ang ilang paghatud sa mga node sa komunikasyon ug mga proxy, ingon man suporta alang sa lainlaing mga bersyon.

JavaScript alang sa Zabbix

Niadtong Abril 2019, ang Zabbix 4.2 gipaila uban ang JavaScript preprocessing. Daghang mga tawo ang naghinamhinam bahin sa ideya nga biyaan ang pagsulat sa mga script nga nagdala sa datos sa usa ka lugar, tunawon kini ug ihatag kini sa usa ka pormat nga nasabtan ni Zabbix, ug paghimo mga yano nga pagsusi nga makadawat mga datos nga dili andam alang sa pagtipig ug pagproseso sa Zabbix, ug unya iproseso kini nga data stream gamit ang Zabbix ug JavaScript nga mga himan. Kauban sa ubos nga lebel nga pagkadiskobre ug nagsalig nga mga butang nga nagpakita sa Zabbix 3.4, nakakuha kami usa ka medyo flexible nga konsepto alang sa paghan-ay ug pagdumala sa nadawat nga datos.

Sa Zabbix 4.4, isip usa ka lohikal nga pagpadayon sa pre-processing sa JavaScript, usa ka bag-ong pamaagi sa pagpahibalo ang nagpakita - Webhook, nga magamit aron dali nga mahiusa ang mga abiso sa Zabbix sa mga aplikasyon sa ikatulo nga partido.

JavaScript ug Duktapes

Ngano nga gipili ang JavaScript ug Duktape? Ang lainlaing mga kapilian alang sa mga sinultian ug makina gikonsiderar:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • Javascript - Duktape
  • JavaScript - JerryScript
  • Naka-embed nga Python
  • Gibutang nga Perl

Ang nag-unang criteria sa pagpili mao ang pagkaylap, kasayon ​​sa pag-integrate sa makina ngadto sa produkto, ubos nga konsumo sa kapanguhaan ug kinatibuk-ang performance sa makina, ug ang kaluwasan sa pagpaila sa code niini nga pinulongan ngadto sa pagmonitor. Base sa kombinasyon sa mga indicators, ang JavaScript midaog sa Duktape engine.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript

Kriterya sa pagpili ug pagsulay sa pasundayag

Mga Feature sa Duktape:

β€” Sumbanan ECMAScript E5/E5.1
- Zabbix modules para sa Duktape:

  • Zabbix.log() - nagtugot kanimo sa pagsulat sa mga mensahe nga adunay lainlaing lebel sa detalye direkta ngadto sa Zabbix Server log, nga nagpaposible sa pag-correlate sa mga sayop, pananglitan, sa usa ka Webhook, sa estado sa server.
  • CurlHttpRequest() - nagtugot kanimo sa paghimo sa HTTP nga mga hangyo sa network, diin ang paggamit sa Webhook gibase.
  • atob () ug btoa () - nagtugot kanimo sa pag-encode ug pag-decode sa mga string sa Base64 format.

PAHINUMDOM. Ang Duktape nagsunod sa mga sumbanan sa ACME. Gigamit ni Zabbix ang 2015 nga bersyon sa script. Ang sunod nga mga pagbag-o gamay ra, mao nga kini mahimong dili tagdon..

JavaScript Magic

Ang tanan nga salamangka sa JavaScript anaa sa dinamikong pag-type ug pag-type sa casting: string, numeric, ug boolean.

Kini nagpasabut nga dili kinahanglan nga ipahayag daan kung unsang klase ang kinahanglan nga ibalik sa variable ang usa ka kantidad.

Sa mga operasyon sa matematika, ang mga kantidad nga gibalik sa mga operator sa function nakabig sa mga numero. Ang eksepsiyon sa ingon nga mga operasyon mao ang pagdugang, tungod kay kung labing menos usa sa mga termino usa ka hilo, ang pagkakabig sa hilo magamit sa tanan nga mga termino.

PAHINUMDOM. Ang mga pamaagi nga responsable sa ingon nga mga pagbag-o kasagarang gipatuman sa mga prototype sa ginikanan sa butang, biliOf ΠΈ saString. biliOf gitawag atol sa numerical conversion ug kanunay sa wala pa ang pamaagi saString. Pamaagi biliOf kinahanglan ibalik ang mga primitive nga kantidad, kung dili ang resulta niini dili tagdon.

Ang usa ka pamaagi gitawag sa usa ka butang biliOF. Kung wala kini makit-an o wala ibalik ang usa ka primitive nga kantidad, ang pamaagi gitawag saString. Kung ang pamaagi saString wala makit-an, nangita biliOf sa prototype sa butang, ug ang tanan gisubli hangtod ang pagproseso sa kantidad nahuman ug ang tanan nga mga kantidad sa ekspresyon gihulog sa parehas nga tipo. Kung ang butang nagpatuman usa ka pamaagi saString, nga nagbalik sa usa ka primitive nga kantidad, unya kini ang gigamit alang sa pagkakabig sa hilo. Bisan pa, ang resulta sa pagpadapat niini nga pamaagi dili kinahanglan nga usa ka hilo.

Pananglitan, kung alang sa butang 'butang' ang pamaagi gihubit saString,

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

Pamaagi saString mibalik sa eksakto nga usa ka hilo, ug kung magdugang usa ka hilo nga adunay usa ka numero, makakuha kami usa ka gipapilit nga hilo:

`obj + 1 // '2001'` 

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

Apan kung imong isulat pag-usab saString, aron ang pamaagi magbalik sa usa ka numero, kung ang butang idugang, usa ka mathematical nga operasyon nga adunay usa ka numeric conversion ang himuon ug ang resulta sa mathematical nga pagdugang makuha.

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

`obj + 1 // '2001'`

Sa kini nga kaso, kung maghimo kita og pagdugang sa usa ka hilo, usa ka pagkakabig sa hilo ang gihimo, ug makakuha kita usa ka glued string.

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

Kini ang hinungdan sa daghang mga sayup sa mga bag-ong tiggamit sa JavaScript.

Ang pamaagi saString mahimo nimong isulat ang usa ka function nga makadugang sa karon nga kantidad sa butang sa 1.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript
Pagpatuman sa script, basta ang variable katumbas sa 3, ug parehas usab kini sa 4.

Kung itandi sa usa ka cast (==), ang pamaagi gipatuman matag higayon saString nga adunay function sa pagtaas sa kantidad. Tungod niini, sa matag sunod nga pagtandi, ang kantidad nagdugang. Mahimo kining malikayan pinaagi sa paggamit sa non-cast nga pagtandi (===).

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript
Pagkumpara nga walay type casting

PAHINUMDOM. Ayaw Gamita ang Pagtandi sa Cast nga Dili Kinahanglan.

Alang sa komplikado nga mga script, sama sa Webhooks nga adunay komplikado nga lohika, nga nanginahanglan pagtandi sa tipo nga paghulma, girekomenda nga isulat nang daan ang mga tseke alang sa mga kantidad nga nagbalik sa mga variable ug pagdumala sa mga panagsumpaki ug mga sayup.

Webhook Media

Sa ulahing bahin sa 2019 ug sa sayong bahin sa 2020, ang Zabbix integration team aktibong nagpalambo sa Webhooks ug out-of-the-box nga mga integrasyon nga nag-uban sa Zabbix distribution.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript
Link sa dokumentasyon

Giproseso na

  • Ang pag-abut sa preprocessing sa JavaScript nagpaposible nga biyaan ang kadaghanan sa mga eksternal nga script, ug karon sa Zabbix mahimo nimong makuha ang bisan unsang kantidad ug mabag-o kini sa usa ka hingpit nga lahi nga kantidad.
  • Ang preprocessing sa Zabbix gipatuman sa JavaScript code, nga, kung giipon sa bytecode, gibag-o sa usa ka function nga nagkuha usa ka kantidad ingon usa ka parameter bili isip usa ka hilo (usa ka hilo mahimong adunay duha ka digit ug usa ka numero).
  • Tungod kay ang output usa ka function, sa katapusan sa script gikinahanglan pagbalik.
  • Posible nga gamiton ang mga custom nga macro sa code.
  • Ang mga kapanguhaan mahimong limitado dili lamang sa lebel sa operating system, apan usab sa programmatically. Ang preprocessing nga lakang gigahin sa usa ka maximum nga 10 megabytes sa RAM ug usa ka run time limit sa 10 segundos.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript

PAHINUMDOM. Ang kantidad sa timeout sa 10 segundos daghan kaayo, tungod kay ang pagkolekta sa kondisyon nga libu-libo nga mga butang sa datos sa 1 segundo sumala sa usa ka medyo "bug-at" nga senaryo sa preprocessing makapahinay sa Zabbix. Busa, wala girekomendar ang paggamit sa preprocessing aron sa pagpatuman sa hingpit nga JavaScript scripts pinaagi sa gitawag nga shadow data elements (dummy items), nga gipadagan lamang aron sa paghimo sa preprocessing..

Mahimo nimong susihon ang imong code pinaagi sa preprocessing test o gamit ang utility 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`

Praktikal nga mga buluhaton

Tumong 1

Ilisan ang kalkulado nga butang sa preprocessing.

Kahimtang: Kuhaa ang temperatura sa Fahrenheit gikan sa sensor aron tipigan sa Celsius.

Kaniadto, maghimo kami usa ka butang nga nagkolekta sa temperatura sa mga degree Fahrenheit. Human niana, laing butang sa datos (gikalkula) nga mag-convert sa Fahrenheit ngadto sa Celsius gamit ang pormula.

Mga problema:

  • Kinahanglan nga doblehon ang mga elemento sa datos ug tipigan ang tanan nga mga kantidad sa database.
  • Kinahanglan nga mouyon ka sa mga agwat alang sa butang nga datos sa "ginikanan" nga gikalkula ug gigamit sa pormula, ug alang sa nakalkula nga aytem sa datos. Kung dili, ang nakalkula nga butang mahimo’g moadto sa usa ka dili suportado nga estado o makalkula ang usa ka miaging kantidad, nga makaapekto sa kasaligan sa mga resulta sa pag-monitor.

Usa ka solusyon mao ang pagpalayo gikan sa flexible check intervals pabor sa fixed intervals aron maseguro nga ang computed item ma-evaluate human sa item nga makadawat sa data (sa among kaso, ang temperatura sa degrees Fahrenheit).

Apan kon, alang sa panig-ingnan, kita sa paggamit sa template sa pagsusi sa usa ka dako nga gidaghanon sa mga lalang, ug ang tseke nga gihimo sa makausa sa matag 30 segundos, Zabbix "hacks" alang sa 29 segundos, ug sa katapusan nga segundo kini magsugod sa pagsusi ug pagkalkulo. Naghimo kini og pila ug makaapekto sa performance. Busa, kini girekomendar sa paggamit sa fixed agwat lamang kon kini gikinahanglan.

Niini nga problema, ang labing maayo nga solusyon mao ang usa ka linya nga JavaScript preprocessing nga nag-convert sa degrees Fahrenheit ngadto sa degrees Celsius:

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

Kini paspas ug dali, dili nimo kinahanglan nga maghimo dili kinahanglan nga mga butang sa datos ug magtipig usa ka kasaysayan niini, ug mahimo usab nimo gamiton ang mga flexible nga agwat alang sa mga tseke.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript

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

Apan, kung sa usa ka hypothetical nga kahimtang kinahanglan nga idugang ang nadawat nga elemento sa datos, pananglitan, sa bisan unsang kanunay nga gihubit sa macro, kinahanglan nga tagdon nga ang parameter bili nagpalapad ngadto sa usa ka hilo. Sa usa ka operasyon sa pagdugang sa kuwerdas, duha ka mga kuwerdas ang yano nga gihiusa sa usa.

Gisulbad namo ang praktikal nga mga problema sa Zabbix gamit ang JavaScript

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

Aron makuha ang resulta sa usa ka mathematical nga operasyon, gikinahanglan nga i-convert ang mga tipo sa nakuha nga mga kantidad ngadto sa numeric format. Alang niini mahimo nimong gamiton ang function parseInt(), nga nagpatunghag usa ka integer, usa ka function parseFloat(), nga nagpatunghag decimal, o function gidaghanon, nga nagbalik ug integer o decimal.

Buluhaton 2

Kuhaa ang oras sa mga segundo hangtod sa katapusan sa sertipiko.

Kahimtang: usa ka serbisyo nagpagawas ug petsa sa pag-expire sa sertipiko sa format nga "Peb 12 12:33:56 2022 GMT".

Sa ECMAScript5 date.parse() modawat ug petsa sa ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ). Kinahanglan nga ihulog ang usa ka pisi niini sa format nga MMM DD YYYY HH:mm:ss ZZ

problema: Ang kantidad sa bulan gipahayag isip teksto, dili isip numero. Ang datos sa kini nga format wala gidawat ni Duktape.

Ehemplo sa Solusyon:

  • Una sa tanan, usa ka variable ang gipahayag nga nagkuha usa ka kantidad (ang tibuuk nga script usa ka deklarasyon sa mga variable nga gilista nga gibulag sa mga koma).

  • Sa una nga linya makuha namon ang petsa sa parameter bili ug ibulag kini sa mga luna gamit ang pamaagi split. Sa ingon, makakuha kami usa ka laray, diin ang matag elemento sa laray, sugod sa indeks 0, katumbas sa usa ka elemento sa petsa sa wala pa ug pagkahuman sa usa ka wanang. gibahin(0) - bulan, gibahin(1) - numero, gibahin(2) - usa ka string nga adunay oras, ug uban pa. Human niana, ang matag elemento sa petsa mahimong ma-access pinaagi sa indeks sa array.

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

  • Ang matag bulan (sa kronolohikal nga pagkahan-ay) katumbas sa indeks sa posisyon niini sa laray (gikan sa 0 hangtod 11). Aron ma-convert ang usa ka text value ngadto sa numeric value, ang usa idugang sa month index (tungod kay ang mga bulan giihap sugod sa 1). Sa kini nga kaso, ang ekspresyon nga adunay pagdugang sa usa gikuha sa mga braket, tungod kay kung dili usa ka hilo ang makuha, dili usa ka numero. Sa katapusan atong buhaton tipik () - putla ang laray gikan sa katapusan aron magbilin lamang og duha ka karakter (nga importante sa mga bulan nga adunay duha ka digit nga numero).

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

  • Naghimo kami usa ka hilo sa format nga ISO gikan sa nakuha nga mga kantidad pinaagi sa naandan nga pagdugang sa mga kuwerdas sa angay nga pagkasunud.

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

Ang datos sa resulta nga pormat mao ang gidaghanon sa mga segundo gikan sa 1970 ngadto sa usa ka punto sa umaabot. Hapit imposible nga gamiton ang datos sa nadawat nga format sa mga nag-trigger, tungod kay gitugotan ka sa Zabbix nga mag-operate lamang sa mga macro. {Petsa} ΠΈ {Panahon}, nga ibalik ang petsa ug oras sa usa ka pormat nga mahigalaon sa user.

  • Makuha na nato ang kasamtangang petsa sa JavaScript sa Unix Timestamp format ug ibasura kini gikan sa resulta nga petsa sa pag-expire sa sertipiko aron makuha ang gidaghanon sa mga millisecond gikan karon hangtod matapos ang sertipiko.

`now = Date.now();`

  • Gibahin namon ang nadawat nga kantidad sa usa ka libo aron makakuha mga segundo sa Zabbix.

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

Sa trigger, mahimo nimong ipiho ang ekspresyong 'katapusan' gisundan sa usa ka set sa mga digit nga katumbas sa gidaghanon sa mga segundo sa panahon nga gusto nimong tubagon, pananglitan, sa mga semana. Sa ingon, ang gatilyo magpahibalo nga ang sertipiko matapos sa usa ka semana.

PAHINUMDOM. Hatagi'g pagtagad ang gamit parseInt() sa function pagbalikaron ma-convert ang fractional nga numero nga resulta sa pagbahin sa milliseconds ngadto sa integer. Mahimo usab nimo gamiton parseFloat() ug tipigan ang fractional data.

Tan-awa ang report

Source: www.habr.com

Idugang sa usa ka comment