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

Wavefront告警查询转Prometheus报错:如何修复语法解析错误?

Wavefront告警查询转Prometheus查询的报错修复

原需求与Wavefront查询

要转换的Wavefront告警查询:

msum(1200s, sum(ts("receiver.processingDelayInMs" and function="max", cluster="101*")>900000))>2)

核心逻辑:

  • 对每个集群的最大延迟判断是否超过900000ms(即900秒),满足则输出1,否则输出0
  • 用msum统计1200秒内每个集群的上述结果之和,最终判断受影响的集群数量是否超过2,触发告警

错误的Prometheus查询及报错

自行编写的Prometheus查询:

sum_over_time(
  sum(receiver_processingDelay_seconds_max{cluster="101.*"})
  > bool 900
) by (cluster) > bool 1.75

收到报错:

bad_data: invalid parameter "query": 1:127: parse error: ranges only allowed for vector selectors bad_data: 1:127: parse error: ranges only allowed for vector selectors

问题根源

sum_over_time() 函数的参数必须是范围向量(格式为指标名{标签}[时间范围]的带时间范围指标选择器),但你传入的是布尔表达式计算后的即时向量,不符合Prometheus语法要求,因此触发解析错误。

修复后的查询

以下是符合语法规则且匹配原逻辑的两种Prometheus查询方案:

方案1:统计1200秒内受影响的集群数量(匹配“超2个集群受影响”核心需求)

count(
  by(cluster) (
    max_over_time(receiver_processingDelay_seconds_max{cluster="101.*"}[1200s])
    > bool 900
  )
) > 2

方案2:统计1200秒内超阈值次数超过2的集群数量(匹配Wavefront原msum求和逻辑)

count(
  by(cluster) (
    sum_over_time(
      (receiver_processingDelay_seconds_max{cluster="101.*"} > bool 900)[1200s:]
    ) > 2
  )
) > 0

逻辑说明

方案1

  1. receiver_processingDelay_seconds_max{cluster="101.*"}[1200s]:获取每个集群过去1200秒内的最大延迟范围向量
  2. max_over_time(...):提取每个集群在1200秒内的最大延迟值,判断该集群是否出现过超阈值情况
  3. > bool 900:返回布尔向量(1=超阈值,0=未超)
  4. by(cluster):按集群聚合,确保每个集群仅输出一个结果
  5. count(...):统计超阈值的集群数量
  6. > 2:数量超过2时返回1,触发告警

方案2

  1. (receiver_processingDelay_seconds_max{cluster="101.*"} > bool 900)[1200s:]:先判断每个采样点是否超阈值,再获取过去1200秒内的布尔结果范围向量
  2. sum_over_time(...):对每个集群的布尔结果求和,得到1200秒内超阈值的次数
  3. > 2:筛选出次数超过2的集群
  4. count(...):统计这类集群的数量,>0表示存在符合条件的集群,触发告警

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:22:55