Prometheus告警表达式异常:两指标比较返回空结果求解决
Prometheus跨指标比较告警无结果的解决办法
问题根源
Prometheus的向量比较运算(比如>)要求左右两侧的时间序列标签集完全一致——标签名、标签值都得对应上,否则会过滤掉所有不匹配的样本对,最终返回空结果。你用固定值100比较时,固定值会自动适配所有标签的样本,所以能正常触发告警,但跨指标比较时标签不匹配就会失效。
可行解决方案
对齐标签集(优先推荐)
先分别执行以下表达式,检查两个指标的标签是否完全一致:query_result_employees_countquery_result_total_registered查看返回结果的标签列(比如
job、instance、自定义业务标签),如果标签不一致,调整指标的采集配置(比如Exporter的参数、采集规则),让两者标签完全匹配,之后直接用原表达式即可生效。指定/忽略匹配标签
如果业务上不需要标签完全匹配,用on()指定仅用某几个标签做匹配,或者ignoring()忽略差异标签:- 仅用
job标签匹配:query_result_employees_count > on(job) query_result_total_registered - 忽略
instance标签的差异:query_result_employees_count > ignoring(instance) query_result_total_registered
- 仅用
处理一对多/多对一匹配
如果其中一个指标是全局单值(比如总注册数是整个系统的统计值),另一个是多实例值(比如每个节点的员工数),用group_left()或group_right()实现关联:- 让每个员工数样本关联全局注册数:
query_result_employees_count > group_left() query_result_total_registered
- 让每个员工数样本关联全局注册数:
验证步骤
调整表达式后,在Prometheus的Graph页面执行,当query_result_employees_count大于query_result_total_registered时,应该能看到对应的时间序列返回1(表示条件成立),此时配置告警规则就能正常触发。
内容的提问来源于stack exchange,提问作者Chillax
相关产品推荐
相关产品推荐

