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
receiver_processingDelay_seconds_max{cluster="101.*"}[1200s]:获取每个集群过去1200秒内的最大延迟范围向量max_over_time(...):提取每个集群在1200秒内的最大延迟值,判断该集群是否出现过超阈值情况> bool 900:返回布尔向量(1=超阈值,0=未超)by(cluster):按集群聚合,确保每个集群仅输出一个结果count(...):统计超阈值的集群数量> 2:数量超过2时返回1,触发告警
方案2
(receiver_processingDelay_seconds_max{cluster="101.*"} > bool 900)[1200s:]:先判断每个采样点是否超阈值,再获取过去1200秒内的布尔结果范围向量sum_over_time(...):对每个集群的布尔结果求和,得到1200秒内超阈值的次数> 2:筛选出次数超过2的集群count(...):统计这类集群的数量,>0表示存在符合条件的集群,触发告警
内容的提问来源于stack exchange,提问作者LifeStartsAtHelloWorld
相关产品推荐
相关产品推荐

