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

746 阅读1分钟

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

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

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

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

image.png

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

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

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

点开javascript编辑器

image.png

其中,已经给你预定义好了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)

最后的监控项原型配置

image.png