首页 > 解决方案 > 使用 Prometheus 监控容器 CPU 利用率

问题描述

在 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 非常陌生

标签: prometheusmonitoring

解决方案


PromQL 确实很棘手,例如,如果碰巧使用了错误的数据类型,它就会默默地失败。您遇到的问题似乎是组合查询的左侧,即该 (sum(rate(container_cpu_usage_seconds_total...部分返回一个标量值(因此,恰好是一个值),而右侧(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)

处理左侧和右侧在数据类型方面未对齐的更多选项,例如使用onorignoring关键字,可通过矢量匹配部分中的文档获得。


推荐阅读