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

如何在Prometheus中正确使用AND运算符关联两个PromQL查询?

解决PromQL中AND运算符匹配节点失败的问题

问题根源

PromQL的AND运算符要求两侧时间序列的所有非metric名称的标签完全匹配,才会返回交集结果。你虽然通过label_replace把kube_node_spec_taint的node标签转为instance,但该指标还附带key、value、effect等额外标签,而内存使用率查询的标签集合(仅instance、job等)与它不一致,导致AND无法匹配到共同的时间序列。

解决方案

使用on()或ignoring()运算符,指定仅按instance标签进行匹配,忽略其他标签的差异。

1. 查询「已加污点且内存使用率超85%」的节点

(((node_memory_MemTotal_bytes{instance=~".*worker-.*"} - node_memory_MemAvailable_bytes{instance=~".*worker-.*"})/(node_memory_MemTotal_bytes{instance=~".*worker-.*"}-4399824896))*100) > 85
AND on(instance)
label_replace(kube_node_spec_taint{effect="PreferNoSchedule",node=~".*worker-.*"}, "instance", "$1", "node", "(.+)")
  • on(instance):明确仅通过instance标签匹配两侧的时间序列,忽略其他标签差异。

2. 查询「已加污点但内存使用率低于85%」的节点(用于移除污点)

(((node_memory_MemTotal_bytes{instance=~".*worker-.*"} - node_memory_MemAvailable_bytes{instance=~".*worker-.*"})/(node_memory_MemTotal_bytes{instance=~".*worker-.*"}-4399824896))*100) <= 85
AND on(instance)
label_replace(kube_node_spec_taint{effect="PreferNoSchedule",node=~".*worker-.*"}, "instance", "$1", "node", "(.+)")

替代写法(忽略指定标签)

如果你明确知道哪些标签是多余的,也可以用ignoring()直接忽略这些标签:

(((node_memory_MemTotal_bytes{instance=~".*worker-.*"} - node_memory_MemAvailable_bytes{instance=~".*worker-.*"})/(node_memory_MemTotal_bytes{instance=~".*worker-.*"}-4399824896))*100) > 85
AND ignoring(key, value)
label_replace(kube_node_spec_taint{effect="PreferNoSchedule",node=~".*worker-.*"}, "instance", "$1", "node", "(.+)")

内容的提问来源于stack exchange,提问作者geg.hz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:23:12