prometheus 监控交换机流量

1. 默认已经安装 prometheus

2. 手动验证能否获取交换机数据

用prometheus 监控交换机流量首先需要确定安装prometheus 的机器已经被交换机允许获取他的数据。命令如下:
以交换机版本为v2c为例:

snmpwalk -v 2c  10.0.1.52   -c public ifDescr  获取网卡信息

其中-v是指版本(SNMP主要有SNMPv1、SNMPV2c、SNMPv3几种最常用的版本。),-c 是指密钥(Community:团体名,用于Agent与NMS之间的认证,由交换机提供)。

如果返回数据,则说明可以进行下一步通过prometheus获取数据了,数据如下:

prometheus 监控 cpu使用率 prometheus snmp监控_监控

3. 安装 snmp 插件

下载snmp_exporter 安装

wget https://github.com/prometheus/snmp_exporter/releases/download/v0.13.0/snmp_exporter-0.13.0.linux-amd64.tar.gz

解压并打开 snmp.yml 根据需要进行修改

tar -xzvf snmp_exporter-0.13.0.linux-amd64.tar.gz 

cd snmp_exporter-0.13.0.linux-amd64/

vim snmp.yml

由于生产上的交换机,一般都有认证才能对交换机进行访问,所以需要交换机提供 Community以及版本号,这两个需要在snmp.yml进行配置。
修改如下:

找到if_mib模块,如下图:

prometheus 监控 cpu使用率 prometheus snmp监控_数据_02


找到if_mib模块最下面,加入 version(以版本为v2c为例子),以及认证community,如下图:

prometheus 监控 cpu使用率 prometheus snmp监控_snmp_03


根据我的经验,可能会遇到这样一个问题,你要监控的所有交换机的认证 community可能不一样,而我们不能在配置文件里在community后面加好几个认证码,那么解决办法是:

将 if_mib 模块的所有配置再复制一遍,改一下模块的名字,如改成 if_mib2,相应的改一下version和community即可。

启动 snmp_exporter

./snmp_exporter --config.file=snmp.yml

验证snmp监控数据

curl 'http://安装snmp_exporter的机器的IP:9116/snmp?target=安装snmp_exporter的机器的IP'

4. 配置prometheus的配置文件

添加关于 snmp的配置,如下:

prometheus 监控 cpu使用率 prometheus snmp监控_snmp_04


其中红线化掉的是安装snmp_exporter的机器的ip,而9116,是snmp_exporter的端口。如果出现多个community的情况(如上面所说),只需要再加一个job即可,如下:

prometheus 监控 cpu使用率 prometheus snmp监控_数据_05

到目前为止,prometheus通过 snmp_exporter 抓取交换机流量数据已完成。

5. 关于交换机的各项指标介绍

snmp指标

针对普通网络设备的端口,MIB的相关定义是Interface组,主要管理如下信息: ifIndex 端口索引号 ifDescr 端口描述 ifType 端口类型 ifMtu 最大传输包字节数 ifSpeed 端口速度 ifPhysAddress 物理地址 ifOperStatus 操作状态 ifLastChange 上次状态更新时间 ifInOctets 输入字节数 *ifInUcastPkts 输入非广播包数 *ifInNUcastPkts 输入广播包数 *ifInDiscards 输入包丢弃数 *ifInErrors 输入包错误数 *ifInUnknownProtos 输入未知协议包数 *ifOutOctets 输出字节数 *ifOutUcastPkts 输出非广播包数 *ifOutNUcastPkts 输出广播包数 *ifOutDiscards 输出包丢弃数 *ifOutErrors 输出包错误数 ifOutQLen 输出队长 其中,号标识的是与网络流量有关的信息。 1、获取CISCO2900端口1的上行总流量 snmpwalk -v 1 -c public 192.168.1.254 IF-MIB::ifInOctets.1 返回结果 IF-MIB::ifInOctets.1 = Counter32: 4861881 2、五秒后再获取一次 snmpwalk -v 1 -c public 192.168.1.254 IF-MIB::ifInOctets.1 返回结果 IF-MIB::ifInOctets.1 = Counter32: 4870486 3、计算结果 (后值48704863-前值4861881)/ 5=1721b/s (应该是BYTE)

6. 根据需要查找指标

由于我们要监控交换机流量,所以对我们有用的指标主要是ifHCOutOctets和ifHCInOctets,为什么是ifHCOutOctets而不是上面所说的ifOutOctets,因为在流量监控中发现了一个问题:监控交换机的网络流量,经常发现少数据的情况,prometheus绘的图断断续续的,snmp协议返回的ifInOctets和ifOutOctets都是流量的总量,如果我们需要获取一段时间的流量,我们需要取两段时间的差值,而ifOutOctets对应的counter32的数据类型计数的最大值是2的32次方减1,当超过4G的时候,计数器就会清零。当我们取数据如果正巧处于4G左右,当他清零重新计数,那我们获取的流量是不准确的。解决办法是:
查询数据换成 ifHCOutOctets和ifHCInOctets来代替ifOutOctets和ifInOctets。因为ifHCOutOctets对应的计数counter64,64位计数器足够大,可以解决这个问题。

7. 参考

https://owelinux.github.io/owelinux.github.io/2018/07/25/article8-linux-prometheus/