4 JavaScript 预处理

概述

本节提供JavaScript预处理的具体细节。

JavaScript 预处理

JavaScript预处理通过调用带有单个参数'value'的JavaScript函数及用户提供的函数体来实现。预处理步骤的结果是该函数的返回值,例如要实现华氏度转摄氏度的转换,用户需输入:

return (value - 32)  * 5 / 9

在JavaScript预处理参数中,这些内容将被服务器封装成JavaScript函数:

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

输入参数'value'始终以string形式传递。返回值会通过ToString()方法自动强制转换为string(若转换失败则返回错误作为string值),但存在以下例外情况:

  • 返回undefined值将导致错误

  • 返回null值将导致输入值被丢弃

    much like 'Discard value' preprocessing on 'Custom on fail' action.

可通过抛出值/objects来返回错误(通常为字符串或Error objects)。

例如:

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

每个脚本有10秒执行超时限制(根据脚本不同可能需更长时间才会触发超时);超时将返回错误。强制执行512MB堆内存限制(Zabbix 6.0.19之前为64MB)。

JavaScript预处理步骤的字节码会被缓存,并在下次应用该步骤时复用。对监控项预处理步骤的任何修改将导致缓存脚本被重置并重新编译。

连续运行时错误(连续3次)将导致引擎重新初始化,以降低某个脚本破坏后续脚本执行环境的可能性(该操作会记录在DebugLevel 4及以上日志中)。

JavaScript预处理功能通过Duktape JavaScript引擎(https://duktape.org/)实现。

另请参阅:Additional JavaScript objects and global functions

在脚本中使用宏

可以在JavaScript代码中使用用户宏。如果脚本 包含用户宏,这些宏会在执行特定预处理步骤前 由server/proxy解析。请注意在前端测试 预处理步骤时,宏值不会被拉取,需要手动输入。

当宏被替换为其值时,上下文会被忽略。 宏值会按原样插入代码中,无法在将值放入 JavaScript代码前进行额外转义。请注意, 在某些情况下这可能导致JavaScript错误。

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

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