分布式追踪 & APM 系统 SkyWalking 源码分析 —— @Trace 注解想要追踪的任何方法

3,709 阅读2分钟
自我表扬:《Dubbo 实现原理与源码解析 —— 精品合集》
表扬自己:《D数据库实体设计合集》

摘要: 原创出处 www.iocoder.cn/SkyWalking/… 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 SkyWalking 3.2.6 正式版


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

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";
}

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 的拦截器。代码如下:

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. 彩蛋

知识星球

简单一文一篇。

胖友,分享个朋友圈可好?