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 结构分析
- Decorator:装饰器,用于装饰 Instrumentation ,
BaseDecorator是一个基础装饰器,所以自定义装饰器都需要继承BaseDecorator或者BaseDecorator的子类。对 span 的操作、自定义标签等行为都需要通过BaseDecorator实现。 - Instrumentation :插桩程序,使用
@AutoService(Instrumenter.class)注解,将当前类注册为一个插桩应用,当 agent 启动的时候,会加载@AutoService(Instrumenter.class)注解的类。 - Advice:对 Instrumentation 需要插桩的方法进行增强处理,主要提供了两个方法级别的注解
@Advice.OnMethodEnter和@Advice.OnMethodExit,分别表示在方法进入的时候调用和在方法退出的时候调用; - Inject/Extract:表示 注入/取出,非必须实现,主要功能是对链路信息的注入和提取操作。用它来实现链路信息的透传,如 traceid、spanid 以及相关传播的参数。
Decorator 类图
这里展示部分类图。
Instrumentation 类图
这里展示部分类图。
Instrumenter 为 interface ,提供了丰富的接口,根据不同定义进行实现。
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,这里展示部分类图。
Extract 类图
ContextVisitor 全称为:AgentPropagation.ContextVisitor,这里展示部分类图。
不论是 Inject 还是 Extract,都会涉及到 Propagation (传播器),关于传播器的使用和介绍参考文档