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

如何用纯PromQL避免稀疏指标导致计算结果缺失?

解决PromQL计算4xx错误率时缺失标签组合的问题

问题背景

现有不可修改的计数器指标:http_requests_2xx_count、http_requests_3xx_count、http_requests_4xx_count、http_requests_5xx_count,需计算4xx错误率,原使用的PromQL为:

rate(http_requests_4xx_count[15m]) / (rate(http_requests_2xx_count[15m]) + rate(http_requests_3xx_count[15m]) + rate(http_requests_4xx_count[15m]) + rate(http_requests_5xx_count[15m])) * 100

当某标签对应的HTTP端点长时间无特定状态码请求时,对应计数器停止上报,导致计算结果丢失该标签组合的行。需通过纯PromQL实现类似SQL外连接或NaN替换为0的效果,避免丢弃有效标签组合。

解决方案

核心思路是先获取所有存在的标签组合(只要任意状态码指标有该组合数据),再将每个状态码的rate与该标签集合做左连接,缺失值补0。

最终PromQL示例

假设需要保留的标签为endpoint和method,调整后的查询如下:

(
  rate(http_requests_4xx_count[15m])
  or on(endpoint, method) group_left() vector(0)
)
/
(
  (rate(http_requests_2xx_count[15m]) or on(endpoint, method) group_left() vector(0))
  + (rate(http_requests_3xx_count[15m]) or on(endpoint, method) group_left() vector(0))
  + (rate(http_requests_4xx_count[15m]) or on(endpoint, method) group_left() vector(0))
  + (rate(http_requests_5xx_count[15m]) or on(endpoint, method) group_left() vector(0))
)
* 100

关键说明

  • 标签匹配:on(endpoint, method)需明确写出所有需要保留的维度标签,确保左连接时能匹配到所有存在的标签组合。
  • 补0逻辑:or on(...) group_left() vector(0)会将未匹配到对应状态码数据的标签组合的rate值替换为0,避免因指标缺失导致计算结果丢失。
  • 边界情况:若某标签组合下所有状态码均无数据,该组合本身不存在于任何指标中,PromQL无法生成该组合的结果;但只要有任意状态码存在该组合数据,即可通过此方法保留并补全其他状态码的0值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:39:55