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

如何在PromQL(Prometheus)中计算大于0的值占比

在PromQL中计算大于0的值的占比

你的问题核心是没处理好布尔过滤的逻辑——TS_VEC>0会直接过滤掉值≤0的样本,而不是将它们转为0,导致后续计数和除法时出现标签不匹配或统计不全的问题。下面是两种正确的实现方式:

方法1:兼容低版本Prometheus(2.27以下)

sum_over_time(
  ((vector(1) * (TS_VEC > 0)) or vector(0))[24h]
) / count_over_time(TS_VEC[24h])
  • vector(1) * (TS_VEC > 0):把所有值>0的样本转为1,同时过滤掉值≤0的样本
  • or vector(0):为被过滤掉的时刻填充0,确保每个时间点都有样本数据
  • sum_over_time(...[24h]):统计24小时内值为1的样本总数(即大于0的样本数)
  • count_over_time(TS_VEC[24h]):统计24小时内的总样本数
  • 两者相除得到占比

方法2:使用if函数(Prometheus 2.27+)

如果你的Prometheus版本足够新,用if函数会更直观:

sum_over_time(
  if(TS_VEC > 0, 1, 0)[24h]
) / count_over_time(TS_VEC[24h])
  • if(TS_VEC > 0, 1, 0):直接将每个样本转为1(>0)或0(≤0),无需额外填充
  • 后续的sum_over_time和count_over_time逻辑和方法1一致

注意事项

如果你的指标存在缺失样本的情况(比如某些时刻未采集到数据),count_over_time只会统计实际存在的样本数。如果需要把缺失时刻也算作0,可配合fill函数先补全缺失值,再进行统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:26:03