基于Prometheus、cAdvisor在Grafana中获取容器CPU使用率的问题
解决PromQL自动获取总CPU核心数计算容器CPU使用率的问题
正确的查询语句
如果你的环境中machine_cpu_cores是按每个核心生成一条指标,可使用以下查询自动获取总核心数并计算百分比:
sum(rate(container_cpu_usage_seconds_total{name=~".+"}[$__rate_interval])) by (name) / sum(machine_cpu_cores) without (cpu) * 100
如果你的环境有多台机器,需要按机器实例关联指标(避免跨机器核心数混用):
sum(rate(container_cpu_usage_seconds_total{name=~".+"}[$__rate_interval])) by (name, instance) / sum(machine_cpu_cores) by (instance) * 100
问题原因解释
machine_cpu_cores的指标结构:这个指标默认是每个CPU核心对应一条时间序列,带有cpu标签(比如cpu="0"、cpu="1")。直接用sum(machine_cpu_cores)会因为标签不匹配,无法和左边带有name标签的容器指标进行除法运算。- 标签对齐:PromQL要求运算两边的时间序列标签集能对齐,通过
without(cpu)聚合掉machine_cpu_cores的cpu标签,得到单台机器的总核心数;多实例场景下则用by(instance)保留实例标签,确保和容器指标的instance标签匹配。 - 百分比转换:最后乘以100,将使用率转换为0-100%的范围,符合你的展示需求。
额外注意事项
- 如果是Kubernetes环境,可能没有
machine_cpu_cores,可以替换为节点可分配CPU核心数指标kube_node_status_allocatable_cpu_cores,查询调整为:sum(rate(container_cpu_usage_seconds_total{name=~".+"}[$__rate_interval])) by (name, node) / sum(kube_node_status_allocatable_cpu_cores) by (node) * 100 - 确保你的监控采集器(比如Node Exporter)已经正确采集了机器核心数相关指标。
内容的提问来源于stack exchange,提问作者David Glass
相关产品推荐
相关产品推荐

