今天早上排查了一个线上问题,记录一下过程。
问题背景
有用户反馈说:已经配置了“AI分析报告”菜单,但页面上始终没有展示出来。
排查过程
1. 怀疑代码没更新
这块菜单配置其实有部分是硬编码的,新增菜单后需要同步调整代码才能生效。
于是我把线上代码包取下来,解压、反编译确认代码,是最新的,排除代码未更新的可能。
2. 怀疑数据有问题
从日志里把执行的 SQL 抓出来,连接数据库手动执行一遍,结果是正常的,数据也符合预期。
3. 怀疑 Spring Boot 加载了错误的配置
如果加载错配置文件,有可能连到错误的数据库。
检查日志后,看到实际使用的端口与启动配置一致,说明 Spring Boot 加载的确实是正确的配置文件。
最终定位
前面的排查都没问题,只能直接观察服务运行时方法的真实返回结果。
但线上环境缺少相关日志,也不方便重新打日志包部署。
于是使用 Arthas 启动 watch 命令监听核心方法的入参和返回值:
watch com.xxx.XxxServiceImpl selectXxxxByUserId "{params,returnObj}" -x 2
结果一眼就看到了关键问题:
component字段最前面有一个空格。
也就是说,用户配置菜单的时候,不小心在组件路径前多敲了一个空格。
这个空格导致后端匹配失败,被过滤掉了。
在 Navicat 里看几乎看不出来,但在 Arthas 的输出里非常明显。
总结
这次排查的思路总体是正确的,但问题本身非常细节。
如果空格在单词后面,在线上环境肉眼基本不可能看出来,只能把数据拉到本地 debug 才能迅速发现。
更重要的一点:
一个工具看不出问题,换个工具可能就豁然开朗。
Navicat 看不出问题,用 Arthas 一下就找到了。
也算是一次很典型的线上细节问题排查案例。