如何用PromQL处理递增计数器指标,计算服务可用性占比?
解决递增计数器的健康状态检测与统计问题
1. 检测5分钟窗口内的健康状态
针对你的递增计数器指标,用increase函数计算5分钟窗口内的增量,判断是否存在增量即可标记健康状态:
# 生成健康状态序列(1=健康,0=不健康) increase(metricA{status='healthy'}[5m]) > 0
这个表达式会输出你需要的1,1,1,...,0,0,...1形式序列:1代表5分钟窗口内指标有增量(服务健康),0代表无增量(服务不健康)。
2. 统计健康/不健康的累计次数
用sum_over_time函数对上述状态序列做时间维度的累计求和,就能得到指定时间段内的健康、不健康次数:
# 统计最近1天内的健康次数(步长1分钟,确保每个5分钟窗口状态被覆盖) sum_over_time( (increase(metricA{status='healthy'}[5m]) > 0)[1d:1m] ) # 统计最近1天内的不健康次数 sum_over_time( (increase(metricA{status='healthy'}[5m]) == 0)[1d:1m] )
说明:[1d:1m]表示取过去1天的数据,以1分钟为步长生成序列,你可以根据需求调整时间范围(比如[7d:1m]代表最近7天)。
3. 计算健康状态占比
用健康次数除以总检测次数即可得到占比:
# 健康占比(结果为0-1的浮点数,乘以100可转为百分比) sum_over_time( (increase(metricA{status='healthy'}[5m]) > 0)[1d:1m] ) / count_over_time( (increase(metricA{status='healthy'}[5m]) > 0)[1d:1m] )
总检测次数也可以用「健康次数+不健康次数」替代,结果一致。
原语句失效的原因
你的原语句SUM(increase(metricA{status='healthy'}[10m])==0)有两个核心问题:
- 窗口长度错误:需求是检测5分钟窗口,但你用了
[10m]; - 聚合方式错误:
SUM()是对标签维度求和,而非时间序列的多个时间点求和,统计时间维度的累计次数必须用sum_over_time函数。
内容的提问来源于stack exchange,提问作者Muthu
相关产品推荐
相关产品推荐

