作者:Andris Zeila,Zabbix开发工程师
Zabbix中国区唯一培训师 周松(译)
监控项预处理中对JavaScript的支持
几乎每个Zabbix版本中都会新增预处理的支持方式,很明显,很多时候存在一些无法预估的业务场景,所以我们必须对此提出一个通用的解决方案。反之,这又涉及到一个重要的问题——嵌入式脚本语言/引擎。
首先,我们决定以下评估标准:
创建了很多测试用例来测量性能,并根据所描述的标准评估脚本引擎:
评估了以下语言/引擎:
另外,我们还尝试了一些使用Chrome V8和Spider Monkey等脚本引擎的测试不太成功——对于短脚本的执行来说太重了。
结果如下
特 点
点击查看详情
性能(预编译代码)
点击查看详情
点击查看详情
点击查看详情
点击查看详情
点击查看详情
主要关注的是预编译的字节码执行性能,但是,在预处理更改时,脚本将被重新编译,并且在错误时JavaScript引擎可能会重新初始化—所以这也应该考虑在内。
从整体表现来看,Lua(特别是LuaJIT)领先。Python和Perl具有强大的字符串操作性能,但脚本编译和引擎初始化的性能最差,此外,仅支持在OS级别上CPU / memory资源限制。Duktape具有整体性能比较平均,但是脚本性能最差,尽管如此,在性能最差的情况下,它设法每秒处理400k表达式 - 对于单个工作任务而言应该足够了。
这样就只剩下了Lua或者JavaScript。出去性能不说,JavaScript因语言流行度而获胜。Lua是一种利基语言,具有自己的语法特性。Lua模式虽然与正则表达式有些类似,但仍然不同。此外,本机JSON支持是可取的,但可以预编译和预加载第三方JSON模块,最终还是Duktape的集成更加简单。
示 例
作为示例,我们将展示如何使用JavaScript预处理步骤配置华氏温度到摄氏温度的转换。在项目的预处理配置中添加新步骤并选择自定义脚本/ JavaScript:
点击查看详情
脚本的第一行显示在参数中(当前具有占位符“script”):
点击查看详情
单击将打开一个简单的编辑器窗口:
点击查看详情
目前,编辑器是一个使用等宽字体的简单多行编辑器。不支持制表和语法着色。
输入转换公式
返回(值 - 32)* 5/9
并按申请:
点击查看详情
对于需要多行的复杂脚本,建议在第一行注释中编写脚本描述,如:
点击查看详情
然后脚本将在预处理步骤中执行:
点击查看详情
虽然这个例子非常简单,但JavaScript预处理可用于复杂的场景,如分析输入数据,将文本数据转换为其他格式(JSON)等。基本上来说,当Zabbix标准预处理选项不足时,JavaScript预处理可能会是一个很好的选择。