如何将Prometheus图例中的Docker网桥ID转换为可读服务名
可用实现方案(无需修改node_exporter)
以下方案按实现成本从低到高排序:
1. Grafana 值映射(最推荐,适合用Grafana做可视化的场景)
- 操作逻辑:通过Grafana面板的值映射功能,直接将原始网桥ID映射为可读服务名,无需修改Prometheus侧任何配置
- 操作步骤:
- 执行脚本批量导出网桥ID与服务名的对应关系:
docker network ls --format "br-{{.ID}} {{.Name}}" | awk '{gsub(/_default$/, "", $2); print $1" "$2}' - 打开对应面板的编辑界面,进入「值映射」配置页,选择「值到文本」映射类型,将导出的映射关系批量录入
- 保持图例配置为
{{device}} received即可,Grafana渲染时会自动替换为映射后的服务名
- 执行脚本批量导出网桥ID与服务名的对应关系:
- 优化方案:可配置crontab定时任务,定期调用Grafana API自动更新值映射表,无需人工维护映射关系
2. PromQL 标签动态替换(适合映射关系较少、变动频率低的场景)
使用PromQL内置的label_replace函数,在查询时动态生成服务名标签,示例查询语句:
label_replace( irate(node_network_receive_bytes_total{job="job-name",device=~"br-.*",name="a-name"}[5m]), # 新标签名 "service_name", # 替换后的服务名 "a-service", # 匹配的原始标签 "device", # 匹配的原始网桥ID正则 "br-6c596943b7c8" )
有多组映射时嵌套多层label_replace即可,完成后将图例配置修改为{{service_name}} received即可生效。
3. Prometheus Recording Rule 预生成指标(适合查询量较大的生产环境)
在Prometheus配置中添加预聚合规则,提前生成带服务名标签的专用指标,避免每次查询都执行标签替换逻辑,提升查询性能,示例配置:
groups: - name: custom_network_metrics interval: 1m rules: - record: node_network_receive_bytes_service:irate_5m expr: | # 此处填写嵌套好所有label_replace逻辑的PromQL语句 label_replace(irate(node_network_receive_bytes_total{job="job-name",device=~"br-.*",name="a-name"}[5m]),"service_name","a-service","device","br-6c596943b7c8")
后续查询直接使用node_network_receive_bytes_service:irate_5m指标,图例配置为{{service_name}} received即可。
4. Prometheus 采集阶段重写标签(适合全局统一修改标签的场景)
在Prometheus对应采集job的metric_relabel_configs配置段添加标签替换规则,采集指标时直接将device标签替换为服务名,无需修改查询与面板配置,效果和修改node_exporter输出一致。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

