链路追踪

文章40 |   阅读 20547 |   点赞0

来源:https://blog.csdn.net/weixin_42073629/category_9940428.html

SkyWalking 源码分析 —— @Trace 注解想要追踪的任何方法

x33g5p2x  于2021-12-21 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(827)

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 对象。

  • #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() 方法,使用全局链路追踪编号,而不是原有结果。

相关文章