本节提供 JavaScript 预处理的详细信息。
JavaScript预处理通过调用带有单个参数'value'和用户提供的函数体的JavaScript函数来完成。预处理步骤的结果是该函数返回的值。例如,要执行华氏温度到摄氏温度的转换,请输入以下内容:
服务器将这些JavaScript预处理参数封装成JavaScript函数:
输入参数'value'始终作为字符串传递。返回值通过ToString()方法自动转换为字符串(如果失败,则返回错误作为字符串值),但有几个例外情况:
错误可以通过抛出值/对象来返回(通常是字符串或Error对象)。
例如:
每个脚本有10秒的执行超时(取决于脚本,超时时间可能更长)。超过超时时间将返回错误。有一个512兆字节的堆限制。
当应用下一次步骤时,JavaScript预处理步骤的字节码会被缓存和重用。项目预处理步骤的任何更改都会导致缓存的脚本被重置和重新编译。
连续的运行时失败(3次连续失败)将导致引擎重新初始化,以减少一个脚本破坏下一个脚本执行环境的可能性(此操作在DebugLevel 4及更高级别中记录)。
JavaScript预处理是使用Duktape JavaScript引擎实现的。
另请参阅:附加的JavaScript对象和全局函数
可以在JavaScript代码中使用用户宏。如果脚本包含用户宏,这些宏将在执行特定预处理步骤之前由服务器/代理解析。请注意,在前端测试预处理步骤时,宏值不会被提取,需要手动输入。
替换宏值时会忽略上下文。宏值会直接插入代码中,无法在将值放入JavaScript代码之前添加额外的转义字符。请注意,这在某些情况下可能会导致JavaScript错误。
在下面的示例中,如果接收到的值超过了{$THRESHOLD}宏值,则会返回阈值(如果存在):
var threshold = '{$THRESHOLD}'; return (!isNaN(threshold) && value > threshold) ? threshold : value;
以下示例说明了如何使用JavaScript预处理。
每个示例包含一个简要描述、JavaScript预处理参数的函数体以及预处理步骤的结果 - 函数返回的值。
将数字 "2.62128e+07" 从科学计数法转换为整数。
函数返回的值:26212800。
将二进制数"11010010"转换为十进制数。
函数返回的值:210。
将数字"18.2345"四舍五入为2位小数。
函数返回的值:18.23。
计算字符串"Zabbix"中的字母数。
函数返回的值:6。
获取距离证书到期日期(Feb 12 12:33:56 2022 GMT)的剩余时间(以秒为单位)。
var split = value.split(' '), 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), ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2], now = Date.now(); return parseInt((Date.parse(ISOdate) - now) / 1000);
函数返回的值:44380233。
通过删除具有键为"data_size"
或"index_size"
的属性来修改JSON数据结构。
var obj=JSON.parse(value); for (i = 0; i < Object.keys(obj).length; i++) { delete obj[i]["data_size"]; delete obj[i]["index_size"]; } return JSON.stringify(obj)
函数接受的值:
[ { "table_name":"history", "data_size":"326.05", "index_size":"174.34" }, { "table_name":"history_log", "data_size":"6.02", "index_size":"3.45" } ]
函数返回的值:
将从 web.page.get Zabbix agent 项接收到的值(例如,web.page.get[http://127.0.0.1:80/server-status?auto])转换为 JSON 对象。
// 将Apache状态转换为JSON // 将值拆分为子字符串并将这些子字符串放入数组中 var lines = value.split('\n'); // 创建一个空对象 "output" var output = {}; // 使用预定义属性创建一个对象 "workers" var workers = { '_': 0, 'S': 0, 'R': 0, 'W': 0, 'K': 0, 'D': 0, 'C': 0, 'L': 0, 'G': 0, 'I': 0, '.': 0 }; // 将来自 "lines" 数组的子字符串作为属性(键值对)添加到 "output" 对象中 for (var i = 0; i < lines.length; i++) { var line = lines[i].match(/([A-z0-9 ]+): (.*)/); if (line !== null) { output[line[1]] = isNaN(line[2]) ? line[2] : Number(line[2]); } } // 多版本指标 output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime; output.ServerVersion = output.ServerVersion || output.Server; // 解析 "Scoreboard" 属性以获取工作进程数 if (typeof output.Scoreboard === 'string') { for (var i = 0; i < output.Scoreboard.length; i++) { var char = output.Scoreboard[i]; workers[char]++; } } // 将工作进程数据添加到 "output" 对象中 output.Workers = { waiting: workers['_'], starting: workers['S'], reading: workers['R'], sending: workers['W'], keepalive: workers['K'], dnslookup: workers['D'], closing: workers['C'], logging: workers['L'], finishing: workers['G'], cleanup: workers['I'], slot: workers['.'] }; // 返回JSON字符串 return JSON.stringify(output);
函数接受的值:
HTTP/1.1 200 OK Date: Mon, 27 Mar 2023 11:08:39 GMT Server: Apache/2.4.52 (Ubuntu) Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 405 Content-Type: text/plain; charset=ISO-8859-1 127.0.0.1 ServerVersion: Apache/2.4.52 (Ubuntu) ServerMPM: prefork Server Built: 2023-03-08T17:32:01 CurrentTime: Monday, 27-Mar-2023 14:08:39 EEST RestartTime: Monday, 27-Mar-2023 12:19:59 EEST ParentServerConfigGeneration: 1 ParentServerMPMGeneration: 0 ServerUptimeSeconds: 6520 ServerUptime: 1 hour 48 minutes 40 seconds Load1: 0.56 Load5: 0.33 Load15: 0.28 Total Accesses: 2476 Total kBytes: 8370 Total Duration: 52718 CPUUser: 8.16 CPUSystem: 3.44 CPUChildrenUser: 0 CPUChildrenSystem: 0 CPULoad: .177914 Uptime: 6520 ReqPerSec: .379755 BytesPerSec: 3461.58 BytesPerReq: 3461.58 DurationPerReq: 21.2916 BusyWorkers: 2 IdleWorkers: 6 Scoreboard: ____KW__..............................................................................................................................................
函数返回的值:
{ "Date": "Mon, 27 Mar 2023 11:08:39 GMT", "Server": "Apache/2.4.52 (Ubuntu)", "Vary": "Accept-Encoding", "Encoding": "gzip", "Length": 405, "Type": "text/plain; charset=ISO-8859-1", "ServerVersion": "Apache/2.4.52 (Ubuntu)", "ServerMPM": "prefork", "Server Built": "2023-03-08T17:32:01", "CurrentTime": "Monday, 27-Mar-2023 14:08:39 EEST", "RestartTime": "Monday, 27-Mar-2023 12:19:59 EEST", "ParentServerConfigGeneration": 1, "ParentServerMPMGeneration": 0, "ServerUptimeSeconds": 6520, "ServerUptime": "1 hour 48 minutes 40 seconds", "Load1": 0.56, "Load5": 0.33, "Load15": 0.28, "Total Accesses": 2476, "Total kBytes": 8370, "Total Duration": 52718, "CPUUser": 8.16, "CPUSystem": 3.44, "CPUChildrenUser": 0, "CPUChildrenSystem": 0, "CPULoad ": 0.177914, "Uptime": 6520, "ReqPerSec": 0.379755, "BytesPerSec": 1314.55, "BytesPerReq": 3461.58, "DurationPerReq": 21.2916, "BusyWorkers": 2, "IdleWorkers": 6, "Scoreboard": "____KW__..............................................................................................................................................", "Workers": { "waiting": 6, "starting": 0, "reading": 0, "sending": 1, "keepalive": 1, "dnslookup": 0, "closing": 0, "logging": 0, "finishing": 0, "cleanup": 0, "slot": 142 } }