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)
最后的监控项原型配置