04日2057-错误复现命令实现.md 5.0 KB

错误复现命令实现

时间: 2025年06月04日 20:57
任务: 编写一个错误复现的命令(Console)

任务需求

根据用户需求,需要创建一个 Console 命令来复现错误请求:

  • 输入 sys_request_logs 表的 id 或 request_unid 或 run_unid 来获取请求
  • 参考 ProtoJsonRequestTest 测试类发起请求的过程,目标地址依旧使用 env 的 UNITTEST_URL 地址
  • 使用请求记录中的 protobuf_json 和 headers.token 来生成一个请求参数
  • 发起请求 dump 返回结果

实现方案

1. 创建命令类

创建了 app/Console/Commands/ReproduceErrorCommand.php 命令类,继承自 Laravel 的 Command 基类。

2. 核心功能实现

命令签名和参数

protected $signature = 'debug:reproduce-error 
                        {identifier : 请求标识符(可以是id、request_unid或run_unid)}
                        {--type=auto : 标识符类型(id|request_unid|run_unid|auto),auto为自动检测}
                        {--timeout=30 : 请求超时时间(秒)}';

查找请求记录

  • 支持通过 idrequest_unidrun_unid 三种方式查找
  • 实现自动检测功能:优先按 ID 查找,然后按 request_unid,最后按 run_unid
  • 完善的错误处理,当找不到记录时给出明确提示

Token 提取

  • 从请求记录的 headers JSON 中提取 token
  • 支持多种 token 字段名:token、Token、authorization、Authorization
  • 处理 headers 中值为数组的情况
  • 安全显示:输出时只显示 token 前10位

HTTP 请求发起

  • 参考 ProtoJsonRequestTest 的实现方式
  • 使用 GuzzleHttp 客户端
  • 目标地址使用环境变量 UNITTEST_URL
  • 请求方式:POST /gameapi
  • Content-Type: application/json
  • 支持自定义超时时间

3. 技术特性

错误处理

  • 未找到请求记录
  • 缺少 protobuf_json 数据
  • headers 解析失败
  • 网络请求失败
  • JSON 解析错误

日志记录

  • 使用 Laravel Log 记录详细的执行信息
  • 记录请求开始和完成时间
  • 记录请求和响应数据长度
  • 记录错误信息和堆栈跟踪

输出格式

  • 清晰的步骤提示
  • 详细的请求记录信息展示
  • 完整的响应结果输出(状态码、响应头、响应体)

使用示例

基本用法

# 通过 ID 复现请求
php artisan debug:reproduce-error 68973973

# 通过 request_unid 复现请求
php artisan debug:reproduce-error 6840202392627

# 指定标识符类型
php artisan debug:reproduce-error 68973973 --type=id

# 设置超时时间
php artisan debug:reproduce-error 68973973 --timeout=60

输出示例

开始查找请求记录...
标识符: 68973973
类型: auto
找到请求记录:
  ID: 68973973
  Request UNID: 6840202392627
  Run UNID: 
  路径: gameapi
  方法: POST
  创建时间: 2025-06-04 18:29:55
提取到 token: f4b3c51a58...
目标地址: http://kku_laravel.local.gd/
开始发起请求...
请求完成,响应结果:
状态码: 200
响应头:
  Server: nginx/1.27.4
  Date: Wed, 04 Jun 2025 12:59:52 GMT
  Content-Type: application/json
  Transfer-Encoding: chunked
  Connection: keep-alive
  X-Powered-By: PHP/8.3.21
  Cache-Control: no-cache, private
  Vary: Origin
响应内容:
{"runUnid":"68404347a6a07","runMs":"6","code":"OK","callpath":"Shop-Query","lastData":[],"shopQuery":{"lastTimes":"1748943300"}}

测试验证

功能测试

  1. ✅ 通过数据库 ID 查找请求记录
  2. ✅ 通过 request_unid 查找请求记录
  3. ✅ 自动检测标识符类型
  4. ✅ Token 提取和使用
  5. ✅ HTTP 请求发起和响应处理
  6. ✅ 错误情况处理(不存在的记录)

命令注册测试

php artisan debug:reproduce-error --help

命令成功注册,帮助信息正常显示。

文件清单

新增文件

  1. app/Console/Commands/ReproduceErrorCommand.php - 主命令类
  2. app/Console/Commands/README_ReproduceError.md - 详细使用文档

相关文件

  • UCore/Model/RequestLog.php - 请求日志模型
  • tests/Unit/ProtoJsonRequestTest.php - 参考的测试类
  • app/Console/Kernel.php - 命令自动加载配置

技术亮点

  1. 灵活的查找方式:支持多种标识符类型,自动检测功能提升用户体验
  2. 完善的错误处理:覆盖各种异常情况,提供友好的错误提示
  3. 安全性考虑:Token 信息脱敏显示,保护敏感数据
  4. 详细的日志记录:便于问题排查和性能分析
  5. 参考最佳实践:基于现有测试类的成熟实现方案
  6. 用户友好:清晰的输出格式和详细的使用文档

总结

成功实现了错误复现命令,完全满足用户需求:

  • ✅ 支持通过 id/request_unid/run_unid 查找请求记录
  • ✅ 参考 ProtoJsonRequestTest 实现请求发起
  • ✅ 使用 UNITTEST_URL 作为目标地址
  • ✅ 提取并使用 protobuf_json 和 headers.token
  • ✅ 输出详细的响应结果

该命令将极大提升开发者调试效率,特别是在排查线上问题时能够快速复现错误场景。