K8s集群中如何在Grafana表格展示多相似PromQL查询结果
解决Grafana中按节点展示多状态Pod统计表格的问题
问题背景
Prometheus和Grafana部署在Kubernetes集群中,希望将多个仅标签过滤条件不同的关联查询结果,合并为同一表格展示——按节点统计各状态(Running、Pending、Failed等)的Pod数量,预期表格格式如下:
| Node | Running | Failed | Pending | ... |
|---|---|---|---|---|
| node-1 | 10 | 1 | 0 | ... |
| node-2 | 12 | 2 | 1 | ... |
此前尝试配置多个查询并使用Merge转换时,出现错误:Merge has no effect when applied on a single frame,无法实现预期效果。
错误原因说明
Merge has no effect when applied on a single frame提示的含义是:当前仅存在单个数据帧(比如仅执行了一个查询,或多个查询的结果被自动合并为一个帧),而Merge转换的作用是合并多个独立的数据帧,因此无法生效。
最优解决方案:单PromQL查询+Pivot转换
无需创建多个查询,通过优化PromQL语句配合Grafana的Pivot转换,即可直接生成目标表格,步骤如下:
1. 编写统计用PromQL
使用count函数结合标签关联,一次性获取所有节点各状态的Pod数量:
count by(node, phase) ( kube_pod_status_phase{phase=~"Running|Pending|Failed"} != 0 * on(pod) group_left(node) kube_pod_info )
- 逻辑说明:通过
* on(pod) group_left(node)将kube_pod_info中的node标签关联到kube_pod_status_phase指标; count by(node, phase)按节点和Pod状态分组统计数量;- 可替换
phase=~"..."为自定义变量(如$pod_phase),实现状态列的动态切换。
2. 配置Grafana表格与转换
- 创建一个表格类型的面板,将上述PromQL作为唯一查询;
- 进入「转换」标签页,添加Pivot转换;
- 配置Pivot参数:
- 「Row field」:选择
node(作为表格的行,对应Node列); - 「Column field」:选择
phase(作为表格的列,对应Running、Failed等状态); - 「Value field」:选择
Value(对应统计的Pod数量);
- 「Row field」:选择
- 可选:在表格面板的「选项」中,将「空值处理」设置为
0,确保无对应状态Pod的节点显示0而非空值。
备选方案:多查询+Merge转换(不推荐)
如果坚持使用多查询方式,需确保每个查询返回独立的数据帧,再通过Merge合并:
- 为每个Pod状态创建单独查询,例如:
- Running状态:
count by(node) (kube_pod_status_phase{phase="Running"} != 0 * on(pod) group_left(node) kube_pod_info) - Failed状态:
count by(node) (kube_pod_status_phase{phase="Failed"} != 0 * on(pod) group_left(node) kube_pod_info)
- Running状态:
- 确保每个查询的结果都包含
node标签和对应数值; - 添加Merge转换,此时每个查询对应一个独立数据帧,Merge会自动按
node标签合并为同一表格。
此方案缺点是查询数量随状态数增加而增多,维护成本高,性能不如单查询方案。
内容的提问来源于stack exchange,提问作者Joseph Gagnon
相关产品推荐
相关产品推荐

