Opentelemetry是怎么做链路追踪的介绍了opentelemetry的API和SDK实现,也介绍了如何进行手动买点。这篇博客是介绍如何进行自动埋点,这当然要用到javaagent技术了。Java Agent实现指南有写过javaagent的实现指南和类加载的坑,今天看看opentelemetry是如何做的,其github地址是opentelemetry-java-instrumentation,接下来应该就是跟着代码流水账了。
OpenTelemetryAgent类
这是javaagent的Premain-class和Agent-class,也是javaagent的启动类。注释中写到,该类会被SystemClassLoader加载,其他类会被BootstrapClassLoader加载。如果在其他类中再反向引用该类,则会导致该类再被BootStrapClassLoader加载,导致出现两个不同的OpenTelemetryAgent类(因为类加载器不同)。为了防止这件事发生,注释里提了几个注意点:
- 该类尽可能做少的事情
- 绝对不要从其他类引用该类
- 不要在该类中存储static数据(如果真出现两个类的情况,那么其实是两份static数据)
- 不要在该类中初始化任何日志组件。
那么该类做了哪些事呢?
- 拿到agentJar,并将该jar设置到BootStrapClassLoader的搜索路径(为了由bootstrapClassLoader加载其他类)
- 将instrumention对象放置到Holder的类中,以便在其他地方使用
- 调用AgentInitializer,进入真正的agent初始化工作。
步骤1和2应该是所有javaagent都需要的工作,自己实现agent也可以借鉴。第3步是opentelemetry的核心了,接下来进入这一部分。
AgentInitializer类
还是先看注释:这个类被OpenTelemetryAgent调用,因此由bootstrapClassLoader加载,因此可以畅通地使用agent的其他类(同样被bootstrapClassLoader加载)