如何在PromQL查询中自动计算集群节点数量?
问题描述
我要在Grafana仪表盘构建集群利用率图表,用来快速判断集群是否过载或负载失衡(利用率超过80%通常会出现排队情况)。目前用的PromQL查询是:
max by (nodeName) (max_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[5m])) * (100.0 / 9)
这个指标返回值范围是[0-1],需要通过节点数转换为百分比,但现在得手动指定节点数9。我想直接在查询里通过nodeName=~"someCustomer-.*"标签匹配自动计算节点数,试过计数查询:
count(count by (nodeName) (count_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[$__range])))
这个查询能得到节点数(示例里是9),但因为标签不匹配没法用来计算缩放系数。也试过用模板变量:
query_result(count(count by (nodeName) (count_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[$__range]))))
但返回结果带多余内容(比如{} 9 1702826153000),没法直接提取节点数。理想情况是不依赖模板变量直接在查询里实现,不行的话就解决模板变量提取的问题。
解决方案
方案一:不依赖模板变量的PromQL写法
直接用sum()包裹节点计数查询,就能得到无标签的总节点数,和利用率序列做运算时会自动广播匹配:
max by (nodeName) (max_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[5m])) * (100.0 / sum(count by (nodeName) (count_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[$__range]))))
原理:count by (nodeName)会给每个匹配的节点生成一条计数结果,sum()把这些结果加起来就是总节点数。这个总节点数是无标签的标量,PromQL会自动把它和每个nodeName的利用率数据做运算,不用管标签匹配问题。
方案二:修复模板变量提取节点数的问题
如果还是想用模板变量,按下面步骤提取纯数字:
- 新建Query类型的模板变量,输入获取节点数的PromQL:
count(count by (nodeName) (count_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[$__range]))) - 在变量的Regex字段填写
/(\d+)/,这个正则会自动过滤掉返回结果里的空标签、时间戳,只提取纯数字节点数 - 之后在利用率查询里直接用这个变量就行,比如变量名叫
node_count,查询写成:max by (nodeName) (max_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[5m])) * (100.0 / $node_count)
内容的提问来源于stack exchange,提问作者juancn
相关产品推荐
相关产品推荐

