如何在Prometheus中对一系列Gauge指标求和并在Grafana中展示为单一标量?
解决Statsd Gauge转Prometheus后时间范围内总请求数的标量计算问题
你的场景很典型:Statsd里每分钟重置的Gauge代表当分钟请求数,Prometheus每15秒抓取一次,导致每个分钟内有4个重复的数值点。现在要把时间范围内的所有分钟请求数求和成单一标量,其实只需要调整PromQL的聚合方式即可。
直接可用的查询语句
sum by () (avg_over_time(my_requests[1m]))
为什么这个查询能解决问题?
拆解一下逻辑:
avg_over_time(my_requests[1m]):对每个1分钟的时间窗口计算平均值。因为每个窗口内的4个抓取点都是同一个数值(比如第一分钟的67),所以平均值正好等于该分钟的请求数。在3分钟的时间范围内,这个子查询会生成3个数据点:67、70、55。sum by () (...):把这些分钟级的数据点全部求和,最终输出一个单一的标量值(192),完美匹配你的需求。
备选方案(用sum_over_time实现)
如果你更习惯用sum_over_time,也可以这样写:
sum by () (sum_over_time(my_requests[1m]) / 4)
原理是每个1分钟窗口有4个重复的数值,sum_over_time会得到67*4这样的结果,除以4就还原出当分钟的请求数,再求和即可。
Grafana面板设置提示
要让这个数值以单一标量展示,记得把Grafana的面板类型改成Stat(或者旧版的Single Stat),这样面板就会直接显示求和后的总数值,而不是折线图。如果你的时间范围包含不完整的分钟(比如3分10秒),可以给查询加上对齐参数,确保只计算完整分钟的数据:
sum by () (avg_over_time(my_requests[1m] align 1m))
align 1m会让窗口严格按分钟边界对齐,避免包含不完整分钟的无效数据。
内容的提问来源于stack exchange,提问作者lightspeed
相关产品推荐
相关产品推荐

