arthus协助线上问题排查

49 阅读2分钟

今天早上排查了一个线上问题,记录一下过程。

问题背景

有用户反馈说:已经配置了“AI分析报告”菜单,但页面上始终没有展示出来。

排查过程

1. 怀疑代码没更新

这块菜单配置其实有部分是硬编码的,新增菜单后需要同步调整代码才能生效。
于是我把线上代码包取下来,解压、反编译确认代码,是最新的,排除代码未更新的可能。

2. 怀疑数据有问题

从日志里把执行的 SQL 抓出来,连接数据库手动执行一遍,结果是正常的,数据也符合预期。

3. 怀疑 Spring Boot 加载了错误的配置

如果加载错配置文件,有可能连到错误的数据库。
检查日志后,看到实际使用的端口与启动配置一致,说明 Spring Boot 加载的确实是正确的配置文件。

最终定位

前面的排查都没问题,只能直接观察服务运行时方法的真实返回结果。
但线上环境缺少相关日志,也不方便重新打日志包部署。

于是使用 Arthas 启动 watch 命令监听核心方法的入参和返回值:

watch com.xxx.XxxServiceImpl selectXxxxByUserId "{params,returnObj}" -x 2

image.png

结果一眼就看到了关键问题:

component 字段最前面有一个空格。

也就是说,用户配置菜单的时候,不小心在组件路径前多敲了一个空格。
这个空格导致后端匹配失败,被过滤掉了。

在 Navicat 里看几乎看不出来,但在 Arthas 的输出里非常明显。

总结

这次排查的思路总体是正确的,但问题本身非常细节。
如果空格在单词后面,在线上环境肉眼基本不可能看出来,只能把数据拉到本地 debug 才能迅速发现。

更重要的一点:

一个工具看不出问题,换个工具可能就豁然开朗。
Navicat 看不出问题,用 Arthas 一下就找到了。

也算是一次很典型的线上细节问题排查案例。