使用 Prometheus 监控容器 CPU 利用率

Monitoring Container CPU Utilization using Prometheus

在 Prometheus UI 上,当我 运行 下面的查询按预期工作时

(sum ( rate (container_cpu_usage_seconds_total{namespace="nginx-enabled", container="nginx"}[30s])) * 100000) /  110000
Output Returned: 23.34


container_spec_cpu_quota{namespace="nginx-enabled", container="nginx"}
Output Returned: 110000

但是当我尝试使用以下查询时,我没有看到任何输出,也没有与查询字符串相关的错误消息。

(sum ( rate (container_cpu_usage_seconds_total{namespace="nginx-enabled", container="nginx"}[30s])) * 100000) / (container_spec_cpu_quota{namespace="nginx-enabled", container="nginx"})

有人可以帮我解决我遗漏的问题吗,我对 Prometheus Query 非常陌生

PromQL 确实很棘手,例如,如果碰巧使用了错误的数据类型,它就会默默地失败。您 运行 遇到的问题似乎是组合查询的左侧,即 (sum(rate(container_cpu_usage_seconds_total... 部分 returns 一个标量值(因此,正好是一个值),而右侧 (container_spec_cpu_quota{...}) 是一个向量,其最新值仅显示。

我试图在 PromLens 中重新创建您的组合查询,它提供了一种调试查询的好方法。不幸的是,它没有在数据中提供 container_spec_cpu_quota,因此我将其替换为附近可用的内容 (container_spec_cpu_shares)。

现在,如果您将以下查询插入 PromLens,模拟您的查询,您将看到它也失败了(您将在单击 Explain 选项卡时看到原因):

(sum ( rate (container_cpu_usage_seconds_total[30s])) * 100000)
/
container_spec_cpu_shares

然而,当您也聚合右侧时,将其转换为标量(因为它是一个量表,一个简单的 sum 就可以做到),您会得到一个结果:

(sum ( rate (container_cpu_usage_seconds_total[30s])) * 100000)
/
sum(container_spec_cpu_shares)

处理左侧和右侧在数据类型方面不对齐的更多选项,例如使用 onignoring 关键字可通过 Vector matching 中的文档获得部分。