表扬自己:《D数据库实体设计合集》
摘要: 原创出处 www.iocoder.cn/SkyWalking/… 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 SkyWalking 3.2.6 正式版
🙂🙂🙂关注微信公众号:【芋道源码】有福利:
- RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
- 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
- 新的源码解析文章实时收到通知。每周更新一篇左右。
- 认真的源码交流微信群。
1. 概述
本文主要分享 @Trace 注解想要追踪的任何方法。
我们首先看看 @Trace
的使用例子,再看看
@Trace
的实现代码。涉及代码如下:
2. 使用例子
本节参考官方文档:Application-toolkit-trace-CN.md
1、使用 Maven 引入相应的工具包
<dependency>
<groupId>org.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
2、在任何想要追踪的方法上添加 @Trace
注解,以 SpringMVC 为例子:
@Trace
@GetMapping("/log")
public String log() {
ActiveSpan.tag("mp", "芋道源码");
System.out.println("traceId:" + TraceContext.traceId());
return "log";
}
@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()
方法,使用全局链路追踪编号,而不是原有结果。
666. 彩蛋
简单一文一篇。
胖友,分享个朋友圈可好?