背景
线上一个新业务,线上报错,打开Cat打点一看,很失落,没有啥有价值的信息,于是想查一查,没有具体信息太蛋疼了
这时候想到了一个关键词:Java堆栈丢失
网上冲浪和学城搜索半天,发现JVM堆栈丢失是JVM的一个优化造成的:-XX:-OmitStackTraceInFastThrow
仔细想想,CAT异常上报的时候,还是运行中呢,能拿到完成堆栈信息,所以Pass掉这个答案
着手
首先搞个CAT的Transaction链看了一下,这个东西堆栈信息如何称呼原来叫Children,后面的源码会关联这个一起看,然后简单看了看源码,写了个demo,跑了一下
Debug来了 果然发现最后Transaction提交的时候children的内容是空的,这也就能解释为啥Transaction里没有堆栈信息了。这时候突然想起来,Transaction
的设计应该只是一条事务链,具体内容要自己打,然后就想到了Cat.logEvent()
方法
加上事件,继续Debug
看结果,果然有了
几点自洽
- 请问为什么我从来没有打过,确有一些堆栈信息(比如RPC的调研)呢?
公司内部组件可能已经集成了,所以自己看看源码找找看一般能找到
- 为什么有的时候打日志也会进这里呢?
如果项目里的Log集成了CatAppender
的话,error
会自动去触发Cat.logError()
,所以这个Transaction
里也有的
<appender name="catAppender" class="com.dianping.cat.log4j.CatAppender"></appender>
额外的话
看了看CAT的源码,感觉还是蛮好懂的。
对于Transaction
创建了一个事务栈
在CAT
初始化的时候创建了单例:MessageManager
,MessageProducer
这两个去维护信息的读取和发送,感兴趣可以康康!!