Lösen praktischer Aufgaben in Zabbix mit JavaScript



Tikhon Uskov , Ingenieur des Zabbix-Integrationsteams



Zabbix ist eine anpassbare Plattform, mit der jede Art von Daten überwacht werden kann. Ab den frühesten Versionen von Zabbix hatten Überwachungsadministratoren die Möglichkeit, verschiedene Skripts über Aktionen auszuführen , um die Zielhosts zu überprüfen. Gleichzeitig führte das Starten von Skripten zu einer Reihe von Schwierigkeiten, darunter die Notwendigkeit, Skripte zu unterstützen, sie an Kommunikationsknoten und Proxys zu liefern sowie verschiedene Versionen zu unterstützen.



JavaScript für Zabbix



2019 Zabbix 4.2 JavaScript. , - , Zabbix , , Zabbix , Zabbix JavaScript. , Zabbix 3.4, .



Zabbix 4.4, JavaScript, — Webhook, Zabbix .



JavaScript Duktape



JavaScript Duktape? :



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


, , , . JavaScript Duktape.





performance testing



Duktape:



ECMAScript E5/E5.1

— Zabbix Duktape:



  • Zabbix.log() — Zabbix Server , , , Webhook .
  • CurlHttpRequest() — HTTP- , Webhook.
  • atob() btoa() — Base64.


. Duktape ACME. Zabbix 2015 . , .



JavaScript



JavaScript : , .



, .



, -, . — , , , .



. , , , , valueOf toString. valueOf toString. valueOf , .



valueOF. , toString. toString , valueOf , . toString, , . .



, 'obj' toString,



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


toString , :



`obj + 1 // '2001'` 

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


toString, , .



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

`obj + 1 // '2001'`


, , , .



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


JavaScript.



toString , 1.





, 3, 4.



(==) toString . , . (===).







. .



, , Webhook , , , .



Webhook Media



2019 2020 Zabbix Webhooks « », Zabbix.









Preprocessing



  • JavaScript , Zabbix .
  • Zabbix JavaScript, - , value ( , ).
  • , return.
  • .
  • , . 10 10 .




. - 10 , 1 «» Zabbix. JavaScript (dummy items), .



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`




1



.



: .



, . — (), .



:



  • .
  • «» , , . , .


, , ( — ).



, , , 30 , 29 Zabbix «», . . , .



— JavaScript, :



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


, , .





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


, , , - , , , value . , .





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


, . parseInt(), , parseFloat(), , number, .



2



.



: "Feb 12 12:33:56 2022 GMT".



ECMAScript5 Date.parse() ISO 8601 (YYYY-MM-DDTHH:mm:ss.sssZ). MMM DD YYYY HH:mm:ss ZZ



: , . Duktape.



:



  • , ( — , ).



  • value split. , , , 0, . split(0) — , split(1) — , split(2) — . . .





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


  • ( ) ( 0 11). , ( 1). , , . slice() — , ( ).


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


  • ISO .


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


— 1970 - . , Zabbix {Date} {Time}, .



  • JavaScript Unix Timestamp , .


`now = Date.now();`


  • , Zabbix.


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


'last<' , , , , . , , .



. parseInt() return, , , . parseFloat() .






All Articles