1. 概述
本文主要分享 @Trace 注解想要追踪的任何方法。
我们首先看看 @Trace
的使用例子,再看看 @Trace
的实现代码。涉及代码如下:
2. 使用例子
本节参考官方文档:Application-toolkit-trace-CN.md
1、 使用Maven引入相应的工具包;
|
- @Trace 注解的方法,会创建一个 LocalSpan 。
- ActiveSpan#tag(key, value) 方法,在 LocalSpan 上添加标签键值对。
- TraceContext.traceId#traceId 方法,获得全局链路追踪编号。
3、 执行后,我们看来看看SkyWalkingWEBUI的展示;
3. 实现代码
友情提示:本小节需要胖友阅读过 《SkyWalking 源码分析 —— Agent 插件体系》 。
3.1 TraceAnnotationActivation
org.skywalking.apm.toolkit.activation.trace.TraceAnnotationActivation
,实现 ClassInstanceMethodsEnhancePluginDefine 抽象类,定义了方法切面,代码如下:
org.skywalking.apm.toolkit.activation.trace.TraceAnnotationMethodInterceptor
,实现 InstanceMethodsAroundInterceptor 接口,TraceAnnotationActivation 的拦截器。代码如下:
-
#beforeMethod(...) 方法,创建 LocalSpan 对象。代码如下:
- 第 42 至 46 行:获得操作名。若 @Trace#operationName() 非空,作为操作名。否则,调用 #generateOperationName(Method) 方法,使用方法签名。
- 第 49 行:调用 ContextManager#createLocalSpan(operationName) 方法,创建 LocalSpan 对象。
- #afterMethod(...) 方法,调用 ContextManager#stopSpan() 方法,完成 LocalSpan 对象。
- #handleMethodException(...) 方法,发生异常时,打印错误日志。
3.2 ActiveSpanTagActivation
org.skywalking.apm.toolkit.activation.trace.ActiveSpanTagActivation
,实现 ClassStaticMethodsEnhancePluginDefine 抽象类,定义了方法切面,代码如下:
org.skywalking.apm.toolkit.activation.trace.TraceAnnotationMethodInterceptor
,实现 StaticMethodsAroundInterceptor 接口,ActiveSpanTag 的拦截器。代码如下:
- #beforeMethod(...) 方法,添加 Span 的标签键值对。注意,可以不依赖 @Trace 注解。
3.3 TraceContextActivation
org.skywalking.apm.toolkit.activation.trace.TraceContextActivation
,实现 ClassStaticMethodsEnhancePluginDefine 抽象类,定义了方法切面,代码如下:
org.skywalking.apm.toolkit.activation.trace.TraceAnnotationMethodInterceptor
,实现 StaticMethodsAroundInterceptor 接口,TraceContextActivation 的拦截器。代码如下:
- #afterMethod(...) 方法,调用 ContextManager#getGlobalTraceId() 方法,使用全局链路追踪编号,而不是原有结果。