vlambda博客
学习文章列表

ZABBIX自动发现H3C设备BFD监控项

阅读这篇文章之前,假设你已经具备了掌握基本zabbix操作技能,这样会更方便快速理解。


首先在模板中新建自动发现规则如下:


其中 :

OID:1.3.6.1.4.1.25506.2.72.1.3.1.10 代表bfd会话中的对端IP,我们以此作为发现规则的依据。

但是这个OID的值,是Hex-STRING类型,也就是16进制,不利于阅读。我们需要借助zabbix的预处理功能,进一步处理。

ZABBIX自动发现H3C设备BFD监控项

这里我们选择javascript 来对发现规则的数据做进一步处理


首先,发现规则产生的数据是这样的数据结构, 示例如下:

{    "data": [        {            "{#SNMPINDEX}": "111",            "{#SNMPVALUE}": "64 40 17 06 ",        },
               {            "{#SNMPINDEX}": "111",            "{#SNMPVALUE}": "64 50 17 06 ",        }    ]}

点开javascript编辑器


其中,已经给你预定义好了js的基本结构,定义了一个函数和一个value参数

而zabbix实际传给value的值,是一个json格式的字符串

value的值实际为 

[{"{#SNMPINDEX}":"111","{#SNMPVALUE}":"64 50 0C 01 "}]


我们需要做进一步处理

函数内的代码为:

var val = JSON.parse(value) // 将json字符串转为json对象//定义一个返回给zabbix的数据结构,与上文呼应var res = {"data":[]}// 遍历val 这是val 一定是一个数组for (i = 0; i < val.length; i++){    var content = [] // 用于最后存放10进制数的列表    // 将16进制字符串按空格切片 64 50 17 02 -> [64,50,17.02] var tmp = val[i]['{#SNMPVALUE}'].split(' ') for (a = 0; a < tmp.length; a++) {        if (!isNaN(parseInt(tmp[a],16)) ) { // 开始进制转换            // 转换后的数据放入content存储 content.push(parseInt(tmp[a],16).toString()) } } if (tmp.length > 0){        // 开始拼接最终结果 res['data'].push( { "{#SNMPINDEX}":val[i]['{#SNMPINDEX}'], "{#SNMPVALUE}":content.join('.') }) }}// 最后,这个结果也要转成json字符串返回return JSON.stringify(res)

最后的监控项原型配置