PromQL 中如何写 OR 逻辑运算?
PromQL 的 or 运算符合并两个向量的结果集:up{job="a"} or up{job="b"};标签匹配内部用 =~"a|b" 正则更简洁。本文讲解 or/and/unless 的语义与常见写法。
两种写法按场景选:标签内取值用正则 =~"a|b";合并两个不同查询的结果集用集合运算符 or。
场景一:同一标签取多个值(正则)
http_requests_total{status=~"500|502|503"}
最常用、最高效——一个查询搞定。
场景二:or 合并两个查询
# job=a 的实例 或 job=b 的实例
up{job="app"} or up{job="db"}
# 告警经典写法:错误率高 或 无数据
error_rate > 0.05 or absent(http_requests_total{job="app"})
or 的语义:左向量结果 + 右侧中标签集不与左侧重复的序列。
and / unless
# 且:CPU 高 且 内存高
cpu_usage > 0.8 and memory_usage > 0.9
# 排除:请求量大但错误率低的(除非)
rate(http_requests_total[5m]) unless rate(http_errors_total[5m])
常见问题(FAQ)
Q:or 之后标签对不上会怎样? 结果集标签取各自原有标签——面板图例可能不一致,必要时用 label_replace 规整。
Q:能用 or 合并不同指标名吗? 可以,metric_a or metric_b 合法,常用于兜底指标。