告警与值班响应
让 Agent 按严重级别、影响面与客户承诺(SLO)梳理告警策略,并输出可执行的值班步骤:确认、缓解、沟通、事后复盘。
SKILL 应区分「需立即唤醒」与「工单级」事件,写明告警路由、静默窗口、重复合并与依赖抑制,避免告警风暴耗尽值班注意力。
每条关键告警建议绑定 Runbook:前置检查(依赖服务、近期发布)、缓解动作(扩容、降级、切流)、回滚或开关位置,以及何时升级二线或管理层。
Agent 协助时须强调事实记录:时间线、影响范围、已尝试操作与当前状态,便于交接与事后撰写事故报告。
- 告警须可对用户或业务指标解释,禁止仅「CPU 高」而无服务与租户上下文。
- 值班手册中明确「单人决策上限」与需要拉会的触发条件。
- 与日志、追踪技能配合:Runbook 中嵌入典型查询与 dashboard 链接占位。
值班响应主路径
[ 告警触发 / 页面升级 ]
│
▼
┌─────────────┐ 认领:谁在处理、预计下次更新时间
│ 确认与分级 │──── 对照 SLO / 客户影响 / 是否在变更窗口内
└─────────────┘
│
▼
┌─────────────┐ Runbook:依赖检查、特征查询、近期发布与配置
│ 定位与缓解 │──── 缓解优先:限流、降级、扩容、回滚、开关
└─────────────┘
│
▼
┌─────────────┐ 状态广播:内部频道 + 必要时外部状态页模板
│ 沟通与升级 │──── 超阈值或权限不足:二线 / 管理层 / 厂商
└─────────────┘
│
▼
┌─────────────┐ 稳定后:解除告警、记录时间线、开事后项
│ 恢复与复盘 │──── 与指标、日志、追踪交叉验证根因假设
└─────────────┘
同一事件只保留一条「主线程」沟通:重复告警合并到该线程,避免多频道各说各话;交接时把当前假设、已做动作与下一步写进置顶或工单描述。
告警路由与降噪
路由决定「谁、在哪个渠道、以什么优先级」收到通知:按服务所有权、租户层级、环境(prod/stage)与客户合同分流;Pager 与聊天机器人应指向当前 on-call 轮值,而不是静态个人。
Prometheus 告警规则完整 YAML 示例:
# prometheus/alerts/payment-svc.yml
groups:
- name: payment-svc-slo
interval: 30s
rules:
# P1: SLO 违约 - 错误率高
- alert: PaymentHighErrorRate
expr: |
sum(rate(http_requests_total{job="payment-svc",code=~"5.."}[5m]))
/ sum(rate(http_requests_total{job="payment-svc"}[5m]))
> 0.01
for: 5m
labels:
severity: "P1"
team: "payments"
slo: "availability"
annotations:
summary: "Payment API error rate {{ $value | humanizePercentage }} exceeds SLO"
description: "Error rate has been above 1% for 5 minutes. Current: {{ $value | humanizePercentage }}"
runbook_url: "https://wiki/runbooks/payment-svc/high-error-rate"
dashboard_url: "https://grafana/d/payment-golden-signals"
# P2: 延迟告警
- alert: PaymentHighLatency
expr: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{job="payment-svc"}[5m]))
by (le)
) > 0.5
for: 10m
labels:
severity: "P2"
team: "payments"
annotations:
summary: "Payment p99 latency {{ $value | humanizeDuration }} exceeds 500ms"
runbook_url: "https://wiki/runbooks/payment-svc/high-latency"
# 基础设施告警(磁盘)
- alert: DiskSpaceLow
expr: |
(node_filesystem_free_bytes{mountpoint="/"}
/ node_filesystem_size_bytes{mountpoint="/"}) < 0.15
for: 5m
labels:
severity: "P2"
team: "infra"
annotations:
summary: "Disk space below 15% on {{ $labels.instance }}"
Alertmanager 分级路由与降噪配置:
# alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'team'] # 按团队分组,相同告警合并
group_wait: 30s # 等待 30s 以聚合同组告警
group_interval: 5m # 同组告警每 5min 发送一次
repeat_interval: 4h # 持续告警每 4h 重复通知
receiver: 'default-webhook'
routes:
# P0/P1 → PagerDuty 立即唤醒
- match_re:
severity: "P0|P1"
receiver: 'pagerduty-critical'
group_wait: 10s
repeat_interval: 30m # P0 每 30min 提醒一次
# 支付团队 → 支付 slack 频道
- match:
team: payments
receiver: 'slack-payments'
continue: true # 同时继续匹配其他路由
# 基础设施 → infra 团队
- match:
team: infra
receiver: 'slack-infra'
# 抑制规则(降噪:上游故障时抑制下游告警)
inhibit_rules:
- source_match:
severity: P0
team: infra
target_match:
team: payments # 基础设施 P0 时,抑制支付团队的告警
equal: ['env', 'region']
receivers:
- name: 'pagerduty-critical'
pagerduty_configs:
- routing_key: '${PAGERDUTY_INTEGRATION_KEY}'
description: '{{ .GroupLabels.alertname }}: {{ .CommonAnnotations.summary }}'
severity: '{{ if eq .CommonLabels.severity "P0" }}critical{{ else }}error{{ end }}'
- name: 'slack-payments'
slack_configs:
- api_url: '${SLACK_WEBHOOK_URL}'
channel: '#oncall-payments'
title: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.summary }}\n{{ .Annotations.runbook_url }}{{ end }}'
- 静默与维护:计划内变更用带起止时间与原因的静默窗口;禁止「永久静默」无工单跟踪。
- 升级阶梯:未认领 N 分钟、严重级别上调、或客户渠道已报障时,自动升到二线或电话。
SLO 与燃尽率
面向用户的 SLO(可用性、延迟、错误率)应驱动告警:不仅看瞬时阈值,还要看错误预算燃尽率——在短窗口内消耗预算过快,意味着若在长窗口末仍如此,将违约。
- 常见做法:多窗口(如 1h + 6h)燃尽率告警,兼顾突发与持续劣化;页面级告警写明对应 SLO 名称与剩余预算比例。
- Agent 写 SKILL 时要求标注:该告警对应的 SLI、SLO 目标、以及「触发时建议先看哪张图 / 哪条查询」。
- 非 SLO 类基础设施告警(磁盘、证书)仍须绑定业务上下文或服务树节点,便于路由到正确团队。
On-call 升级策略配置示例(PagerDuty / OpsGenie 等价配置):
# PagerDuty 升级策略(等价的 OpsGenie escalation policy)
# 配置思路:YAML 描述,实际在 PagerDuty UI 或 Terraform 中配置
escalation_policy:
name: "Payment Service On-call"
num_loops: 2 # 未认领时循环 2 次后升级管理层
rules:
# Level 1: 第一响应人(立即通知)
- escalation_delay_in_minutes: 0
targets:
- type: schedule
id: "payment-oncall-schedule" # 当前值班工程师
# Level 2: 未在 15min 内认领 → 升级到 L2 专家
- escalation_delay_in_minutes: 15
targets:
- type: user
id: "payment-tech-lead"
- type: schedule
id: "payment-backup-schedule"
# Level 3: 30min 后仍未解决 → 通知管理层
- escalation_delay_in_minutes: 30
targets:
- type: user
id: "engineering-manager"
# Alertmanager 对应配置(通过 repeat_interval 实现升级效果)
# 配合 PagerDuty 的 escalation_policy 使用
告警详情页(Alert page)
监控或事件系统中的告警详情页是 on-call 的第一块屏幕:应在同一视图内聚合判断所需信息,减少在多个标签间跳转。
- 标题与摘要:一句话说明「什么坏了、相对什么基线」;附告警规则名、标签(env、region、tenant)。
- 关联面板:对应 SLO/SLI 趋势、相关 dashboard、近 24h 部署与配置变更时间线、相似历史事件链接。
- Runbook 入口:内联或一键打开当前告警类型的操作步骤;预留「一键复制值班摘要」给聊天与工单。
Runbook 与升级
每条关键告警绑定 Runbook:前置检查(依赖服务、近期发布)、缓解动作(扩容、降级、切流)、回滚或开关位置,以及何时升级二线或管理层。
- 明确「单人可执行」与「必须拉人」的边界;升级条件写清(如:影响付费租户、数据面写入失败持续 > 5 分钟)。
- 事实记录:时间线、影响范围、已尝试操作与当前状态,便于交接与事后报告。
值班摘要一句生成
用于频道置顶、工单标题或状态页草稿:填写下方字段后生成一条可读的中文摘要,便于快速同步现状。
格式:[级别] 服务:现象;当前动作(若有影响面则追加一句)。
---
name: alerting-oncall
description: 告警分级与值班 Runbook 模板
model: claude-sonnet-4-5
---
# 告警规则要求
alert_rule_requirements:
- 每条告警必须包含 runbook_url
- severity 标签:P0/P1(唤醒)| P2/P3(工单级)
- 配置 for 持续时间(避免瞬时抖动)
- 告警文案说明:什么坏了 + 相对什么基线
# 告警分级标准
severity_definition:
P0: 核心服务全量不可用,立即唤醒,≤15min 响应
P1: 核心路径严重降级,≤1h 响应,PagerDuty
P2: 非核心或有变通,Slack 通知,工作日处理
P3: 体验下降,工单记录,下次迭代处理
# 降噪策略
noise_reduction:
- group_by: [alertname, team](相同组合合并)
- inhibit_rules: 上游 P0 时抑制下游告警
- maintenance_silences: 需绑定工单,禁止永久静默
# 步骤
response_steps:
1. 判定严重级别与是否违反 SLO / 燃尽率
2. 认领告警,更新状态(谁在处理,下次更新时间)
3. 执行 Runbook:检查发布与依赖
4. 记录时间线并决定升级路径
5. 恢复后:解除告警,开复盘工单