2022 Zabbix中国峰会
2022 Zabbix中国峰会

4 JavaScript预处理

概览

本节详细描述通过JavaScript进行预处理。

JavaScript 预处理

JavaScript预处理是通过调用带有单个参数值和用户提供的函数体的JavaScript函数来完成的。预处理步骤的结果是从这个函数返回的值,例如,要执行华氏到摄氏度的转换,用户必须输入:

return (value - 32)  * 5 / 9

在JavaScript的预处理参数中,这些参数将被server封装到JavaScript函数中:

function (value)
       {
          return (value - 32) * 5 / 9
       }

输入参数值总是作为字符串传递。返回值通过ToString()方法自动强制转换为字符串(如果失败,则返回错误为字符串值),但有几个例外:

  • 返回未定义的值将导致错误
  • 返回null值将导致输入值被丢弃,很像在“Custom on fail”操作上的“Discard value”预处理。

可以通过抛出值/对象(通常是字符串或错误对象)返回错误。 例子:

if (value == 0)
           throw "Zero input value"
       return 1/value

每个脚本都有一个10秒的执行超时(取决于脚本,超时触发的时间可能更长);超过该值将返回错误。此外,还强制执行10兆字节的堆限制。 JavaScript预处理步骤字节码将在下次应用该步骤时缓存并重用。对该项的预处理步骤的任何更改将导致缓存的脚本在稍后被重置和重新编译。 连续的运行失败(连续3次)将导致引擎被重新初始化,以减少一个脚本破坏下一个脚本的执行环境的可能性(DebugLevel 4或更高级别的日志记录此操作)。 JavaScript预处理是用Duktape (https://duktape.org/) JavaScript引擎实现的。

在脚本中使用宏

在JavaScript代码中使用用户宏是可能的。如果一个脚本包含用户宏,这些宏将在执行特定的预处理步骤之前由服务器/代理解析。注意,当在前端测试预处理步骤时,宏值不会被提取,需要手动输入。

当宏被它的值替换时,Context被忽略。宏值按原样插入到代码中,在将值放入JavaScript代码之前不可能添加额外的转义。请注意,在某些情况下,这可能会导致JavaScript错误。

在下面的示例中,如果接收到的值超过了{$THRESHOLD}的宏值,则返回该宏值(如果存在):

var threshold = '{$THRESHOLD}';
       return (!isNaN(threshold) && value > threshold) ? threshold : value;

全局JavaScript函数

其他的全局JavaScript函数已经用Duktape实现:

  • btoa(string) - 将字符串编码为base64字符串
  • atob(base64_string) - 解码base64字符串
try {
           b64 = btoa("utf8 string");
           utf8 = atob(b64);
       } 
       catch (error) {
           return {'error.name' : error.name, 'error.message' : error.message}
       }

参考: 额外的JavaScript对象