使用JavaScript解决Zabbix中的实际任务



Zabbix集成团队工程师Tikhon Uskov



Zabbix是一个可定制的平台,用于监视任何类型的数据。从Zabbix的最早版本开始,监视管理员便可以通过操作运行各种脚本来检查目标主机。同时,脚本的启动带来了许多困难,包括需要支持脚本,将脚本交付给通信节点和代理以及对不同版本的支持。



Zabbix的JavaScript



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