Docker容器监控告警怎么配置才生效?

Tr° 晶晶 阅读 14

我用 Prometheus + cAdvisor 监控 Docker 容器,但设置的告警规则一直不触发,明明内存使用都超了。

我试过在 alert.rules 里加了这条规则:

groups:
- name: docker-alerts
  rules:
  - alert: HighContainerMemoryUsage
    expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.8
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "High memory usage on {{ $labels.instance }}"

但 Prometheus 的 Alerts 页面显示“pending”,就是不变成 firing。cAdvisor 数据是有的,container_memory_usage_bytes 指标也能查到。是不是表达式写错了?还是单位没对上?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
设计师春萍
这个问题我踩过坑,八成是除数有问题。

你的容器大概率没设置内存 limit,导致 container_spec_memory_limit_bytes 返回 0,除法结果变成 Inf 或 NaN,Prometheus 直接忽略这条记录,所以一直 pending。

代码放这了,加上过滤条件就行:

groups:
- name: docker-alerts
rules:
- alert: HighContainerMemoryUsage
expr: |
(container_memory_usage_bytes / container_spec_memory_limit_bytes) > 0.8
and container_spec_memory_limit_bytes > 0
for: 1m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.name }}"


核心就是加那个 and container_spec_memory_limit_bytes > 0,把没设 limit 的容器过滤掉。

如果你想监控所有容器,不管有没有设 limit,可以用机器总内存做基准:

expr: |
(container_memory_usage_bytes / on(instance) machine_memory_bytes) > 0.8


改完记得重启 Prometheus 或者热加载一下配置:

curl -X POST http://localhost:9090/-/reload


还有个事,container_memory_usage_bytes 包含了 cache,如果你只想看实际使用内存,用 container_memory_working_set_bytes 更准。
点赞
2026-03-01 08:05