为链路(spanEvent)添加tag
背景
我们可能需要想在代码中写入特定的信息到调用链中,并且希望对里面的特定key做检索
实现思路
创建一个特定的类,只需要一个方法,再对这个类的方法进行增强,这个就可以拿到入参信息,把它加入到调用链路,这个思路是对的,也实现了,不过有优化空间,默认的插件拦截器都是会创建一个spanEvent,这样如果业务中调用了太多次,链路就会很深,实际上这些tag信息是不需要单独开链路的,只需要与当前的链路绑定就好了,所以可以获取当前的spanEvent,把tag内容添加进去
检索的能力通过在收集器端解析特定的key,再把内容写到es中,再通过web端进行检索
获取当前链路的traceId
背景
为了和其它的监控结合,比如在dubbo调用链中显示traceId,或者缓存监控框架中记录traceId,虽然官方提供了日志的增强,可以在日志中打印出traceId,或者使用MDC.get("ptxId")获取,但这个依赖于日志,如果系统没有打印日志,MDC中就是空的,所以需要一个单独获取traceId的便捷方法
实现思路
也是和添加tag思路一样,只需要暴露一个util类,再对它进行增强,在after方法里获取当前的traceId,将它赋值给方法的返回值,这里通过实践发现不能直接返回一个String,修改这个String的值,并不能改变最终的结果,需要包装成一个类,再修改里面的属性。