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 生命周期状态机与转换
每个告警实例在生命周期内遵循严格的状态转换规则。下图展示了核心状态及允许的转换路径,自愈剧本必须遵守此状态机,避免状态跳跃导致数据不一致。
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。
- 监控触发: Prometheus 检测到
node_cpu_seconds_total{mode="idle"} < 0.2,生成原始事件。 - 告警产生: Alertmanager 匹配规则
HighCPUUsage,创建告警对象,状态FIRING,严重级别critical。 - 通知分发: 路由至 PagerDuty,通知值班 SRE,同时触发自愈引擎 Webhook。
- 自愈处置: 自愈引擎执行 Runbook
restart_node_exporter,调用 SSH 重启服务,记录处置日志。 - 自动关闭: 自愈引擎持续拉取指标,确认
node_cpu_idle > 0.5持续 60 秒,自动将告警状态置为CLOSED,并写入根因标签。
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 的版本号)防止并发冲突。