Prometheus 通过 SNMP Exporter 采集交换机/路由器流量数据,需完成三步:设备启用 SNMP、Exporter 配置模块并暴露指标、Prometheus 抓取后用 rate() 计算带宽。

Prometheus 本身不直接采集交换机或路由器的流量数据,它依赖 SNMP Exporter 这个中间组件,通过 SNMP 协议从设备拉取原始指标(如 ifInOctets、ifOutOctets),再转换成 Prometheus 可识别的时序指标,最终由 Prometheus 定期抓取。
关键不是“怎么写代码”,而是理清三步链路:设备开 SNMP → Exporter 配置好规则 → Prometheus 正确抓取并计算流量。
1. 确保交换机/路由器已启用 SNMP 并开放只读访问
这是前提。不同厂商配置略有差异,但核心一致:
- 启用 SNMP v2c 或 v3(推荐 v3 更安全)
- 设置只读团体名(v2c)或用户凭证(v3)
- 允许 Prometheus 所在服务器的 IP 访问
- 确认设备支持标准 MIB(如 IF-MIB、IP-MIB),多数主流设备(华为、Cisco、锐捷、H3C)都默认支持
例如 Cisco IOS 常见配置片段:
snmp-server community public RO snmp-server location "Core Switch" snmp-server contact "ops@example.com"
华为交换机(v2c)示例:
snmp-agent community read cipher public snmp-agent sys-info version v2c
⚠️ 注意:避免使用默认 community(如
public/private),生产环境务必改用强密码,并限制源 IP。
Skill Weave Chains — 技能链路由引擎下载开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
2. 用 snmp_exporter 抓取并暴露流量指标
snmp_exporter 不主动轮询,而是作为 HTTP 服务等待 Prometheus 请求,每次请求携带目标地址(?target=192.168.1.1)和模块(?module=if_mib)。
-
流量相关的核心 OID 来自 IF-MIB:
-
ifInOctets(进向字节数)→ 对应ifHCInOctets(64 位,更准) -
ifOutOctets(出向字节数)→ 对应ifHCOutOctets - 还有
ifOperStatus(接口状态)、ifSpeed(带宽)等辅助指标
-
-
snmp.yml中需定义对应 module,例如:modules: cisco_if: walk: [1.3.6.1.2.1.2, 1.3.6.1.2.1.31.1.1] # IF-MIB + IF-MIB-HC version: 2 auth: community: public -
启动 snmp_exporter(监听
:9116):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
✅ 验证是否生效:直接浏览器访问
http://localhost:9116/snmp?target=192.168.1.1&module=cisco_if,应返回类似snmp_ifHCInOctets{ifDescr="GigabitEthernet1/0/1"} 1.23456e+09的指标。
3. Prometheus 抓取并计算实时带宽(bps)
Prometheus 抓到的是累计字节数(counter 类型),要算出瞬时速率(如 Mbps),必须用 rate() 或 irate() 函数。
-
在
prometheus.yml中添加 job:</li><li><p>job_name: 'network-devices' metrics_path: /snmp params: module: [cisco_if] static_configs:</p><ul><li>targets:<ul><li>192.168.1.1 # 交换机</li><li>192.168.1.254 # 路由器 relabel_configs:</li></ul></li><li>source_labels: [<strong>address</strong>] target_label: __param_target</li><li>source_labels: [__param_target] target_label: instance</li><li>target_label: <strong>address</strong> replacement: 192.168.0.5:9116 # snmp_exporter 地址
在 Grafana 或 PromQL 中计算入向带宽(单位:bps):
rate(snmp_ifHCInOctets{instance="192.168.1.1"}[2m]) * 8
若想看某接口(比如 GigabitEthernet1/0/1)的 Mbps:
rate(snmp_ifHCInOctets{ifDescr="GigabitEthernet1/0/1"}[2m]) * 8 / 1000 / 1000
? 提示:用
rate()(适合告警)比irate()(适合瞬时毛刺)更稳定;时间窗口建议 ≥2 倍 scrape_interval(如抓取间隔 30s,窗口设为2m)。
4. 补充建议:让流量监控更实用
- 接口名映射可读:在
snmp.yml的relabel_configs或 Prometheus 的metric_relabel_configs中,用ifIndex关联ifDescr或ifAlias,把数字接口转成业务名(如"uplink-to-core") - 区分设备类型:用
static_configs的labels手动打标,如{vendor="huawei", role="core-switch"} - 加上带宽利用率:
rate(...) * 8 / (snmp_ifSpeed or 1000000000),注意ifSpeed可能为 0(如未协商完成),需加unless过滤 - 错包/丢包率也一并采集:
ifInErrors,ifOutErrors,ifInDiscards同样来自 IF-MIB,是判断链路健康的关键补充
不复杂但容易忽略。

















