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的预处理功能,进一步处理。
这里我们选择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)
最后的监控项原型配置
