Prompt工程07:排障上下文
从日志、指标、Trace到复现步骤和影响面,理解如何为模型提供有效的排障上下文。
排障上下文是让模型帮助定位和解决问题的关键。好的排障上下文能让模型快速理解问题现象、定位问题原因,输出有效的解决方案。
排障上下文的重要性
缺少排障上下文的问题
当模型没有足够的排障上下文时:
用户输入:
系统出问题了,帮我看看。
问题:
- 模型不知道是什么系统
- 不知道问题现象是什么
- 不知道什么时候开始的
- 不知道影响范围
有排障上下文的效果
用户输入:
[系统信息]
系统:电商平台
模块:订单服务
环境:生产环境
[问题现象]
订单创建接口响应慢,P99超过2秒
开始时间:2024-01-15 10:00:00
影响范围:所有用户
[日志信息]
ERROR 2024-01-15 10:00:05 OrderService.createOrder - 数据库连接超时
WARN 2024-01-15 10:00:06 OrderService.createOrder - Redis连接池满
[监控指标]
- CPU使用率:40%
- 内存使用率:60%
- 数据库连接数:200/200(已满)
- Redis连接数:100/100(已满)
[相关配置]
数据库连接池大小:200
Redis连接池大小:100
效果:模型可以快速定位问题(数据库和Redis连接池耗尽),输出解决方案(增加连接池大小、优化查询)。
排障上下文的组成
核心要素
| 要素 | 内容 | 作用 |
|---|---|---|
| 系统信息 | 系统名称、模块、环境 | 定位问题发生的系统 |
| 问题现象 | 错误描述、表现形式 | 理解问题是什么 |
| 时间信息 | 开始时间、持续时间、频率 | 了解问题发生的时间规律 |
| 影响范围 | 受影响用户、功能、地域 | 判断问题严重程度 |
| 日志信息 | 错误日志、警告日志、堆栈 | 定位问题原因 |
| 指标信息 | CPU、内存、网络、数据库 | 了解系统状态 |
| Trace信息 | 请求链路、调用耗时 | 定位瓶颈位置 |
| 配置信息 | 相关配置项、参数 | 检查配置是否正确 |
| 复现步骤 | 如何复现问题 | 验证解决方案 |
排障上下文层次
层次1:问题定位
├── 系统信息(哪个系统、哪个模块)
├── 问题现象(什么问题、什么表现)
└── 时间信息(何时开始、持续多久)
层次2:影响评估
├── 影响范围(多少用户、哪些功能)
├── 严重程度(P0-P3)
└── 业务影响(收入、用户体验)
层次3:根因分析
├── 日志信息(错误、警告、堆栈)
├── 指标信息(CPU、内存、网络)
├── Trace信息(链路、耗时)
└── 配置信息(参数、开关)
如何提供排障上下文
系统信息
[系统信息]
系统名称:电商平台
模块名称:订单服务
服务名称:order-service
实例数量:5台
环境:生产环境(prod)
地域:北京、上海
问题现象
[问题现象]
问题描述:用户创建订单时提示"系统繁忙,请稍后重试"
错误码:ORDER_CREATE_FAILED
错误信息:"数据库连接超时"
复现步骤:
1. 登录系统
2. 选择商品加入购物车
3. 点击结算
4. 提交订单
5. 出现错误提示
频率:持续出现,约50%的请求失败
时间信息
[时间信息]
开始时间:2024-01-15 10:00:00
持续时间:至今(已持续2小时)
发生频率:持续出现
上次正常时间:2024-01-15 09:59:59
影响范围
[影响范围]
受影响用户:全部用户(约10万活跃用户)
受影响功能:订单创建、订单查询
受影响地域:全部地域
业务影响:无法下单,预计每小时损失10万元
严重程度:P0(紧急)
日志信息
[日志信息]
ERROR 2024-01-15 10:00:05.123 [http-nio-8080-exec-1] OrderService.createOrder - 数据库连接超时
java.sql.SQLTimeoutException: Connection timed out
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at OrderService.createOrder(OrderService.java:123)
WARN 2024-01-15 10:00:06.456 [http-nio-8080-exec-2] RedisConfig - Redis连接池已满,等待连接
指标信息
[指标信息]
资源使用:
- CPU使用率:40%(正常)
- 内存使用率:60%(正常)
- 磁盘使用率:30%(正常)
数据库:
- 连接数:200/200(已满)
- 查询耗时:平均500ms(正常100ms)
- 慢查询数:100个/分钟(正常<10)
Redis:
- 连接数:100/100(已满)
- 响应时间:平均50ms(正常<10ms)
应用:
- 请求量:1000QPS(平时500QPS)
- 错误率:50%(正常<1%)
- 响应时间P99:2000ms(正常<200ms)
Trace信息
[Trace信息]
Trace ID: abc123456789
请求路径:POST /api/orders
调用链:
1. Gateway (10ms)
2. OrderController (5ms)
3. OrderService.createOrder (1900ms)
├── UserService.getUser (50ms)
├── ProductService.checkStock (300ms)
├── OrderRepository.save (1500ms) ← 瓶颈
└── RedisCache.set (50ms)
4. 总耗时:1980ms
配置信息
[配置信息]
数据库配置:
spring.datasource.hikari.maximum-pool-size=200
spring.datasource.hikari.connection-timeout=3000
spring.datasource.hikari.idle-timeout=60000
Redis配置:
spring.redis.jedis.pool.max-active=100
spring.redis.jedis.pool.max-wait=3000
应用配置:
server.tomcat.max-threads=200
排障上下文的格式
结构化排障上下文
[系统信息]
系统:电商平台
模块:订单服务
环境:生产环境
[问题现象]
描述:订单创建接口50%请求失败,提示"系统繁忙"
错误码:ORDER_CREATE_FAILED
[时间信息]
开始:2024-01-15 10:00:00
持续:2小时
[影响范围]
用户:全部10万活跃用户
业务:无法下单,每小时损失10万
严重程度:P0
[日志]
ERROR: 数据库连接超时
WARN: Redis连接池已满
[指标]
DB连接:200/200(满)
Redis连接:100/100(满)
QPS:1000(平时500)
[Trace]
OrderRepository.save 耗时1500ms(瓶颈)
[配置]
Hikari连接池:200
Jedis连接池:100
排障上下文组织原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 先现象后原因 | 先描述问题,再给分析数据 | 先给问题现象,再给日志指标 |
| 关键信息优先 | 最重要的信息放在前面 | 错误日志放在最前面 |
| 时间顺序 | 按时间顺序组织信息 | 按问题发生时间排列 |
| 标注重点 | 对关键部分进行标注 | 使用箭头或加粗标注瓶颈 |
排障上下文的常见问题
问题1:信息不全
表现:缺少关键信息,模型无法定位问题
解决方案:
- 检查是否遗漏了日志、指标、Trace
- 补充系统信息和环境信息
- 提供复现步骤
问题2:信息冗余
表现:提供了大量无关信息,占用 Token
解决方案:
- 只提供相关的日志和指标
- 使用摘要代替完整信息
- 过滤掉正常的日志
问题3:信息混乱
表现:信息没有组织,杂乱无章
解决方案:
- 使用结构化格式
- 按类别组织信息
- 使用标题分隔
问题4:信息过时
表现:提供的信息是过去的,不是当前状态
解决方案:
- 使用实时监控数据
- 提供最新的日志
- 注明信息时间
排障上下文的工具支持
监控工具
| 工具 | 功能 | 适用场景 |
|---|---|---|
| Prometheus | 指标采集和存储 | 系统监控 |
| Grafana | 指标可视化 | 监控面板 |
| ELK | 日志收集和分析 | 日志查询 |
| Jaeger | 分布式链路追踪 | 链路分析 |
排障工具
| 工具 | 功能 | 适用场景 |
|---|---|---|
| curl | 测试 HTTP 接口 | API 测试 |
| ping/telnet | 网络连通性测试 | 网络问题 |
| jstack | Java 线程分析 | 线程问题 |
| jmap | Java 内存分析 | 内存问题 |
排障上下文的最佳实践
生产环境排障
[紧急排障]
系统:支付网关
问题:支付接口超时,P99>5s
严重程度:P0
[实时信息]
时间:当前
指标:CPU 90%, DB连接满, Redis连接满
日志:连接超时错误
Trace:DB查询耗时4s
[立即行动]
1. 扩容连接池(临时)
2. 暂停非核心功能(限流)
3. 排查慢查询(根因)
开发环境排障
[开发排障]
系统:用户服务
问题:单元测试失败
环境:开发环境
[详细信息]
测试方法:UserServiceTest.testCreateUser
错误信息:NullPointerException
堆栈:UserService.createUser:45
[代码上下文]
UserService.java 第45行
当前代码片段
[复现步骤]
1. 运行 mvn test
2. 查看失败测试
性能问题排查
[性能排障]
系统:搜索服务
问题:搜索接口响应慢,P99>3s
[性能分析]
指标:CPU 80%, 内存 70%
Trace:ES查询耗时2.5s
慢查询:复杂聚合查询
[优化方向]
1. 添加索引
2. 简化查询
3. 添加缓存
项目判断清单
- 模型无法定位问题 → 补充系统信息和问题现象
- 模型找不到根因 → 提供日志、指标和 Trace
- 需要快速止血 → 先提供当前状态和紧急措施
- 需要长期排查 → 提供完整的上下文和历史数据
- Token 预算有限 → 使用摘要,重点突出
- 问题间歇性出现 → 提供时间规律和触发条件
- 问题影响范围大 → 先评估影响再分析原因
- 需要多人协作 → 结构化上下文,便于分享