OpenTelemetry系列 (五)| OpenTelemetry Java Instrumentation二次开发指南

前言

我们上一章介绍了OpenTelemetry Java Instrumentation的使用,但是那些都是一些基本的使用,如果有一些自定义的功能,还是需要一些开发工作。本章节将以保姆级教程来介绍一下如何在OpenTelemetry Java Instrumentation上进行二次开发(本文中会将OpenTelemetry Java Instrumentation简写成OJI以方便阅读)。

本文中的相关源码以及相关的实现均为目前的OJI的最新main分支版本目前为1.22.0-SNAPSHOT

开发准备

第一次编译

OJI使用gradle来进行依赖管理,核心的依赖和仓库等等信息都包含在根目录下的settings.gradle.kts中,后续的相关维护也要在其中。并且OJI的开发需要jdk9+的版本,因此需要确认自己的jdk版本是否符合要求。

在确认好前期准备后进入项目,执行gradle assemble来进行打包操作。初次打包可能需要花费超过1个小时,需要耐心等待。除此之外如果遇到依赖拉取失败问题,则可以在build.gradle.kts文件中添加如下配置以使用其他的仓库地址,此处使用的是阿里云仓库:

allprojects {
  repositories {
    maven {
      setUrl("https://maven.aliyun.com/nexus/content/groups/public/")
    }
    mavenCentral()
    mavenLocal()
    jcenter {
      setUrl("https://jcenter.bintray.com/")
    }
    google()
  }
}
复制代码

经过一段时间等待,当控制台输出如下文字,即表示编译成功。

BUILD SUCCESSFUL in 12m 25s
2464 actionable tasks: 2212 executed, 232 from cache, 20 up-to-date

A build scan was not published as you have not authenticated with server 'ge.opentelemetry.io'.
For more information, please see https://gradle.com/help/gradle-authenticating-with-gradle-enterprise.
复制代码

之后我们就可以在javaagent/build/libs目录下找到最终的agent包opentelemetry-javaagent-{version}.jar

新建组件

为了便于管理,我们后续的所有功能示例都将包含在一个组件中,而不会进行多组件的分割。

在进行所有的开发之前我们需要新建一个组件:

  1. instrumentation目录下新建一个目录作为组件的目录,我此处将其命名为bjwzds
  2. 在此目录中新建javaagent目录,并在此目录下创建build.gradle.kts文件,文件内容如下:
plugins {
  id("otel.javaagent-instrumentation")
}

dependencies {

}
复制代码
  1. 在全局的settings.gradle.kts中添加hideFromDependabot(":instrumentation:bjwzds:javaagent")或者是include(":instrumentation:bjwzds:javaagent")来引入我们新增的模块。
  2. 开始在javaagent目录下构建我们的项目结构,大致如下:

至此我们开发的准备工作已经完成,接下来就是愉快的coding环节了!

自定义Instrumentation

需要注意的是在早期版本中可以自己完全创建项目然后以外部插件的形式来注入,但是在后续版本中这种方式被废弃,因此后续的开发都是在clone下来的OJI项目中进行开发。

虽然OJI已经提供了非常多的Instrumentation类库,许许多多知名的开源项目都在其中,但是总是可能会有一些需要自己来处理的内容,比如一些商用库,比如一些公司自制的二方或者三方依赖。这些都不可能找到现成的实现,那么就只能自己来了!

OJI提供了完善的Instrumentation扩展能力,大家可以自行定义自己需要的Instrumentation

简单例子

要创建一个自定义的Instrumentation,最基础的是要先创建一个继承InstrumentationModule的类:

@AutoService(InstrumentationModule.class)
public class BjwzdsInstrumentationModule extends InstrumentationModule {
  public BjwzdsInstrumentationModule() {
    // 此处定义的是组件的名称,以及组件的别名,会在配置组件的开关时使用
    super("bjwzds", "bjwzds-1.0");
  }

  @Override
  public List<TypeInstrumentation> typeInstrumentations() {
    // 组件内包含的TypeInstrumentation,是一个list
    return Collections.singletonList(new BjwzdsInstrumentation());
  }
}
复制代码

在有了InstrumentationModule的类后,只需要再创建一个TypeInstrumentation的实现类,我们的一个最简单的Instrumentation就已经完成了。如下是一个TypeInstrumentation的实现的例子:

public class BjwzdsInstrumentation implements TypeInstrumentation {
  @Override
  public ElementMatcher<TypeD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值