如何在Grafana中绘制Prometheus计数器7天累计请求趋势图
解决Grafana中Prometheus计数器的累计请求数图表问题
我来帮你搞定这个问题!首先得明确你之前的查询为什么不符合预期:sum(increase(http_requests_total{...}[7d])) 是每个时间点计算过去7天的总增量,随着时间推进,旧的日期会被移出7天窗口,新的日期加入,所以数值会波动,而你需要的是从图表起始时间开始,到当前时间点的累计总和——也就是一条持续递增的曲线,不会因为旧数据移出窗口而波动。
正确的查询语句
你可以用PromQL的cumulative_sum函数配合increase和聚合操作来实现需求,具体语句如下:
cumulative_sum( sum( increase(http_requests_total{method="POST",path="/resource/aaa",statusClass="2XX"}[$__interval]) ) by () )
逐部分解释
$__interval:这是Grafana的内置变量,会根据你的图表时间范围和自动计算的分辨率生成合适的时间步长,确保每个数据点的时间窗口既不会太细导致数据冗余,也不会太粗丢失细节。increase(...)[$__interval]:计算每个应用实例在当前步长窗口内的请求增量,而且会自动处理计数器重置的情况(比如实例重启后计数器从0开始,increase能正确识别并计算真实增量)。sum(...) by ():把所有实例的增量汇总,得到该时间窗口内的全局总请求数。cumulative_sum(...):将每个时间窗口的总请求数依次累加,最终得到从图表起始时间到当前点的累计请求总和,完全符合你给出的示例效果。
匹配你的示例场景验证
假设你的图表时间范围是第2天到第8天,步长设为1天:
- 第2天:
increase得到5,cumulative_sum结果为5 - 第3天:
increase得到15,累计总和为5+15=20 - 第4天:
increase得到10,累计总和为30 - ...以此类推,最终第8天的累计总和为70,和你预期的结果完全一致。
额外注意事项
- 如果你的Prometheus版本低于2.20,
cumulative_sum函数可能不支持,建议升级到较新版本的Prometheus。 - 如果你希望强制按天分段统计(而不是依赖Grafana自动步长),可以把
$__interval替换为1d,这样每个数据点对应一天的增量累计。 - 确保Prometheus的抓取间隔(
scrape_interval)和Grafana的步长匹配,避免出现数据不准确的情况。
内容的提问来源于stack exchange,提问作者GavinE-OVO
相关产品推荐
相关产品推荐

