如何用PromQL检测最近1天新增的Counter类型时间序列
修正后的Prometheus查询方案
原查询的问题在于,它仅判断过去1天内是否有数据上报,而非序列是否是最近1天内新生成的——只要序列后续持续上报数据,即使超过1天也会一直返回1,不符合你的需求。
修正思路
核心是找到目标标签组合序列的首次出现时间戳,然后判断当前时间与该时间戳的间隔是否≤24小时(86400秒):
- 用
min(timestamp(My_metric{...})) by (label_1, label_2)获取指定标签组合的最早样本时间戳(即序列生成时间) - 用当前时间
time()减去该时间戳,判断差值是否在24小时内
最终查询语句
time() - min(timestamp(My_metric{label_1="v1",label_2="v2"})) by (label_1, label_2) <= 86400
效果说明
- 当序列在最近24小时内生成时,查询返回值为
1,标签为label_1="v1",label_2="v2" - 当序列生成超过24小时,或该标签组合从未有过数据时,查询返回空值
注意事项
- 确保Prometheus的数据保留时间≥1天,否则无法正确获取序列的首次出现时间戳
- 如果需要明确返回
0而非空值,可以用or vector(0)扩展,但通常空值更符合监控告警场景的需求
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

