You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Prometheus查询sensor_status持续10分钟为0的完整时间段?

解决Prometheus中获取Gauge指标持续为0超过10分钟的完整时间段问题

问题分析

你之前用的查询语句sensor_status{job='myjob', type='streaming'} == 0 and (changes(sensor_status{job='myjob', type='streaming'}[10m]) == 0),在调用/api/v1/query_range时会按步长返回多个结果(比如步长1m的话,1小时能返回6个点)。这是因为它只判断当前时刻往前10分钟指标没变化且值为0,没法直接返回完整的连续时间段。

优化方案

方案1:用min_over_time确保10分钟内全为0

用min_over_time统计10分钟窗口里的最小值,如果最小值是0,就说明这段时间内指标一直是0。查询语句:

sensor_status{job='myjob', type='streaming'} == 0 
and 
min_over_time(sensor_status{job='myjob', type='streaming'}[10m]) == 0
  • 调用/api/v1/query_range时,建议把步长设成10m,这样每个返回的时间点就代表一个持续10分钟的有效周期;要是需要更精确的区间,步长可以设成1m,之后在客户端把连续符合条件的时间点合并成完整时间段就行。

方案2:直接定位区间的起始和结束时刻

如果想直接拿到每个id对应的完整持续区间(开始+结束时间),可以拆成两个查询:

  1. 查持续为0的开始时刻(指标从非0变成0的瞬间):
    (sensor_status{job='myjob', type='streaming'} == 0) 
    and 
    (sensor_status{job='myjob', type='streaming'} offset 1m) > 0
    
  2. 查持续为0的结束时刻(指标从0变回非0的瞬间):
    (sensor_status{job='myjob', type='streaming'} > 0) 
    and 
    (sensor_status{job='myjob', type='streaming'} offset 1m) == 0
    
  • 调用/api/v1/query_range时步长设成1m,然后在客户端把同一个id的开始、结束时间配对,计算时长后过滤出超过10分钟的区间就行。

方案3:用子查询统计连续0的样本数

通过子查询统计10分钟内连续为0的样本数量,确保覆盖整个10分钟窗口:

sensor_status{job='myjob', type='streaming'} == 0 
and 
count_over_time((sensor_status{job='myjob', type='streaming'} == 0)[10m:1m]) == 10
  • 这里[10m:1m]表示子查询的时间范围是10分钟、步长1m,count_over_time统计其中值为0的样本数,等于10就说明这10分钟里指标一直是0。

注意事项

  • 调整步长的时候要结合你的指标采集间隔,别步长太小导致结果冗余,也别太大漏掉有效区间。
  • 如果指标经常长时间持续为0(比如几小时),方案1配合客户端合并连续时间点的方式最高效。

内容的提问来源于stack exchange,提问作者tomen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:05:33