Grafana中Pod重启后Rate查询出现重复图例与曲线如何合并为单条
问题结论
该需求完全可以实现。
故障原因
你当前使用的查询未做维度聚合:logins_total是携带实例维度标签的Counter(计数器)类型指标,Pod重启后,新、旧Pod的唯一标识标签(如Pod名称、实例ID、重启次数标签等)存在差异,Prometheus会将二者识别为两条独立时间序列。
- 当查询范围选最近1小时:旧Pod的序列早已停止上报,不在查询窗口内,因此只返回新Pod的单条序列,展示正常
- 当查询范围拉大到最近3小时:时间窗口覆盖了Pod重启前后的时段,新、旧Pod的序列同时被命中返回,就会出现重复图例、多条曲线的问题
修复方案
使用sum聚合函数合并同业务维度下的所有登录序列即可,修正后的基础PromQL如下:
sum(rate(logins_total[1h])) * 3600
该语句会对查询窗口内所有logins_total序列的速率值做求和计算,自动合并重启前后新老Pod产生的独立序列,无论查询时间范围设置为多大,最终都只会返回单条聚合后的时间序列,和1小时范围查询的展示效果完全一致。
适配多维度场景的注意事项
如果你的logins_total指标还携带了需要保留拆分维度的标签(比如环境env、应用标识app、登录终端类型client_type等),可以在sum后添加by子句保留对应维度,避免不同业务维度的数据被错误合并。
举个例子,如果你需要按环境、应用维度拆分展示独立的登录速率曲线,可以使用如下语句:
sum by (env, app) (rate(logins_total[1h])) * 3600
这种写法既可以合并同一应用下不同Pod(含重启前后的新旧Pod、扩缩容产生的临时Pod)的重复序列,也不会混淆不同环境、不同应用的登录数据,是Prometheus查询多实例部署业务指标的标准最佳实践。
补充说明:即使不修改查询,等旧Pod对应的序列停止上报超过Prometheus的指标保留时长后,长周期查询也不会再出现重复曲线,但使用sum聚合是即时生效、长期稳定的方案,后续Pod重启、扩缩容都不会再触发同类多曲线问题。
内容的提问来源于stack exchange,提问作者ulim
相关产品推荐
相关产品推荐

