记一次线上空指针问题排查

前言

今天收到一封告警邮件, 内容如下

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 的按时间排序, 降序排序, 跟了半天代码, 越看越不对劲, 排序后的内容如下图
image
elk 的排序是根据左边的 日志时间 来排序的, 但它并不是日志打印的时间, 真正的打印日志的时间应该是右边 message 那里的, 因为这个疏忽, 导致看了好久日志硬是没看出来问题

查看代码

在明白这个 日志时间 的坑后, 通过手动按照时间排序, 终于找出了正确的调用链, 最后的最后, 问题锁定在了一行代码上:
image
其它地方全都做了判空处理, 只有这里可能出现问题

复现问题

稍微写一个 demo, idea 直接有警告了
image
执行一下, 果然报错了
image
错误提示也是只有一个 npe

结语

在用 Steam 提供的便捷操作时要注意判空😰

posted @ 2023-05-16 12:03  博麗靈夢  阅读(203)  评论(0编辑  收藏  举报