线上查询用户消息列表的接口,响应为空,通过链路排查,由于调用栈过深,链路中的参数信息及报错的堆栈并不完整。只能去查看日志,但是日志中没有记录错误相关的入参,从日志中记录的报错信息看,很明显是因为数据的问题导致的空指针异常,但是由于接口内的逻辑很复杂,逻辑分支较多,人工排查触发空指针异常的数据比较困难,此时想到了arthas的watch。
我司提供了预发环境使用arthas排查问题的方案,通过运维同学提供的安装arthas的操作步骤,安装好arthas后。直接使用idea中的arthas插件,复制出watch的命令
watch com.souche.pushcenter.service.impl.MessageIndexStoreServiceImpl queryLasterMessage '{params,returnObj,throwExp}' -n 5 -x 3
即监控方法的入参,返回值及抛出的异常
将上面的命令在arthas的web端执行,然后再调用接口触发异常
就可以看到该方法的出入参,然后根据出入参去排查数据的问题
经过排查是因为脏数据的原因(前人数据归档时,两个关联表,归档的数据范围不同,导致根据一个表的数据查询另一个时,查询不到)
使用arthas很容易就定位到问题了