开源监控插件Cat Transaction模块堆栈信息丢失排查

1,225 阅读2分钟

背景

线上一个新业务,线上报错,打开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初始化的时候创建了单例:MessageManagerMessageProducer 这两个去维护信息的读取和发送,感兴趣可以康康!!