zabbix agent自定义监控项,监控交换机vlan流量

发布时间 2023-04-18 11:50:27作者: 飞飞6779

脚本目的:

需要对华为ac中的ssid流量进行监控,但ac web页面中与snmp取值差异很大。
正好ac的用户流量配置了本地转发,用户vlan的网关在一台交换机上。交换机可以配置vlan statistic以统计vlan内的流量。
但vlan流量统计后,没有对应的snmp oid,考虑使用python脚本来进行取值。

在zabbix server中定义一个脚本,并增加可执行权限

#!/usr/bin/python3
import paramiko
import time

# Connect information:
ip = '172.16.*.*'
username = 'user'
password = 'Password'

# Create SSH client:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Connect device:
client.connect(hostname=ip, username=username, password=password)
time.sleep(0.5)

# Execute command:
command=client.invoke_shell(width=300)
output = ''
for vlan in [1006,1800]:
    command.send('\n')
    command.send(f'dis vlan {vlan} statistics\n')
    time.sleep(2)
    command.send('q\n')
    
output=command.recv(65535).decode('utf-8')
# Shutdown ssh connection
client.close()
print(output)

使用agent调用:

修改 /etc/zabbix/zabbix_agentd.conf
# Default:
# Timeout=3 默认超时时间太短,需要延长为30秒:
Timeout=30
# 自定义脚本对应的键值,需要唯一。逗号之后是脚本的路径:
UserParameter=py.network.vlan.traffic,/data/zabbix_compose/externalscripts/hwSsidTraffic.py

# 测试脚本的运行,返回值是一个列表:
$ zabbix_agentd -t py.network.vlan.traffic
py.network.vlan.traffic                       [t|
Info: The max number of VTY users is 10, and the number
……omit

# 需要重启zabbix-agent以重新加载用户自定义参数,官方提供的zabbix_agentd -R命令执行不成功

在zabbix web中新建监控项

【直接在zabbix snmp设备中调用此键值不成功,测试在zabbix agent所在的服务器调用,是可以的】:
注意:在调用前,zabbix server的Timeout也需要增加。
image

对数据进行预处理:

# value返回的文本大概这样:
…omit…
 VLAN : 1006 
 ---------------------------------------------------------------------------------
 Item                                          Packets                       Bytes
                                                   pps                         bps
 ---------------------------------------------------------------------------------
 Inbound                                   234,949,790              92,944,972,527
                                                10,456                  29,035,080
 Outbound                                  359,318,367             297,770,911,350
                                                18,965                 173,139,000
…omit…

#在预处理中的javascript脚本:
// 删除所获取文本的前4行【登录提示等无用数据】:
text = value.split('\n').slice(4).join('\n');
// 替换所有的',':
text = text.replace(/,/g, "");
// 输出处理过的数值:
return text;

提取需要的数据

因为要监控的数值有多个,需要增加依赖项目【zabbix 6.4新增功能】来对数值分别处理【键值自定义】:
image

预处理用的javascript脚本,其它监控项的脚本中需要修改vlan id和Inbound/outbound来提取收发流量:

// 使用正则对获取到的值进行处理, 匹配VLAN 1006前的瞬时数值, 即Outbound之后的第4段数字(瞬时发送流量):
text = value.match(/VLAN : 1800[\s\S]*?Outbound\s+\d+\s+\d+[\s\S]*?\d+\s+(\d+)[\s\S]*?: 1800/)[1];
return text;

最后增加一个图形来进行展示:
image

参考:https://www.zabbix.com/documentation/6.0/zh/manual/config/items/userparameters/extending_agent