名称: 事件响应运行手册模板 描述: 创建结构化的事件响应运行手册,包括逐步程序、升级路径和恢复动作。用于构建运行手册、响应事件或建立事件响应程序。 版本: 1.0 模型: sonnet 调用方式: 两者 用户可调用: 是 工具: [读取, 写入, Bash] 最佳实践:
- 事件发生后更新运行手册
- 定期测试运行手册
- 包括回滚步骤
- 记录假设 错误处理: 优雅 流式处理: 支持 已验证: 假 最后验证时间: 2026-02-19T05:29:09.098Z
模式: 认知/提示驱动 — 无独立实用脚本;通过代理上下文使用。
事件运行书模板
生产就绪的事件响应运行书模板,涵盖检测、分类、缓解、解决和通信。
何时使用此技能
- 创建事件响应程序
- 构建服务特定运行书
- 建立升级路径
- 记录恢复程序
- 响应活跃事件
- 培训值班工程师
核心概念
1. 事件严重级别
| 严重级别 | 影响 | 响应时间 | 示例 |
|---|---|---|---|
| SEV1 | 完全中断,数据丢失 | 15分钟 | 生产下线 |
| SEV2 | 重大退化 | 30分钟 | 关键功能损坏 |
| SEV3 | 轻微影响 | 2小时 | 非关键错误 |
| SEV4 | 最小影响 | 下一个工作日 | 外观问题 |
2. 运行书结构
1. 概述与影响
2. 检测与警报
3. 初始分类
4. 缓解步骤
5. 根本原因调查
6. 解决程序
7. 验证与回滚
8. 通信模板
9. 升级矩阵
运行书模板
模板1:服务中断运行书
# [服务名称] 中断运行书
## 概述
**服务**: 支付处理服务
**所有者**: 平台团队
**Slack**: #payments-incidents
**PagerDuty**: payments-oncall
## 影响评估
- [ ] 哪些客户受影响?
- [ ] 多少比例流量受影响?
- [ ] 是否有财务影响?
- [ ] 爆炸半径是什么?
## 检测
### 警报
- `payment_error_rate > 5%` (PagerDuty)
- `payment_latency_p99 > 2s` (Slack)
- `payment_success_rate < 95%` (PagerDuty)
### 仪表板
- [支付服务仪表板](https://grafana/d/payments)
- [错误追踪](https://sentry.io/payments)
- [依赖状态](https://status.stripe.com)
## 初始分类(前5分钟)
### 1. 评估范围
```bash
# 检查服务健康
kubectl get pods -n payments -l app=payment-service
# 检查最近部署
kubectl rollout history deployment/payment-service -n payments
# 检查错误率
curl -s "http://prometheus:9090/api/v1/query?query=sum(rate(http_requests_total{status=~'5..'}[5m]))"
```
2. 快速健康检查
- [ ] 能访问服务吗?
curl -I https://api.company.com/payments/health - [ ] 数据库连接性?检查连接池指标
- [ ] 外部依赖?检查Stripe、银行API状态
- [ ] 最近更改?检查部署历史
3. 初始分类
| 症状 | 可能原因 | 转到部分 |
|---|---|---|
| 所有请求失败 | 服务下线 | 部分4.1 |
| 高延迟 | 数据库/依赖 | 部分4.2 |
| 部分失败 | 代码错误 | 部分4.3 |
| 错误飙升 | 流量激增 | 部分4.4 |
缓解程序
4.1 服务完全下线
# 步骤1:检查容器状态
kubectl get pods -n payments
# 步骤2:如果容器崩溃循环,检查日志
kubectl logs -n payments -l app=payment-service --tail=100
# 步骤3:检查最近部署
kubectl rollout history deployment/payment-service -n payments
# 步骤4:回滚如果最近部署可疑
kubectl rollout undo deployment/payment-service -n payments
# 步骤5:如果资源受限,扩展
kubectl scale deployment/payment-service -n payments --replicas=10
# 步骤6:验证恢复
kubectl rollout status deployment/payment-service -n payments
4.2 高延迟
# 步骤1:检查数据库连接
kubectl exec -n payments deploy/payment-service -- \
curl localhost:8080/metrics | grep db_pool
# 步骤2:检查慢查询(如果数据库问题)
psql -h $DB_HOST -U $DB_USER -c "
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '5 seconds'
ORDER BY duration DESC;"
# 步骤3:如果需要,终止长时间运行查询
psql -h $DB_HOST -U $DB_USER -c "SELECT pg_terminate_backend(pid);"
# 步骤4:检查外部依赖延迟
curl -w "@curl-format.txt" -o /dev/null -s https://api.stripe.com/v1/health
# 步骤5:如果依赖慢,启用断路器
kubectl set env deployment/payment-service \
STRIPE_CIRCUIT_BREAKER_ENABLED=true -n payments
4.3 部分失败(特定错误)
# 步骤1:识别错误模式
kubectl logs -n payments -l app=payment-service --tail=500 | \
grep -i error | sort | uniq -c | sort -rn | head -20
# 步骤2:检查错误追踪
# 转到Sentry:https://sentry.io/payments
# 步骤3:如果特定端点,启用功能标志禁用
curl -X POST https://api.company.com/internal/feature-flags \
-d '{"flag": "DISABLE_PROBLEMATIC_FEATURE", "enabled": true}'
# 步骤4:如果数据问题,检查最近数据更改
psql -h $DB_HOST -c "
SELECT * FROM audit_log
WHERE table_name = 'payment_methods'
AND created_at > now() - interval '1 hour';"
4.4 流量激增
# 步骤1:检查当前请求率
kubectl top pods -n payments
# 步骤2:水平扩展
kubectl scale deployment/payment-service -n payments --replicas=20
# 步骤3:启用速率限制
kubectl set env deployment/payment-service \
RATE_LIMIT_ENABLED=true \
RATE_LIMIT_RPS=1000 -n payments
# 步骤4:如果是攻击,阻止可疑IP
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: block-suspicious
namespace: payments
spec:
podSelector:
matchLabels:
app: payment-service
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 192.168.1.0/24 # 可疑范围
EOF
验证步骤
# 验证服务健康
curl -s https://api.company.com/payments/health | jq
# 验证错误率恢复正常
curl -s "http://prometheus:9090/api/v1/query?query=sum(rate(http_requests_total{status=~'5..'}[5m]))" | jq '.data.result[0].value[1]'
# 验证延迟可接受
curl -s "http://prometheus:9090/api/v1/query?query=histogram_quantile(0.99,sum(rate(http_request_duration_seconds_bucket[5m]))by(le))" | jq
# 烟雾测试关键流程
./scripts/smoke-test-payments.sh
回滚程序
# 回滚Kubernetes部署
kubectl rollout undo deployment/payment-service -n payments
# 回滚数据库迁移(如果适用)
./scripts/db-rollback.sh $MIGRATION_VERSION
# 回滚功能标志
curl -X POST https://api.company.com/internal/feature-flags \
-d '{"flag": "NEW_PAYMENT_FLOW", "enabled": false}'
升级矩阵
| 条件 | 升级到 | 联系人 |
|---|---|---|
| > 15分钟未解决 SEV1 | 工程经理 | @manager (Slack) |
| 数据泄露怀疑 | 安全团队 | #security-incidents |
| 财务影响 > $10k | 财务 + 法律 | @finance-oncall |
| 需要客户通信 | 支持主管 | @support-lead |
通信模板
初始通知(内部)
事件: 支付服务退化
严重级别: SEV2
状态: 调查中
影响: ~20%支付请求失败
开始时间: [时间]
事件指挥官: [姓名]
当前行动:
- 调查根本原因
- 扩展服务
- 监控仪表板
更新在 #payments-incidents
状态更新
更新: 支付服务事件
状态: 缓解中
影响: 减少到 ~5%失败率
持续时间: 25分钟
采取行动:
- 回滚部署 v2.3.4 → v2.3.3
- 扩展服务从 5 → 10 副本
下一步:
- 继续监控
- 根本原因分析进行中
预计解决时间: ~15分钟
解决通知
已解决: 支付服务事件
持续时间: 45分钟
影响: ~5,000受影响交易
根本原因: v2.3.4中内存泄漏
解决:
- 回滚到 v2.3.3
- 交易自动重试成功
后续:
- 事后审查安排于 [日期]
- 错误修复进行中
### 模板2:数据库事件运行书
```markdown
# 数据库事件运行书
## 快速参考
| 问题 | 命令 |
|-------|---------|
| 检查连接 | `SELECT count(*) FROM pg_stat_activity;` |
| 终止查询 | `SELECT pg_terminate_backend(pid);` |
| 检查复制延迟 | `SELECT extract(epoch from (now() - pg_last_xact_replay_timestamp()));` |
| 检查锁 | `SELECT * FROM pg_locks WHERE NOT granted;` |
## 连接池耗尽
```sql
-- 检查当前连接
SELECT datname, usename, state, count(*)
FROM pg_stat_activity
GROUP BY datname, usename, state
ORDER BY count(*) DESC;
-- 识别长时间运行连接
SELECT pid, usename, datname, state, query_start, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start;
-- 终止空闲连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle'
AND query_start < now() - interval '10 minutes';
复制延迟
-- 检查副本延迟
SELECT
CASE
WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0
ELSE extract(epoch from now() - pg_last_xact_replay_timestamp())
END AS lag_seconds;
-- 如果延迟 > 60秒,考虑:
-- 1. 检查主/副本网络
-- 2. 检查副本磁盘I/O
-- 3. 如果不可恢复,考虑故障转移
磁盘空间危急
# 检查磁盘使用
df -h /var/lib/postgresql/data
# 查找大表
psql -c "SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;"
# VACUUM 回收空间
psql -c "VACUUM FULL large_table;"
# 如果紧急,删除旧数据或扩展磁盘
## 最佳实践
### 要做
- **保持运行书更新** - 每次事件后审查
- **定期测试运行书** - 演练日,混沌工程
- **包括回滚步骤** - 总是有逃生口
- **记录假设** - 步骤有效的前提条件
- **链接到仪表板** - 压力下快速访问
### 不要做
- **不要假设知识** - 为凌晨3点大脑写作
- **不要跳过验证** - 确认每个步骤有效
- **不要忘记通信** - 让利益相关者知情
- **不要单独工作** - 尽早升级
- **不要跳过事后审查** - 从每个事件学习
## 资源
- [Google SRE Book - 事件管理](https://sre.google/sre-book/managing-incidents/)
- [PagerDuty 事件响应](https://response.pagerduty.com/)
- [Atlassian 事件管理](https://www.atlassian.com/incident-management)
## 记忆协议(强制)
**开始前:**
读取 `.claude/context/memory/learnings.md`
**完成后:**
- 新模式 -> `.claude/context/memory/learnings.md`
- 发现问题 -> `.claude/context/memory/issues.md`
- 决策制定 -> `.claude/context/memory/decisions.md`
> 假设中断:如果不在记忆中,那就没发生过。