2. 告警生命周期:从监控触发、告警产生、通知分发到人工/自动处置的完整闭环

告警生命周期是运维可观测性的核心执行单元。一个告警从产生到关闭,经历 触发 → 生成 → 分发 → 处置 → 关闭 五个阶段。理解每个阶段的状态转换、数据模型和决策点,是设计自愈剧本的前提。

2.1 告警生命周期五阶段模型

下表定义了每个阶段的输入、输出、核心动作及典型状态码,后续所有 Runbook 联动逻辑均基于此模型展开。

阶段 输入 核心动作 输出/状态 典型状态码
1. 监控触发 指标/日志/事件流 阈值检测、异常模式匹配 触发记录(原始事件) TRIGGERED
2. 告警产生 原始事件 + 告警规则 去重、聚合、丰富上下文 告警对象(Alert Object) FIRING / RESOLVED
3. 通知分发 告警对象 + 路由策略 分级、分渠道、分责任人 通知记录(含回执) NOTIFIED / ESCALATED
4. 处置执行 告警对象 + 剧本/工单 人工操作 / 自动化自愈 处置记录(Action Log) ACKNOWLEDGED / IN_PROGRESS
5. 关闭确认 处置结果 + 恢复信号 验证恢复、更新状态、归档 关闭记录(含根因标签) CLOSED / SUPPRESSED
关键认知: 告警生命周期不是单向流水线,而是带反馈的闭环。自愈剧本可以在阶段 4 自动执行,并将结果反馈到阶段 2 的聚合逻辑中,实现告警抑制或降噪。

2.2 生命周期状态机与转换

每个告警实例在生命周期内遵循严格的状态转换规则。下图展示了核心状态及允许的转换路径,自愈剧本必须遵守此状态机,避免状态跳跃导致数据不一致。

告警生命周期状态机 TRIGGERED FIRING NOTIFIED ACKNOWLEDGED IN_PROGRESS RESOLVED CLOSED SUPPRESSED 状态转换规则:不允许跳跃(如 TRIGGERED → CLOSED),自愈剧本必须按路径执行

2.3 各阶段关键数据模型

告警生命周期每个阶段都会产生结构化数据,这些字段是 Runbook 剧本的输入变量。以下列出每个阶段必须采集的核心字段。

阶段 1:监控触发(原始事件)

{
  "source": "prometheus/node_exporter",
  "metric": "node_cpu_seconds_total",
  "labels": {"instance": "10.0.1.5:9100", "mode": "idle"},
  "value": 0.12,
  "timestamp": 1712563200,
  "raw_message": "CPU idle below 20% threshold"
}

阶段 2:告警产生(告警对象)

{
  "alert_id": "alt-20250321-001",
  "rule_name": "HighCPUUsage",
  "severity": "critical",
  "status": "FIRING",
  "starts_at": 1712563200,
  "annotations": {"summary": "CPU usage > 80% on 10.0.1.5"},
  "fingerprint": "a1b2c3d4e5"
}

阶段 3:通知分发(通知记录)

{
  "notification_id": "notif-001",
  "alert_id": "alt-20250321-001",
  "channel": "pagerduty",
  "recipient": "oncall-sre@company.com",
  "sent_at": 1712563205,
  "status": "DELIVERED",
  "acknowledge_deadline": 1712563800
}

阶段 4:处置执行(处置记录)

{
  "action_id": "act-001",
  "alert_id": "alt-20250321-001",
  "playbook": "restart_node_exporter",
  "executor": "automation_engine",
  "started_at": 1712563210,
  "completed_at": 1712563225,
  "result": "success",
  "output": "Service restarted, metrics recovered"
}

阶段 5:关闭确认(关闭记录)

{
  "close_id": "cls-001",
  "alert_id": "alt-20250321-001",
  "closed_at": 1712563230,
  "closed_by": "auto_recovery",
  "root_cause": "node_exporter_process_hang",
  "resolution": "restart",
  "downtime_seconds": 30
}

2.4 自愈剧本在各阶段的介入点

自动化自愈不是替代所有阶段,而是在特定决策点插入自动逻辑。下表列出每个阶段的自愈介入机会及典型动作。

阶段 自愈介入点 典型自愈动作 风险控制
监控触发 事件预处理管道 预聚合、降噪、抑制已知抖动 避免过度抑制导致漏报
告警产生 告警规则评估后 自动关联 CMDB 获取责任人、自动打标签 标签准确性校验
通知分发 路由决策前 根据严重级别自动升级、智能排班匹配 防止通知风暴
处置执行 剧本触发点 执行预定义 Runbook、调用 API 重启/扩容/回滚 熔断、重试、人工审批闸
关闭确认 恢复信号到达后 自动验证指标恢复、生成根因分析摘要 误恢复回滚机制
重要原则: 自愈剧本在阶段 4(处置执行)的介入最频繁,但必须设置 熔断条件(如连续失败 3 次停止自愈)和 人工审批闸(如涉及重启数据库或变更网络配置)。阶段 5 的自动关闭必须等待明确的恢复信号,不能仅依赖超时。

2.5 完整闭环示例:从触发到自愈关闭

以下是一个真实场景的闭环流程,展示各阶段数据如何串联,以及自愈剧本如何自动完成阶段 4 和阶段 5。

  1. 监控触发: Prometheus 检测到 node_cpu_seconds_total{mode="idle"} < 0.2,生成原始事件。
  2. 告警产生: Alertmanager 匹配规则 HighCPUUsage,创建告警对象,状态 FIRING,严重级别 critical。
  3. 通知分发: 路由至 PagerDuty,通知值班 SRE,同时触发自愈引擎 Webhook。
  4. 自愈处置: 自愈引擎执行 Runbook restart_node_exporter,调用 SSH 重启服务,记录处置日志。
  5. 自动关闭: 自愈引擎持续拉取指标,确认 node_cpu_idle > 0.5 持续 60 秒,自动将告警状态置为 CLOSED,并写入根因标签。
告警生命周期闭环流程 监控触发 告警产生 通知分发 自愈处置 自动关闭 自愈成功后发送抑制信号,避免重复告警 闭环关键指标 MTTA(平均确认时间)≤ 30s | MTTR(平均修复时间)≤ 60s | 自愈成功率 ≥ 95%

2.6 生命周期数据一致性保障

在分布式告警系统中,各阶段数据可能分散在不同组件(Prometheus、Alertmanager、PagerDuty、自愈引擎、CMDB)。保障数据一致性是 Runbook 联动的基础。

  • 唯一标识链: 使用 alert_id 作为贯穿五阶段的全局 ID,所有组件必须透传此 ID。
  • 时间戳对齐: 所有阶段使用 NTP 同步的 Unix 时间戳,精度到秒,用于计算 MTTA/MTTR。
  • 状态冲突处理: 当自愈引擎与监控系统状态不一致时(如自愈成功但监控仍 FIRING),以监控系统恢复信号为准,自愈引擎标记为“待验证”。
  • 审计追踪: 每个阶段的状态变更必须写入不可变审计日志,格式为 {alert_id, from_state, to_state, timestamp, actor}。
实战建议: 在自愈剧本中,每次执行动作前先查询告警当前状态,避免对已关闭或已抑制的告警执行重复操作。推荐使用乐观锁(基于 fingerprint + status 的版本号)防止并发冲突。