1. 概述
本文主要分享 @Trace 注解想要追踪的任何方法。
我们首先看看 @Trace
的使用例子,再看看 @Trace
的实现代码。涉及代码如下:
2. 使用例子
本节参考官方文档:Application-toolkit-trace-CN.md
1、使用 Maven 引入相应的工具包
|
2、在任何想要追踪的方法上添加 @Trace
注解,以 SpringMVC 为例子:
|
@Trace
注解的方法,会创建一个 LocalSpan 。ActiveSpan#tag(key, value)
方法,在 LocalSpan 上添加标签键值对。TraceContext.traceId#traceId
方法,获得全局链路追踪编号。
3、执行后,我们看来看看 SkyWalking WEBUI 的展示。
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 对象。
- 第 42 至 46 行:获得操作名。若
#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()
方法,使用全局链路追踪编号,而不是原有结果。