Prometheus无法执行两值除法:CPU使用率查询故障排查
解决Prometheus中CPU使用率查询组合失败的问题
这个问题的核心是Prometheus的向量匹配规则在搞鬼!当你把两个向量做除法运算时,Prometheus默认要求两边的时间序列拥有完全一致的标签集才能匹配,否则就会返回空结果或者无法正常计算。
问题拆解
- 左边的
rate(windows_cpu_time_total{mode!="idle"}[5m])返回的是多标签向量:每个时间序列包含instance、job、mode这些标签(对应不同的非空闲CPU模式)。 - 右边的
windows_cs_logical_processors返回的是少标签向量:一般只有instance和job标签,对应每台机器的逻辑核心数。
因为两边的标签集不一致(左边多了mode标签),默认的精确匹配找不到对应关系,所以组合查询就失效了。
解决方案:使用向量匹配修饰符
你需要用on()指定用来匹配的共同标签,再用group_left()告诉Prometheus:左边的多个序列(每个mode对应一个)都可以匹配右边对应标签的单个核心数值。
试试这个修正后的查询:
rate(windows_cpu_time_total{mode!="idle"}[5m]) / on(instance, job) group_left() windows_cs_logical_processors
如果你的环境中job标签不是必须的(比如所有采集都用同一个job),也可以简化为:
rate(windows_cpu_time_total{mode!="idle"}[5m]) / on(instance) group_left() windows_cs_logical_processors
验证思路
- 先分别执行两个子查询,查看它们的标签结构:
- 执行
rate(windows_cpu_time_total{mode!="idle"}[5m]),确认返回的序列包含哪些标签(比如instance、job、mode)。 - 执行
windows_cs_logical_processors,确认返回的序列包含哪些标签(比如instance、job)。
- 执行
- 确保
on()里指定的是两边都有的共同标签,这样就能正确匹配每台机器的核心数到对应的CPU时间序列上。
这样修改后,查询应该就能正常计算出每个非空闲CPU模式的使用率(除以核心数后的值)了。
内容的提问来源于stack exchange,提问作者Stas BZ
相关产品推荐
相关产品推荐

