Prometheus 监控交换机全栈实战:SNMP Exporter 打通网络设备可观测的最后一公里

Prometheus 监控交换机全栈实战:SNMP Exporter 打通网络设备可观测的最后一公里


交换机、路由器、防火墙等网络设备是整个基础设施的“中枢神经”,但它们大多无法安装 Agent。Prometheus 社区的标准解法是 SNMP Exporter——它通过 SNMP 协议拉取设备信息,并转换成 Prometheus 指标。本文将带你从生成配置到可视化、告警落地,一步到位。


1. 为什么选择 SNMP Exporter?

  • 兼容一切:任何支持 SNMP v2c/v3 的设备都能监控,无需在交换机上部署任何东西。
  • 配置生成器:通过 generator 将 MIB 文件解析成 snmp.yml,省去手工编写 OID 的痛苦。
  • 安全可控:支持社区字符串、SNMPv3 认证加密,且 Prometheus 只读拉取。
  • 指标丰富:接口流量、错包、CPU、内存、温度、风扇、电源、堆叠状态等全面覆盖。

2. 部署 snmp_exporter

GitHub releases 下载最新版二进制,或使用 Docker。

二进制部署:

wget https://github.com/prometheus/snmp_exporter/releases/download/v0.21.0/snmp_exporter-0.21.0.linux-amd64.tar.gz
tar xzf snmp_exporter-0.21.0.linux-amd64.tar.gz
cd snmp_exporter-0.21.0.linux-amd64

Docker 部署(推荐,方便挂载配置):

docker run -d \
  --name snmp_exporter \
  -v /path/to/snmp.yml:/etc/snmp_exporter/snmp.yml \
  -p 9116:9116 \
  prom/snmp-exporter:v0.21.0

默认监听 9116 端口,它本身不主动抓取,而是等待 Prometheus 的 scrape 请求,并通过参数传递目标设备信息(如 ?target=192.168.1.1)。


3. 生成 snmp.yml 配置文件

snmp.yml 定义了要查询哪些 OID、如何分组、以及 MIB 的映射。手工编写几乎不可能,必须使用官方生成器 generator

3.1 搭建生成器环境
git clone https://github.com/prometheus/snmp_exporter.git
cd snmp_exporter/generator

目录下的 generator.yml 是控制文件,我们需要在 modules 下定义一个适用于主流交换机的模块,比如 if_mib 用于接口统计,entity_sensor_mib 用于硬件状态。

3.2 典型 generator.yml 配置(覆盖 Cisco/华为/锐捷等)
modules:
  # 基础接口模块(基于 IF-MIB)
  if_mib:
    walk:
      - 1.3.6.1.2.1.2        # IF-MIB
      - 1.3.6.1.2.1.31.1.1   # IF-MIB 64-bit 计数器
    get:
      - 1.3.6.1.2.1.1.3.0    # sysUptime
    metrics:
      # 接口状态
      - name: ifAdminStatus
        oid: 1.3.6.1.2.1.2.2.1.7
        type: gauge
        help: "Admin status of the interface (1=up, 2=down)"
      - name: ifOperStatus
        oid: 1.3.6.1.2.1.2.2.1.8
        type: gauge
        help: "Operational status of the interface (1=up, 2=down)"
      # 带宽(64-bit 高容量计数器)
      - name: ifHCInOctets
        oid: 1.3.6.1.2.1.31.1.1.1.6
        type: counter
        help: "Inbound octets (64-bit)"
      - name: ifHCOutOctets
        oid: 1.3.6.1.2.1.31.1.1.1.10
        type: counter
        help: "Outbound octets (64-bit)"
      # 错包/丢弃
      - name: ifInErrors
        oid: 1.3.6.1.2.1.2.2.1.14
        type: counter
        help: "Inbound errors"
      - name: ifOutErrors
        oid: 1.3.6.1.2.1.2.2.1.20
        type: counter
        help: "Outbound errors"
      - name: ifInDiscards
        oid: 1.3.6.1.2.1.2.2.1.13
        type: counter
        help: "Inbound discards"
      - name: ifOutDiscards
        oid: 1.3.6.1.2.1.2.2.1.19
        type: counter
        help: "Outbound discards"
    # 其他需要的 OID 可继续添加...

实际生产环境建议直接使用社区预构建的模块,如 Prometheus 官方仓库自带的 if_mibentity_sensor_mib 等。生成命令:

make generate

这会拉取必要的 MIB 文件(需要网络,或提前准备),生成最终的 snmp.yml(可达数十 MB)。将生成的 snmp.yml 复制到 snmp_exporter 的配置路径。


4. 配置 Prometheus 抓取

prometheus.yml 中添加:

scrape_configs:
  - job_name: 'snmp'
    scrape_interval: 30s
    scrape_timeout: 25s
    metrics_path: /snmp
    params:
      module: [if_mib]          # 对应 snmp.yml 中定义的模块名
    static_configs:
      - targets:
        - 192.168.1.1           # 交换机管理 IP
        - 192.168.2.1
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9116  # snmp_exporter 地址

如果设备使用非默认 SNMP 社区名(默认为 public),需要在 params 中增加:

    params:
      module: [if_mib]
      auth: [my_community]          # v2c 社区

对于 SNMPv3,可配置:

    params:
      module: [if_mib]
      auth: [v3]
      username: [monitor]
      security_level: [authNoPriv]
      auth_protocol: [SHA]
      auth_password: [pass123]

重新加载 Prometheus,即可查询到 ifHCInOctets 等指标。


5. 核心监控指标与 PromQL

监控维度指标前缀关键 PromQL 示例
接口是否 UpifOperStatusifOperStatus == 1 表示 up
接口入/出流量ifHCInOctetsifHCOutOctetsrate(ifHCInOctets{instance="192.168.1.1"}[1m]) * 8 得 bps
接口带宽利用率配合 ifHighSpeed(Mbps)rate(ifHCInOctets[1m]) * 8 / (ifHighSpeed * 1000000)
入/出错包ifInErrorsifOutErrorsrate(ifInErrors[1m])
入/出丢包ifInDiscardsifOutDiscardsrate(ifInDiscards[1m])
CPU 利用率(私有 MIB)需根据厂商添加 OID 到模块例如 Cisco cpmCPUTotal5secRev
内存利用率厂商私有 MIB例如 ciscoMemoryPoolUsed
设备温度/风扇/电源entity-sensor-mibentPhySensorValue

如果需要 CPU 和内存,必须在 generator.yml 中增加对应厂商 MIB 的采集模块(如 Cisco 的 CISCO-PROCESS-MIB),然后生成新的 snmp.yml


6. Grafana 仪表盘

直接导入社区 Dashboard:

  • 交换机流量与健康概览:ID 14876(SNMP Device Overview),展示接口列表、流量、错误、CPU/内存(如支持)。
  • Cisco 专用:ID 12139(Cisco SNMP),含详细 CPU/内存/环境指标。
  • 通用网络设备:ID 11128(SNMP Interfaces),专为接口流量和错误设计。

你也可以基于 ifHCInOctets 创建一个 “Top 5 高流量端口” 面板,使用 topk(5, rate(ifHCInOctets[5m])) 查询。


7. 告警规则示例

groups:
  - name: switch_alerts
    rules:
      - alert: SwitchDown
        expr: up{job="snmp"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "交换机 {{ $labels.instance }} 不可达"

      - alert: InterfaceDown
        expr: ifOperStatus == 2   # 2=down
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "接口 {{ $labels.ifName }} ({{ $labels.instance }}) 已 down"

      - alert: HighInterfaceErrors
        expr: rate(ifInErrors[5m]) > 0.5 or rate(ifOutErrors[5m]) > 0.5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "接口 {{ $labels.ifName }} 错包速率过高"

      - alert: HighBandwidthUtilization
        expr: (rate(ifHCInOctets[5m]) * 8) / (ifHighSpeed * 1000000) > 0.85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "接口 {{ $labels.ifName }} 入方向带宽利用率 > 85%"

8. 进阶技巧

  • 多厂商环境:为每个厂商创建独立 module(如 cisco, huawei, arista),并在 Prometheus 的 params 中指定不同 module。
  • 动态发现:使用 file_sd 管理上百台交换机列表,或基于 Consul 的服务发现。
  • 性能调优:snmp_exporter 每次抓取都会执行 SNMP walk,设备数量多时应增加 scrape_interval(如 2m)并分散抓取时间。
  • 安全建议:所有 SNMP 通信限制在管理 VLAN,使用 SNMPv3 并启用加密;snmp_exporter 监听端口仅对 Prometheus 服务器开放。

至此,你的交换机不再是流量黑洞。从端口震荡、带宽打满到硬件故障,都能第一时间在 Grafana 上看到并触发告警,真正将网络可观测性补全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值