容器健康检查需通过cadvisor暴露为prometheus指标container_health_status,再配置for: 2m的告警规则及alertmanager分级路由实现可观测告警闭环。
容器健康检查本身不产生告警,必须与 prometheus + alertmanager 这类监控系统联动,才能把“unhealthy”状态转化为可通知、可追踪的告警事件。关键在于把健康检查结果变成可观测指标,并纳入规则评估闭环。
让健康状态变成 Prometheus 可采集的指标
Docker 原生的 HEALTHCHECK 指令只影响容器状态(healthy/unhealthy),但不会对外暴露数值型指标。要接入监控体系,需借助中间组件将状态“翻译”成时间序列数据:
-
cAdvisor 自动暴露健康状态指标:新版 cAdvisor(v0.49+)已原生支持采集容器健康检查结果,生成如
container_health_status{container="web", health="unhealthy"}这类指标,默认值为 0(unhealthy)或 1(healthy) -
验证方式:访问
http://localhost:8080/metrics,搜索container_health_status,确认有输出且数值随容器健康状态变化 -
注意前提:Docker 守护进程需启用健康检查(即容器启动时带
healthcheck配置),cAdvisor 才能读取到该字段;否则该指标为空
在 Prometheus 中定义健康异常告警规则
有了指标,就能用 PromQL 编写精准判断逻辑。健康类告警强调“持续性失败”,避免瞬时抖动误报:
- 基础告警规则示例(alerts.yml):
groups:
- name: docker-health-alerts
rules:
- alert: ContainerUnhealthy
expr: container_health_status == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Container {{ $labels.container }} is unhealthy"
description: "Health check failed for {{ $labels.container }} on {{ $labels.instance }}"-
说明:
for: 2m表示连续 2 分钟状态为 0 才触发,匹配 Docker 默认重试机制(如retries: 3+interval: 30s≈ 90 秒内失败即标记 unhealthy) -
进阶建议:可叠加容器重启次数(
container_restarts_total)或应用端口连通性(通过 Blackbox Exporter 主动探测)做复合判断,降低漏报率
通过 Alertmanager 实现分级响应
告警发出后,Alertmanager 负责决定“谁在什么时间收到什么内容”。健康类告警通常需要快速响应,配置应侧重时效性和明确性:
- 路由策略示例(alertmanager.yml):
route:
group_by: ['alertname', 'container']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'pager-duty-critical'
routes:
- match:
severity: critical
receiver: 'slack-urgent'
continue: false
- match:
severity: warning
receiver: 'email-daily'-
实用技巧:
- 对
ContainerUnhealthy告警单独设置receiver: 'slack-urgent',并启用 Slack @channel 或 @here 提醒值班人员 - 添加
inhibit_rules抑制重复告警:例如当某台宿主机整体宕机(InstanceDown)时,自动抑制其上所有容器的健康告警,避免信息过载
- 对
可视化与根因辅助定位
Grafana 不仅展示图表,还能帮助快速确认问题上下文:
- 在仪表盘中添加「容器健康状态」面板,用状态灯(green/red)直观呈现所有容器当前 health 值
- 关联显示同一容器的 CPU 使用率、内存 RSS、网络错误包数等指标,便于判断 unhealthy 是因资源耗尽、进程僵死,还是健康接口本身返回异常
- 点击告警卡片可直接跳转到对应容器的详细看板页,缩短排查路径











