在云原生微服务架构中,容器具备生命周期短暂、动态伸缩频繁的特性。基于 Prometheus 与 Google cAdvisor(Container Advisor)构建容器级监控体系,是及时发现资源瓶颈、CPU 限流与服务异常退出的核心屏障。
本文不仅系统梳理 cAdvisor 容器监控指标的核心 PromQL 告警规则,还结合生产环境微服务常见依赖,补充 PgBouncer 连接池、Sidekiq 异步队列以及 Consul 集群的工业级告警规则清单与语法校验最佳实践。
一、告警规则速查与核心指标矩阵
在 Prometheus 中,容器基础资源指标由 cAdvisor 负责采集暴露。下表汇总了最关键的告警指标与判定逻辑:
| 告警场景 | 告警名称 | 核心 PromQL 表达式 | 严重级别 | 处置建议 |
|---|---|---|---|---|
| 容器异常退出 | ContainerKilled |
time() - container_last_seen > 60 |
Warning | 检查是否触发 OOMKilled 或主进程崩溃 |
| CPU 高负载 | ContainerCpuUsage |
sum(rate(container_cpu_usage_seconds_total[3m])) BY (instance, name) * 100 > 80 |
Warning | 考虑横向扩容或调整 CPU Limit |
| 内存高负载 | ContainerMemoryUsage |
(container_memory_usage_bytes / container_spec_memory_limit_bytes) * 100 > 80 |
Warning | 警惕 OOM 风险,排查内存泄漏 |
| CPU 周期限流 | ContainerHighThrottleRate |
rate(container_cpu_cfs_throttled_seconds_total[3m]) > 1 |
Warning | 容器频繁被 CFS 限流,需调大 CPU Quota |
| 磁盘 Inode 耗尽 | ContainerVolumeUsage |
(1 - (container_fs_inodes_free / container_fs_inodes_total)) * 100 > 80 |
Warning | 清理容器内小文件或调整存储配额 |
| 连接池耗尽 | PgbouncerMaxConnections |
rate(pgbouncer_errors_count{...}[1m]) > 0 |
Critical | 连接池打满,需增加连接数或排查慢查询 |
| 异步队列延迟 | SidekiqQueueLatency |
max(sidekiq_queue_latency) > 120 |
Critical | 队列堆积严重,需增加 Worker 消费进程 |
二、cAdvisor 容器核心资源告警规则
在 Prometheus 的 rules/ 目录下创建 docker_containers.yml 文件:
groups:
- name: docker_containers_alert_rules
rules:
# 1. 容器异常消失 / 被杀
- alert: ContainerKilled
expr: time() - container_last_seen > 60
for: 5m
labels:
severity: warning
annotations:
summary: "容器异常退出告警 (实例: {{ $labels.instance }})"
description: "容器 {{ $labels.name }} 已超过 60 秒未上报指标,可能已异常崩溃或被宿主机 OOM-Killer 终止。"
# 2. 容器 CPU 使用率超标 (> 80%)
- alert: ContainerCpuUsage
expr: (sum(rate(container_cpu_usage_seconds_total[3m])) BY (instance, name) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "容器 CPU 使用率过高 (容器: {{ $labels.name }})"
description: "容器 {{ $labels.name }} 在近 3 分钟内平均 CPU 使用率持续高于 80% (当前值: {{ $value | printf \"%.2f\" }}%)。"
# 3. 容器内存使用率超标 (> 80%)
- alert: ContainerMemoryUsage
expr: (sum(container_memory_usage_bytes) BY (instance, name) / sum(container_spec_memory_limit_bytes) BY (instance, name) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "容器内存使用率过高 (容器: {{ $labels.name }})"
description: "容器 {{ $labels.name }} 内存占用已超过规格限额的 80% (当前值: {{ $value | printf \"%.2f\" }}%),存在被 OOM 强杀风险。"
# 4. 容器磁盘 Inode 使用率 (> 80%)
- alert: ContainerVolumeUsage
expr: (1 - (sum(container_fs_inodes_free) BY (instance) / sum(container_fs_inodes_total) BY (instance)) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "容器存储 Inode 即将耗尽 (实例: {{ $labels.instance }})"
description: "容器文件系统 Inode 占用率已超 80%,大量小文件可能导致无法创建新文件。"
# 5. 容器当前 IO 并发过高
- alert: ContainerVolumeIoUsage
expr: (sum(container_fs_io_current) BY (instance, name) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "容器磁盘 IO 负载异常 (容器: {{ $labels.name }})"
description: "容器当前磁盘 IO 排队读写处于高负荷状态。"
# 6. 容器 CPU 触发 CFS 调度限流 (Throttle)
- alert: ContainerHighThrottleRate
expr: rate(container_cpu_cfs_throttled_seconds_total[3m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "容器发生严重 CPU CFS 限流 (容器: {{ $labels.name }})"
description: "容器虽未跑满总核数,但在单周期内被 Linux 内核限制调度,可能导致请求处理延迟陡增。"
[!TIP] 深入理解
ContainerHighThrottleRate: 在 Kubernetes 或 Docker 中设置--cpus或resources.limits.cpu时,内核通过 CFS(Completely Fair Scheduler)按周期(默认 100ms)配额控制。如果容器瞬间突发算力需求,即使整体 CPU 利用率仅 50%,也会触发 CFS 限流,导致服务 P99 响应延迟飙升。因此监控container_cpu_cfs_throttled_seconds_total比单纯看 CPU 使用率更具前瞻性!
三、PgBouncer 数据库连接池告警规则
在高并发 PostgreSQL 生产架构中,PgBouncer 是防数据库连接打满的守护神:
groups:
- name: pgbouncer_alert_rules
rules:
# 活跃连接数偏高
- alert: PgbouncerActiveConnections
expr: pgbouncer_pools_server_active_connections > 200
for: 5m
labels:
severity: warning
annotations:
summary: "PgBouncer 活跃连接数过高 (实例: {{ $labels.instance }})"
description: "PgBouncer 到数据库后端的活跃连接池数持续超过 200。"
# 异常报错频发
- alert: PgbouncerErrors
expr: increase(pgbouncer_errors_count{errmsg!="server conn crashed?"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "PgBouncer 出现大量异常错误日志"
description: "近 5 分钟内 PgBouncer 记录了超过 10 次连接报错,请排查后端服务状态。"
# 客户端连接数达到最大上限 (高危)
- alert: PgbouncerMaxConnections
expr: rate(pgbouncer_errors_count{errmsg="no more connections allowed (max_client_conn)"}[1m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "PgBouncer 客户端连接池已彻底打满!"
description: "达到 max_client_conn 上限,新应用请求已被拒绝接入,请立即扩容或排查连接泄漏!"
四、Sidekiq 异步任务队列告警规则
对于采用 Sidekiq / Celery 等异步后台处理机制的架构,队列深度与消费延迟是直接影响业务体验的核心指标:
groups:
- name: sidekiq_alert_rules
rules:
# 任务队列堆积过深
- alert: SidekiqQueueSize
expr: sidekiq_queue_size > 100
for: 5m
labels:
severity: warning
annotations:
summary: "Sidekiq 异步队列堆积严重 (队列: {{ $labels.name }})"
description: "队列 {{ $labels.name }} 积压任务数已超过 100,消费处理滞后。"
# 任务调度延迟过高 (> 120s)
- alert: SidekiqSchedulingLatencyTooHigh
expr: max(sidekiq_queue_latency) > 120
for: 2m
labels:
severity: critical
annotations:
summary: "Sidekiq 调度延迟超过 2 分钟!"
description: "任务入队后等待超过 120 秒仍未被 Worker 领取执行,用户端业务可能出现明显迟滞。"
五、Consul 服务注册与集群治理告警规则
在服务发现与注册中心场景下,Consul 节点的健康度与 Raft 仲裁法定人数决定了整体服务的生死:
groups:
- name: consul_alert_rules
rules:
# 服务健康检查未通过
- alert: ConsulServiceHealthcheckFailed
expr: consul_catalog_service_node_healthy == 0
for: 3m
labels:
severity: critical
annotations:
summary: "Consul 注册服务健康检查失败 (服务: {{ $labels.service_name }})"
description: "服务 {{ $labels.service_name }} 的节点已无法通过健康探测检查,流量将被剔除。"
# Raft 仲裁节点数不足
- alert: ConsulMissingMasterNode
expr: consul_raft_peers < 3
for: 2m
labels:
severity: critical
annotations:
summary: "Consul 集群 Raft 法定仲裁节点缺失!"
description: "当前集群健康的 Raft Peer 数量少于 3 个,集群即将失去 Quorum 仲裁决策能力!"
# Consul Agent 探针不可用
- alert: ConsulAgentUnhealthy
expr: consul_health_node_status{status="critical"} == 1
for: 2m
labels:
severity: critical
annotations:
summary: "Consul Agent 节点离线崩溃"
description: "节点 {{ $labels.node }} 的 Consul Agent 处于 Critical 状态,无法协同通信。"
六、告警规则上线部署与热生效最佳实践
在修改或上线规则配置文件前,严格遵循以下三步防事故流程:
1. 语法检查(CI / 本地预检必备)
使用 Prometheus 官方工具 promtool 静态检测 YAML 语法与 PromQL 表达式合法性:
# 验证告警规则语法合规性
promtool check rules rules/docker_containers.yml
若输出 SUCCESS: ... rules found 则证明文件语法完全正确。
2. 在 prometheus.yml 中引入规则文件
rule_files:
- "rules/*.yml"
3. 平滑热重载(无需重启 Prometheus 进程)
向 Prometheus 发送 HTTP POST 请求实现零停机平滑更新:
curl -X POST http://127.0.0.1:9090/-/reload
七、总结与运维建议
- 阈值梯度设计:合理划分
warning与critical级别,仅对直接影响业务或可用性(如连接池打满、Raft 节点缺失)的规则配置电话或短信直呼; - 结合限流排查:不要忽略
container_cpu_cfs_throttled_seconds_total,它是定位容器在 K8s / Docker 下偶发性能抖动的第一指标; - 闭环告警自愈:结合 Alertmanager 的 Webhook 联动自动化运维脚本,在探测到特定的
ContainerKilled或连接堆积时自动触发 Pod 弹性伸缩或故障隔离。