如何正确使用Prometheus中的AND运算符来连接两个查询?

问题描述 投票:0回答:1

我尝试组合两个 PromQL 查询以在 Openshift 集群中创建警报和自动化,但在使用 AND 运算符时遇到问题。这个想法是当内存使用量超过某个阈值时应用污点,并在内存使用量低于另一个阈值时将其删除。

我有一个查询来检查我的工作节点中的节点污染:

kube_node_spec_taint{effect="PreferNoSchedule",node=~".*worker-.*"}

返回超过某一内存阈值的工作节点:

(((node_memory_MemTotal_bytes{instance=~".*worker-.*"} - node_memory_MemAvailable_bytes{instance=~".*worker-.*"})/(node_memory_MemTotal_bytes{instance=~".*worker-.*"}-4399824896))*100)>85

由于我试图只获取满足这两个条件(应用污点和超过/低于内存阈值)的 Openshift 节点,我知道我应该使用 AND 运算符。但是,查询返回

 No datapoints found.

我正在运行这个:

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

如您所见,我正在使用 label_replace 函数重命名

kube_node_spec_taint
查询中的字段,因为它在另一个查询中被命名为“instance”而不是“node”。这工作正常,我在实例标签下获取节点名称。

我尝试反转查询顺序,将每个查询放在括号中,使用另一个查询而不是内存查询......我无法让 Prometheus 只显示满足这两个条件的节点。如果我单独运行查询,我会得到正确的结果(实例标签下的相同节点名称)。

如果我使用 OR 而不是 AND 运行相同的查询,我可以在实例查询下看到相同的结果,但我无法让它与 AND 一起使用。

编辑:我觉得让它工作的关键是让两个查询仅返回“实例”字段,但我也找不到办法做到这一点。

openshift prometheus promql
1个回答
0
投票

解决了!

我设法使用

sum by
函数组合两个查询。它修改了结果,所以我只得到了我求和的字段(即使没有进行加法操作)。

最终查询如下所示:

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

sum by (instance)((((node_memory_MemTotal_bytes{instance=~".*worker-.*"}- node_memory_MemAvailable_bytes{instance=~".*worker-.*"})/(node_memory_MemTotal_bytes{instance=~".*worker-.*"}-4399824896))*100)<70) AND sum by (instance)((label_replace(kube_node_spec_taint{effect="PreferNoSchedule",node=~".*worker-.*"}, "instance", "$1", "node","(.+)")))
© www.soinside.com 2019 - 2024. All rights reserved.