为何PromQL的rate()函数仅返回单个值?
Pod CPU使用率计算中
rate()仅返回单个值的问题及解决 问题描述
我尝试使用rate()函数计算Pod的CPU使用率最小值、最大值和平均值,但rate()仅返回单个值。
获取原始指标数据
执行以下命令获取container_cpu_usage_seconds_total指标的CPU使用秒数时间序列:
curl -s -G "http://master-1.ocp9.pd.f5net.com:30355/api/v1/query" --data-urlencode "query=container_cpu_usage_seconds_total{namespace='arka-ingress', pod='f5ingress-f5ingress-55ff78b955-bjhbc', container=''}[12h:1h]" | jq
返回的时间序列数据包含多个时间点的数值:
"values": [ [1685746800, "233.925484799"], [1685750400, "245.503601613"], [1685754000, "257.245759184"], [1685757600, "268.81255512"], [1685761200, "280.711385953"], [1685764800, "292.226109825"], [1685768400, "304.090964418"], [1685772000, "315.670226267"], [1685775600, "327.400741452"], [1685779200, "339.122179483"], [1685782800, "350.865870242"] ]
异常的rate()查询结果
使用rate()查询时,预期返回一系列变化率,但仅得到单个值:
curl -s -G "http://master-1.ocp9.pd.f5net.com:30355/api/v1/query" --data-urlencode "query=rate(container_cpu_usage_seconds_total{namespace='arka-ingress', pod='f5ingress-f5ingress-55ff78b955-bjhbc', container=''}[12h:1h])" | jq
返回结果:
"value": [1685786028.71, "0.003085077907426099"]
原因分析
问题核心在于Prometheus的查询接口特性与rate()的工作逻辑:
- 你使用的是
/api/v1/query即时查询接口,它仅返回查询执行时刻的单一计算结果。rate()在这里会用指定的[12h:1h]大时间窗口内的所有数据,计算出一个整体平均速率,而非时间序列。 [12h:1h]的超大窗口会完全平滑掉短期CPU波动,最终只能得到12小时内的平均CPU使用率,因此仅返回单个值。
解决方法
要获取时间序列形式的CPU使用率变化率,需使用/api/v1/query_range范围查询接口,并配置合理参数:
- 选用较小的
rate()计算窗口(比如[5m]),确保能捕捉到短期CPU波动 - 指定查询的时间范围(
start和end参数) - 设置合适的步长(
step参数),控制返回数据点的密度
你已经找到正确的查询方式:
curl -s -G "http://master-1.ocp9.pd.f5net.com:30355/api/v1/query_range" --data-urlencode "query=rate(container_cpu_usage_seconds_total{namespace='arka-ingress', pod='f5ingress-f5ingress-55ff78b955-bjhbc', container=''}[5m]) * 1000" --data-urlencode "start=1685811600" --data-urlencode "end=1685811660" --data-urlencode "step=15s" | jq
该查询会在1685811600到1685811660的时间范围内,每15秒计算一次过去5分钟的CPU使用率(乘以1000是转换为mCPU单位),返回一系列时间点的数值,后续即可基于这些数据计算最小值、最大值和平均值。
内容的提问来源于stack exchange,提问作者mberge
相关产品推荐
相关产品推荐

