文章目录
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_mib、entity_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 示例 |
|---|---|---|
| 接口是否 Up | ifOperStatus | ifOperStatus == 1 表示 up |
| 接口入/出流量 | ifHCInOctets、ifHCOutOctets | rate(ifHCInOctets{instance="192.168.1.1"}[1m]) * 8 得 bps |
| 接口带宽利用率 | 配合 ifHighSpeed(Mbps) | rate(ifHCInOctets[1m]) * 8 / (ifHighSpeed * 1000000) |
| 入/出错包 | ifInErrors、ifOutErrors | rate(ifInErrors[1m]) |
| 入/出丢包 | ifInDiscards、ifOutDiscards | rate(ifInDiscards[1m]) |
| CPU 利用率(私有 MIB) | 需根据厂商添加 OID 到模块 | 例如 Cisco cpmCPUTotal5secRev |
| 内存利用率 | 厂商私有 MIB | 例如 ciscoMemoryPoolUsed |
| 设备温度/风扇/电源 | entity-sensor-mib | entPhySensorValue |
如果需要 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 上看到并触发告警,真正将网络可观测性补全。


400

被折叠的 条评论
为什么被折叠?



