使用Prometheus监控容器CPU使用率时PromQL组合查询无输出问题求助
问题原因
这是PromQL二元运算的标签匹配规则导致的:
- 你直接对
container_cpu_usage_seconds_total做sum()聚合时,默认会丢弃该指标的所有原始标签,聚合结果是一个无任何标签的单值瞬时向量 - 另一个指标
container_spec_cpu_quota的返回结果自带namespace、container、pod、instance等多个原始标签 - PromQL对两个瞬时向量做算术运算时,默认只会将左右两边标签集完全一致的时间序列配对计算,匹配不到的序列会直接被丢弃,所以最终返回空结果,不会触发语法错误
解决方案
提供两种常用的修复方式:
方式1:保留匹配标签(推荐)
在sum聚合时通过by子句保留两边共有的匹配标签,就能正常完成配对:
(sum by (namespace, container) (rate(container_cpu_usage_seconds_total{namespace="nginx-enabled", container="nginx"}[30s])) * 100000) / container_spec_cpu_quota{namespace="nginx-enabled", container="nginx"}
该方式的优势是后续如果要批量统计多个容器的CPU使用率,只需要修改标签过滤条件即可,不需要调整查询结构。
方式2:转为标量运算
如果你确定container_spec_cpu_quota的查询结果永远只有一个返回值,可以用scalar()函数将其转为标量,运算时不需要做标签匹配:
(sum(rate(container_cpu_usage_seconds_total{namespace="nginx-enabled", container="nginx"}[30s])) * 100000) / scalar(container_spec_cpu_quota{namespace="nginx-enabled", container="nginx"})
内容的提问来源于stack exchange,提问作者Prashant Pathak
相关产品推荐
相关产品推荐

