面向 lse2-us-business-service 应用的 POI 详情页问题全链路排查工具。自动协调 Loghouse、curl、代码查询等多个技能,输出结构化排查报告。
text
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Step 0 │ → │ Step 1 │ → │ Step 2 │ → │ Step 3 │ → │ Step 4 │ → │ Step 5 │
│ 查代码 │ │ 查日志 │ │ 复现请求 │ │ 解析返回 │ │ 阅读代码 │ │ 排查问题 │
│ (sourceId) │ │ (loghouse) │ │ (curl) │ │ (jq/python)│ │ (code MCP) │ │ (分析总结) │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
步骤目标工具输出Step 0确定模块的 sourceId``code::search_codesourceId, 配置文件,数据路径Step 1查询包含 sourceId 的日志loghouse-mcp::query_log完整 URL, bffServiceParams, traceIdStep 2复现请求curl响应 JSONStep 3解析响应数据python3 + jq字段比对,异常检测Step 4定位相关代码code::get_single_file源码文件,字段定义Step 5生成排查报告内置分析根因分析,修复建议
参数必填说明示例gsid✅用户会话 ID31033080013090177494736367500059940538728``poiid✅POI IDB0LR4UPN4M``module❌模块名或 sourceId (默认自动检测)contentPerson``app❌应用名(默认 lse2-us-business-service)lse2-us-business-service``env❌环境( gray/ online,默认 gray)gray``timeRange❌日志查询时间范围(默认 1h ago)30m ago``interface❌接口路径(默认 /search_business/process/middleLayer/poiDetail)/search_business/process/middleLayer/poiDetail``pageIndex❌分页索引(默认 2)2
步骤技能/工具用途0code::search_code搜索模块对应的 sourceId1loghouse-mcp::query_log查询包含 gsid + sourceId 的请求日志2curl使用日志中的 URL 复现请求3python3 + jq解析 JSON 响应,提取关键字段4code::get_single_file / code::search_classes读取相关源码类5(内置分析逻辑)比对预期与实际,输出根因建议
结构化排查报告:
markdown
## 📋 POI 问题排查报告
**GSID**: xxx | **POIID**: xxx | **时间**: xxx
### [1/5] ✅ 日志查询
- 找到 X 条匹配日志
- TraceID: xxx
- 请求耗时:xx ms
### [2/5] ✅ 请求复现
- 请求 URL: http://xxx/xxx
- 响应大小:xx KB
- 状态码:200
### [3/5] ✅ 响应解析
| 字段 | 预期值 | 实际值 | 状态 |
|------|--------|--------|------|
| shopSettlement.state | 付费 | 未入驻 | ❌ 异常 |
### [4/5] ✅ 代码定位
- 相关类:`ShopSettlementDTO.java`
- 关键字段定义位置:L347
### [5/5] 🔍 根因分析
**问题**: shopSettlement 数据未返回
**可能原因**:
1. 商家未入驻(state=未入驻)
2. shopId 为空导致 DTO 未构建
3. 上游接口未透传
**建议**:
- 检查商家入驻状态
- 查看 shopId 生成逻辑
bash
# 用户提供 gsid 和 poiid
"帮我排查这个 POI 问题:gsid=31033080013090177494736367500059940538728, poiid=B0LR4UPN4M"
bash
# 排查手艺人模块
"帮我排查 POI B0LR4UPN4M 的手艺人模块,gsid=xxx, module=contentPerson"
bash
"查一下线上环境的 POI 问题,gsid=xxx, poiid=xxx, env=online"
bash
"排查 2 小时内的日志,gsid=xxx, poiid=xxx, timeRange=2h ago"
目标: 确定目标模块对应的 sourceId
流程:
module 参数(如 contentPerson),先在 references/source_id_map.md 中查找映射命令:
bash
# 方法 1: 查映射表
grep "contentPerson" references/source_id_map.md
# 方法 2: 搜索代码库
aone-kit call-tool code::search_code '{
"search": "contentPerson",
"repo": "gaode.search/us-business-service",
"pageSize": 10
}'
输出:
sourceId: 模块的唯一标识 (如 contentPerson)dataPath: 数据在响应中的路径 (如 data.contentPerson.data.personInfos)description: 模块用途说明常用模块映射:
模块名sourceId说明手艺人contentPerson手艺人/匠人列表案例集contentCaseBook服务案例店铺基础shopBaseInfo商家信息入驻信息shopSettlement入驻状态广告分发adResourceDistribute广告资源
目标: 找到包含 gsid 和 sourceId 的 /search_business/process/middleLayer/poiDetail 接口日志
命令:
bash
aone-kit call-tool loghouse-mcp::query_log '{
"app_name": "lse2-us-business-service",
"log_name": "nginx_uni",
"query": "<gsid> AND pageIndex=<pageIndex> AND \"<sourceId>\" AND /search_business/process/middleLayer/poiDetail",
"start_time": "<timeRange>",
"end_time": "now",
"size": 10,
"reverse": true,
"emp_id": "501280"
}'
关键改进: 使用 sourceId 精准过滤日志,避免查询无关请求
输出提取:
url 字段 → 用于 Step 2 复现traceId 字段 → 用于关联追踪bffServiceParams → 验证是否包含目标 sourceIdupstream_response_time → 耗时分析目标: 使用日志中的完整 URL 重新发起请求
命令:
bash
# 从日志 URL 中提取完整请求(替换 IP 为域名)
URL=$(echo "$LOG_URL" | sed 's|http://[0-9.]*|http://gray-us-business.amap.com|')
curl -s "$URL" -o /tmp/poi_response.json
注意:
gray-us-business.amap.com 或 us-business.amap.com目标: 提取关键字段,与预期值比对
命令:
bash
python3 << 'EOF'
import json
with open('/tmp/poi_response.json') as f:
data = json.load(f)
# 提取关键字段
fields = {
'shopSettlement': data.get('data', {}).get('middleLayerStrategy', {}).get('shopSettlement'),
'baseInfo': data.get('data', {}).get('middleLayerStrategy', {}).get('baseInfo'),
'shopBaseInfo': data.get('data', {}).get('middleLayerStrategy', {}).get('shopBaseInfo'),
}
# 检查异常
issues = []
if not fields['shopSettlement']:
issues.append('shopSettlement 为空')
if fields['shopSettlement'] and not fields['shopSettlement'].get('shopId'):
issues.append('shopId 为空')
print(json.dumps({'fields': fields, 'issues': issues}, ensure_ascii=False, indent=2))
EOF
目标: 定位相关代码,理解字段生成逻辑
命令:
bash
# 搜索相关类
aone-kit call-tool code::search_classes '{
"search": "ShopSettlementDTO",
"repo": "gaode.search/us-business-service"
}'
# 获取完整文件
aone-kit call-tool code::get_single_file '{
"repo": "gaode.search/us-business-service",
"ref": "master",
"filePath": "us-platform/src/main/java/com/amap/us/platform/node/model/shop/ShopSettlementDTO.java"
}'
分析重点:
settlementRightInfo.state)目标: 综合以上信息,输出根因分析
分析框架:
text
1. 数据层问题?
- 数据库/缓存中是否有数据
- 数据是否正确
2. 逻辑层问题?
- 条件判断导致未返回
- 空指针/异常被吞
3. 配置层问题?
- Diamond 配置影响
- AB 实验开关
4. 链路层问题?
- 上游未透传
- 下游超时
现象可能原因排查方向shopSettlement 为空商家未入驻查 settlementRightInfo.stateshopId 为空POI 未关联商家查 POI-Shop 绑定关系部分字段缺失版本差异/AB 实验查 testid 和 AB 配置整个接口 500服务异常查日志异常堆栈响应慢 (>1s)下游超时查各模块耗时
修改 interface 参数即可适配其他接口:
/search_business/process/middleLayer/shopBaseInfo/search_business/process/middleLayer/shopSettlement/search_business/process/middleLayer/user修改 app 参数:
lse2-us-business-service (主应用)us-business-service (老应用)根据问题类型输出修复建议:
text
【修复建议】
1. 如果是数据缺失 → 联系 DBA 补数据
2. 如果是逻辑问题 → 提 CR 修复代码
3. 如果是配置问题 → 修改 Diamond 配置
scripts/poi-debug.sh — 执行脚本references/fields.md — 关键字段说明references/faq.md — 常见问题 FAQsf auth login 和 Aone MCP 已授权版本:0.1.0 | 作者:土曜 | 最后更新:2026-03-31