如何编写PromQL实现Grafana展示Prometheus counter当日零点至今增量
Prometheus Counter 当日零点至今增量查询方案
纯PromQL 原生实现
无需依赖Grafana特性,直接在Prometheus中即可查询:
# 替换your_counter为你的实际指标名,UTC时区适用 clamp_min( your_counter - sum_over_time(your_counter[1m] offset (time() - (time() % 86400)) * 1s), 0 )
逻辑说明
time() % 86400计算当前时间距当日零点的秒数offset (time() - (time() % 86400)) * 1s将查询偏移到当日零点的时间点sum_over_time(your_counter[1m] offset ...)取零点前后1分钟的指标值做平滑,避免零点无采样点导致查询失败clamp_min(...,0)处理极低概率的Counter重置场景,避免出现负数值- 如果你所在时区不是UTC,需要添加时区偏移,以东八区为例:
# 东八区适配版本 clamp_min( your_counter - sum_over_time(your_counter[1m] offset (time() - ((time() + 28800) % 86400)) * 1s), 0 )
配合Grafana使用方案
如果使用Grafana做可视化,可以直接利用Grafana的时间宏简化查询:
- 若仅需查看当日实时增量,将图表时间范围设置为
今日至今,直接使用如下查询即可:
increase(your_counter[$__range])
- 若需要在月粒度图表中展示每日的增量对比,将图表步长设置为1天,使用如下查询:
increase(your_counter[1d])
该语句会自动计算每个自然天的Counter增量,不会和历史数据累加,直接满足月维度每日增量对比的需求。
注意事项
- 如果你100%确认Counter永远不会重置,可以将
increase替换为delta,查询效率更高 - 生产环境建议将
sum_over_time中的采样窗口调整为和你的Prometheus采集间隔匹配,比如采集间隔是15s就设为[30s],避免窗口内无采样点
内容的提问来源于stack exchange,提问作者Pyrejkee
相关产品推荐
相关产品推荐

