PromQL按instance分组时如何关联获取对应节点CPU核心容量指标
PromQL跨指标关联匹配节点属性的解决方案
核心问题说明
你遇到的核心冲突是两组指标的instance标签归属完全不同:左侧node_cpu_seconds_total的instance对应node exporter的服务地址,右侧kube_node_status_capacity_cpu_cores的instance对应kube-state-metrics的服务地址,无法直接通过on(instance)关联,需要基于节点名称作为公共关联键实现跨指标匹配。
可用解决方案
方案1:基于node_uname_info中转关联(无需修改Prometheus配置)
node exporter默认暴露的node_uname_info指标自带nodename标签,值与Kubernetes节点名称完全对应,可作为中转标签实现两次关联,直接可用的查询语句如下:
( (1 - ( avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[15s])) * on(instance) group_left(nodename) node_uname_info )) * 0.007 + 0.23 ) * 165 * 1.125 * on(nodename) group_left() kube_node_status_capacity_cpu_cores
逻辑说明:
- 第一次关联
on(instance) group_left(nodename):以instance为匹配键,给左侧的CPU使用率指标附加对应节点的nodename标签 - 第二次关联
on(nodename) group_left():以节点名为匹配键,将对应节点的CPU核心数指标值乘入最终计算结果,完全规避instance标签不匹配的问题
方案2:提前注入统一节点标签(查询性能更优)
如果需要频繁做这类节点级指标关联,建议修改Prometheus抓取配置,给node exporter和kube-state-metrics的抓取任务都注入统一的节点名标签,示例relabel配置如下:
relabel_configs: - source_labels: [__meta_kubernetes_pod_node_name] target_label: k8s_node_name
配置完成后所有相关指标都会带k8s_node_name标签,后续查询可以直接用该标签关联,语句更简洁,查询效率更高:
( (1 - avg by (k8s_node_name) (rate(node_cpu_seconds_total{mode="idle"}[15s]))) * 0.007 + 0.23 ) * 165 * 1.125 * on(k8s_node_name) group_left() kube_node_status_capacity_cpu_cores
注意事项
如果关联时出现匹配失败的情况,可先检查两个指标的节点名格式是否一致(比如大小写、域名后缀差异),可以用label_replace函数对节点名做格式统一后再关联。
内容的提问来源于stack exchange,提问作者msts1906
相关产品推荐
相关产品推荐

