ddtrace 系列篇之 Instrumentation

133 阅读3分钟

Java Instrumentation 介绍

Instrumentation:插桩(有的人称为“探针”,有的人称为“埋点”,翻译本无错,理解就行)

Java Instrumentation 是 JavaSE 6 中的新特性,通过 Java 代码即 java.lang.instrument 可以实现 instrument 用 Java 代码的方式解决问题的一个功能。

使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。

JavaSE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument、本地代码(native code)instrument,以及动态改变 classpath 等等。这些改变,意味着 Java 具有了更强的动态控制、解释能力,它使得 Java 语言变得更加灵活多变。

DDtrace 自定义 Instrumentation 结构分析

image.png

  1. Decorator:装饰器,用于装饰 Instrumentation ,BaseDecorator是一个基础装饰器,所以自定义装饰器都需要继承 BaseDecorator或者 BaseDecorator的子类。对 span 的操作、自定义标签等行为都需要通过BaseDecorator实现。
  2. Instrumentation :插桩程序,使用@AutoService(Instrumenter.class)注解,将当前类注册为一个插桩应用,当 agent 启动的时候,会加载@AutoService(Instrumenter.class)注解的类。
  3. Advice:对 Instrumentation 需要插桩的方法进行增强处理,主要提供了两个方法级别的注解@Advice.OnMethodEnter@Advice.OnMethodExit,分别表示在方法进入的时候调用和在方法退出的时候调用;
  4. Inject/Extract:表示 注入/取出,非必须实现,主要功能是对链路信息的注入和提取操作。用它来实现链路信息的透传,如 traceid、spanid 以及相关传播的参数。

Decorator 类图

这里展示部分类图。

image.png

Instrumentation 类图

这里展示部分类图。

image.png

Instrumenter 为 interface ,提供了丰富的接口,根据不同定义进行实现。

image.png

HasAdvice:对方法进行环绕处理,也就是我们通常所说的进行埋点操作,主要提供了一个接口方法,用于注册需要埋点的方法,可以对多个 method 进行埋点操作:

/**
 * Instrumenters should register each advice transformation by calling {@link
 * AdviceTransformation#applyAdvice(ElementMatcher, String)} one or more times.
 */
void adviceTransformations(AdviceTransformation transformation);

Tracing: 用于 trace 。

/** Parent class for all tracing related instrumentations */
abstract class Tracing extends Default{...}

Profiling:代表当前是一个*profiling *插桩。

/** Parent class for all profiling related instrumentations */
abstract class Profiling extends Default{...}

CiVisibility: CI 插桩类型。

/** Parent class for all CI related instrumentations */
abstract class CiVisibility extends Default {...}

Default:是一个默认实现。

@SuppressFBWarnings("IS2_INCONSISTENT_SYNC")
abstract class Default implements Instrumenter, HasAdvice{...}

Inject 类图

Setter 全称为:AgentPropagation.Setter,这里展示部分类图。

image.png

Extract 类图

ContextVisitor 全称为:AgentPropagation.ContextVisitor,这里展示部分类图。

image.png

不论是 Inject 还是 Extract,都会涉及到 Propagation (传播器),关于传播器的使用和介绍参考文档