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

如何在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的利用率数据做运算,不用管标签匹配问题。

方案二:修复模板变量提取节点数的问题

如果还是想用模板变量,按下面步骤提取纯数字:

  1. 新建Query类型的模板变量,输入获取节点数的PromQL:
    count(count by (nodeName) (count_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[$__range])))
    
  2. 在变量的Regex字段填写/(\d+)/,这个正则会自动过滤掉返回结果里的空标签、时间戳,只提取纯数字节点数
  3. 之后在利用率查询里直接用这个变量就行,比如变量名叫node_count,查询写成:
    max by (nodeName) (max_over_time(some_executor_utilization{nodeName=~"someCustomer-.*"}[5m])) 
    * 
    (100.0 / $node_count)
    

内容的提问来源于stack exchange,提问作者juancn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:12:48