上周四,线上环境突然疯狂告警,我手机一直滴滴滴滴响个不停
这是一开始看到的告警信息,目测能看出可能是依赖的产品服务出问题了
等我打开电脑一看时,发现告警邮件又变成下面的样子
就只有一个空指针,啥堆栈都没有了(这我就有点懵逼了,大晚上12点,要是不是别人的问题把别人喊起来这不太好)
今天又发过版本,先镜像回滚吧,这样稳妥点(前提得确定新发布的代码,确认回滚不会出问题)
回滚完之后发现告警还在,那么就只能找产品的同学起来看了,结果已联系发现产品那边已经发现自己出问题了
后来服务是恢复了,但是这个没堆栈的问题我一直记着,不把这玩意原因找到,下次再这样我岂不是凉了
因为实例已经重启过了,我只能去日志服务器下载下来排查,6个压缩文件,几十个G
打开error日志的文件一看,全是null,一点堆栈信息都没有,我只能随便拉了一条,用traceId去info文件查全链路的日志,结果还是看不出来任何玩意
我第一反应肯定是因为自己日志打的有问题,但是反复确认了百分之百没错,而且最开始的一些是有堆栈的
第二个猜测,我整个流程中是不是对捕获的异常做了处理,我一行行debug进去,也没发现相关有问题的操作
第三个猜测,这TMD就不是我这边抛出的异常,这是不是就是外部服务抛给我的错误信息,所以没有堆栈信息,然而这全流程就只涉及两个外部调用,入口都塞了特殊的前缀,所以也不可能
最后我只从日志工具本身的问题排查原因了,偶然间看到的一篇文章给我解惑了:
java5之后的一个优化,频繁抛出的异常,JIT会重新编译后抛出没有堆栈的异常信息
备注:我很庆幸我一直没有放弃排查这个问题,虽然花了好几个小时,但是真相大白后真的很开心,哈哈哈哈
不要放过任何一个小的问题点,因为它真的能延伸出很多知识点,那都是你没办法从书本上,没办法让别人手把手交给你的。继续加油!