Prometheus查询容器CPU使用率无结果问题排查求助
一、代码层面的核心问题
CPU配额计算逻辑完全错误
你代码里的分母sum(container_spec_cpu_quota{{{constraint}}}/({duration}*1000)) by (container, pod)完全不符合Kubernetes CPU配额的计算规则。Kubernetes中,容器CPU配额的正确核数计算是container_spec_cpu_quota / container_spec_cpu_period——container_spec_cpu_quota是微秒数,container_spec_cpu_period默认是100000微秒(100ms),两者相除才是该容器能使用的CPU核数上限。你用duration*1000作为除数,会导致分母被放大N倍,最终计算出的使用率趋近于0,这是导致绝大多数Pod显示0使用率的主要原因。irate时间窗口与查询参数不匹配
你用压测的duration作为irate的时间窗口,同时设置query_range的step为1秒:
- 如果
duration远大于Prometheus的采集间隔(比如默认15秒),irate会取窗口内最后两个样本计算速率,但若查询时间范围包含压测结束后的时间段,窗口内的CPU使用率可能已经没有变化,返回0。 - irate要求窗口内至少有2个样本才能计算有效速率,若
duration小于采集间隔,窗口内只有1个样本,直接返回0。
- 时间边界与等待时间不足
你设置endtime = starttime + duration,但Prometheus采集样本需要时间,仅sleep(1)可能导致压测结束后的最后几个样本还未写入存储,查询时边界处的窗口没有足够样本,irate返回0。
二、Prometheus配置/指标层面的可能问题
采集间隔与irate窗口不匹配
若Prometheus采集container_cpu_usage_seconds_total的间隔是15秒,而你设置的irate窗口小于30秒(2倍采集间隔),会出现窗口内样本不足的情况,无法计算有效速率,返回0。指标缺失
部分Pod可能未配置CPU配额,导致container_spec_cpu_quota指标不存在,此时sum后该Pod的分母为空,计算结果为NaN,但你说显示0,所以这个可能性较低,但仍需验证。
具体修复步骤
- 修正CPU配额计算逻辑
替换错误的PromQL,使用正确的CPU配额计算方式:
sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[30s])) by (container, pod) / sum(container_spec_cpu_quota{{{constraint}}}/container_spec_cpu_period{{{constraint}}}) by (container, pod) * 100
若部分Pod未配置CPU配额,可降级使用CPU请求值作为分母:
sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[30s])) by (container, pod) / ( sum(container_spec_cpu_quota{{{constraint}}}/container_spec_cpu_period{{{constraint}}}) by (container, pod) or on(container,pod) group_left sum(kube_pod_container_resource_requests_cpu_cores{{{constraint}}}) by (container,pod) ) * 100
- 调整irate窗口与查询参数
- irate窗口固定设为2倍Prometheus采集间隔(比如默认15秒采集间隔,窗口设30秒),不要用压测时长作为窗口,保证窗口内至少有2个样本。
query_range的step设置为与采集间隔一致(比如15秒),减少无效计算。- 查询时间范围调整为
starttime - 30s到endtime + 30s,覆盖压测前后的样本,避免边界问题。
增加等待时间
将sleep(1)改为sleep(5)或更长,给Prometheus足够时间完成压测后的样本写入。验证指标存在性
在Prometheus UI中单独查询container_cpu_usage_seconds_total{{namespace="你的命名空间"}}和container_spec_cpu_quota{{namespace="你的命名空间"}},确认所有目标Pod都有对应样本。
总结
核心问题是代码中CPU配额的计算逻辑错误,导致使用率被错误计算为0;其次是irate窗口设置不合理引发的样本不足问题。先修正PromQL的分母计算,再调整查询参数,基本就能解决问题。
内容的提问来源于stack exchange,提问作者MissSirius

