应用实例

generator.yml 文件示例

H3C

这是从 H3C 的 HDM 中提取到的所有序列

modules:
  h3c_mib:
    walk:
      - hh3cHealthInfo
      - hh3cPowerInfo
      - hh3cFansInfo
      - hh3cMemDetailInfoTable
      - hh3cTempSensorName
      - hh3cTempSensorReading
      - hh3cTempSensorSubStatus
    version: 2
    auth:
      community: public
  if_mib:
    walk: [sysUpTime, interfaces, ifXTable]
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
      - source_indexes: [ifIndex]
        # Uis OID to avoid conflict with PaloAlto PAN-COMMON-MIB.
        lookup: 1.3.6.1.2.1.2.2.1.2 # ifDescr
      - source_indexes: [ifIndex]
        # Use OID to avoid conflict with Netscaler NS-ROOT-MIB.
        lookup: 1.3.6.1.2.1.31.1.1.1.1 # ifName
    overrides:
      ifAlias:
        ignore: true # Lookup metric
      ifDescr:
        ignore: true # Lookup metric
      ifName:
        ignore: true # Lookup metric
      ifType:
        type: EnumAsInfo

Prometheus 监控交换机流量案例

默认已经安装 prometheus

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

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

# 获取交换机的接口描述信息
snmpwalk -v 2c 10.0.1.52 -c public ifDescr

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

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

生成 snmp.yml 文件

准备好如下 generator.yml 文件。

modules:
  if_mib:
    walk: [sysUpTime, interfaces, ifXTable]
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
      - source_indexes: [ifIndex]
        # Uis OID to avoid conflict with PaloAlto PAN-COMMON-MIB.
        lookup: 1.3.6.1.2.1.2.2.1.2 # ifDescr
      - source_indexes: [ifIndex]
        # Use OID to avoid conflict with Netscaler NS-ROOT-MIB.
        lookup: 1.3.6.1.2.1.31.1.1.1.1 # ifName
    overrides:
      ifAlias:
        ignore: true # Lookup metric
      ifDescr:
        ignore: true # Lookup metric
      ifName:
        ignore: true # Lookup metric
      ifType:
        type: EnumAsInfo

根据 生成 snmp.yml 文件章节内容,生成 snmp.yml 文件。

安装 snmp 插件

启动 snmp_exporter

./snmp_exporter –config.file=snmp.yml

验证 snmp 监控数据

curl ‘http://安装snmp_exporter的设备的IP:9116/snmp?module=if_mib&target=要采集SNMP设备的IP’

配置 prometheus 的配置文件

添加关于 snmp 的配置,如下: 其中红线化掉的是安装 snmp_exporter 的机器的 ip,而 9116,是 snmp_exporter 的端口。如果出现多个 community 的情况(如上面所说),只需要再加一个 job 即可,如下: 到目前为止,prometheus 通过 snmp_exporter 抓取交换机流量数据已完成。

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

snmp 指标

针对普通网络设备的端口,MIB 的相关定义是 Interface 组,主要管理如下信息:

  • ifIndex 端口索引号
  • ifOperStatus # 端口状态
  • ifDescr 端口描述
  • ifType 端口类型
  • ifMtu 最大传输包字节数
  • ifSpeed 端口速度
  • ifPhysAddress 物理地址
  • ifOperStatus 操作状态
  • ifLastChange 上次状态更新时间
  • ifInOctets 输入字节数
  • ifInUcastPkts 输入非广播包数
  • ifInNUcastPkts 输入广播包数
  • ifInDiscards 输入包丢弃数
  • ifInErrors 输入包错误数
  • ifInUnknownProtos 输入未知协议包数
  • ifOutOctets 输出字节数
  • ifOutUcastPkts 输出非广播包数
  • ifOutNUcastPkts 输出广播包数
  • ifOutDiscards 输出包丢弃数
  • ifOutErrors 输出包错误数
  • ifOutQLen 输出队长 其中,号标识的是与网络流量有关的信息。

根据需要查找指标

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

查询数据换成 ifHCOutOctets 和 ifHCInOctets 来代替 ifOutOctets 和 ifInOctets。因为 ifHCOutOctets 对应的计数 counter64,64 位计数器足够大,可以解决这个问题。

问题实力

invalid utf-8 label

当数通设备上的接口描述字符串为中文时,若设备本身不支持中文,则通过 snmpwalk 到的指标将无法显示。此时 snmp-exporter 将会出现如下报错 image.png 相关 ISSUE:#279


最后修改 July 23, 2024: clearup observability (4b9f5578)