记一次线上空指针问题排查
前言
今天收到一封告警邮件, 内容如下
com.example.dubbo.filter.ExceptionFilter#invoke [traceId] [DubboServerHandler-thread-19] [DUBBO] Got unchecked and undeclared exception which called by ip. service: com.example.TestService, method: testMethod, exception: java.lang.NullPointerException: null, dubbo version: 2.6.9, current host: ip
java.lang.NullPointerException: null
只有一个 npe
的信息, 看到这里我是懵逼的, 完全不知道怎么会事, 还好我们有 traceId
排查问题
查找日志
直接登录 elk
, 搜索 traceId
, 跟着调用链一路向下走, 然后还是把我看吐了, 一开始直接用 elk
的按时间排序, 降序排序, 跟了半天代码, 越看越不对劲, 排序后的内容如下图
elk
的排序是根据左边的 日志时间
来排序的, 但它并不是日志打印的时间, 真正的打印日志的时间应该是右边 message
那里的, 因为这个疏忽, 导致看了好久日志硬是没看出来问题
查看代码
在明白这个 日志时间
的坑后, 通过手动按照时间排序, 终于找出了正确的调用链, 最后的最后, 问题锁定在了一行代码上:
其它地方全都做了判空处理, 只有这里可能出现问题
复现问题
稍微写一个 demo, idea 直接有警告了
执行一下, 果然报错了
错误提示也是只有一个 npe
结语
在用 Steam 提供的便捷操作时要注意判空😰