Skip to content

Commit d94a530

Browse files
authored
Upgrade otel 1 10 (#357)
* ⬆️ upgrade otel * ♻️ update servlet-common packaging * ♻️ update HttpStatusConverter package location' * ♻️ update TestOpenTelemetryInstaller to be an AgentListener * ➕ add new deps to the testing bootstrap * ➕ add logging exporter to classpath explicitly for tests * ♻️ fix initialization in instrumentation tests * ➕ add servlet-common bootstrap to test runtime for servlet projects * ♻️ refactor MuzzlePlugin to handle refactor of MuzzleGradlePluginUtil to kotlin companion object' * 🐛 fix muzzle check for instrumentation modules that need the servlet-common bootstrap * ⬆️ upgrade byte buddy * 🐛 fix expected metric name for otlp exporter exported' * 🐛 disable assertions failing due to upstream bug
1 parent 7cb15a9 commit d94a530

File tree

20 files changed

+144
-101
lines changed

20 files changed

+144
-101
lines changed

build.gradle.kts

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ subprojects {
3434
extra.set("versions", mapOf(
3535
// when updating these values, some values must also be updated in buildSrc as this map
3636
// cannot be accessed there
37-
"opentelemetry" to "1.9.1",
37+
"opentelemetry" to "1.10.0",
3838
"opentelemetry_proto" to "0.11.0-alpha",
39-
"opentelemetry_java_agent" to "1.9.2-alpha",
40-
"opentelemetry_java_agent_all" to "1.9.2",
41-
"opentelemetry_gradle_plugin" to "1.9.2-alpha",
42-
"byte_buddy" to "1.11.22",
39+
"opentelemetry_java_agent" to "1.10.0-alpha",
40+
"opentelemetry_java_agent_all" to "1.10.0",
41+
"opentelemetry_gradle_plugin" to "1.10.0-alpha",
42+
"byte_buddy" to "1.12.6",
4343
"slf4j" to "1.7.30"
4444
))
4545

buildSrc/build.gradle.kts

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ repositories {
2727
dependencies {
2828
implementation(gradleApi())
2929
implementation(localGroovy())
30-
val otelInstrumentationVersion = "1.9.2-alpha"
30+
val otelInstrumentationVersion = "1.10.0-alpha"
3131
implementation("io.opentelemetry.javaagent:opentelemetry-muzzle:$otelInstrumentationVersion")
3232
implementation("io.opentelemetry.instrumentation.muzzle-generation:io.opentelemetry.instrumentation.muzzle-generation.gradle.plugin:$otelInstrumentationVersion")
3333
implementation("io.opentelemetry.instrumentation.muzzle-check:io.opentelemetry.instrumentation.muzzle-check.gradle.plugin:$otelInstrumentationVersion")
@@ -40,10 +40,10 @@ dependencies {
4040
implementation("org.ow2.asm", "asm", "9.1")
4141
implementation("org.ow2.asm", "asm-tree", "9.1")
4242
implementation("org.apache.httpcomponents:httpclient:4.5.10")
43-
implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.11.22") {
43+
implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.12.6") {
4444
exclude(group = "net.bytebuddy", module = "byte-buddy")
4545
}
46-
implementation("net.bytebuddy:byte-buddy-dep:1.11.22")
46+
implementation("net.bytebuddy:byte-buddy-dep:1.12.6")
4747

4848
testImplementation("org.spockframework", "spock-core", "1.3-groovy-2.5")
4949
testImplementation("org.codehaus.groovy", "groovy-all", "2.5.8")

buildSrc/src/main/groovy/MuzzlePlugin.groovy

+25-14
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
*/
55

66

7+
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
8+
import io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil
79
import org.gradle.api.file.FileCollection
10+
import org.gradle.api.file.RegularFile
11+
import org.gradle.api.tasks.bundling.AbstractArchiveTask
812

9-
import java.lang.reflect.Method
10-
import java.security.SecureClassLoader
1113
import java.util.concurrent.atomic.AtomicReference
1214
import java.util.function.Predicate
1315
import java.util.regex.Pattern
@@ -72,6 +74,13 @@ class MuzzlePlugin implements Plugin<Project> {
7274
// compileMuzzle compiles all projects required to run muzzle validation.
7375
// Not adding group and description to keep this task from showing in `gradle tasks`.
7476
def compileMuzzle = project.task('compileMuzzle')
77+
def muzzleBootstrap = project.configurations.create("muzzleBootstrap")
78+
muzzleBootstrap.setCanBeConsumed(false)
79+
muzzleBootstrap.setCanBeResolved(true)
80+
def shadowMuzzleBootstrap = project.tasks.create("shadowMuzzleBootstrap", ShadowJar.class) {
81+
configurations = [muzzleBootstrap]
82+
archiveFileName.set("bootstrap-for-muzzle-check.jar")
83+
}
7584
def muzzle = project.task('muzzle') {
7685
group = 'Muzzle'
7786
description = "Run instrumentation muzzle on compile time dependencies"
@@ -80,21 +89,18 @@ class MuzzlePlugin implements Plugin<Project> {
8089
project.getLogger().info('No muzzle pass directives configured. Asserting pass against instrumentation compile-time dependencies')
8190
ClassLoader userCL = createCompileDepsClassLoader(project, bootstrapProject)
8291
ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject)
83-
Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil')
84-
.getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class)
85-
assertionMethod.invoke(null, instrumentationCL, userCL, true)
92+
MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, true)
8693
}
8794
println "Muzzle executing for $project"
8895
}
96+
dependsOn(shadowMuzzleBootstrap)
8997
}
9098
def printReferences = project.task('printMuzzleReferences') {
9199
group = 'Muzzle'
92100
description = "Print references created by instrumentation muzzle"
93101
doLast {
94102
ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject)
95-
Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil')
96-
.getMethod('printMuzzleReferences', ClassLoader.class)
97-
assertionMethod.invoke(null, instrumentationCL)
103+
MuzzleGradlePluginUtil.@Companion.printMuzzleReferences(instrumentationCL)
98104
}
99105
}
100106
project.tasks.compileMuzzle.dependsOn(bootstrapProject.tasks.compileJava)
@@ -201,7 +207,7 @@ class MuzzlePlugin implements Plugin<Project> {
201207
/**
202208
* Create a classloader with dependencies for a single muzzle task.
203209
*/
204-
private static ClassLoader createClassLoaderForTask(Project project, Project bootstrapProject, String muzzleTaskName) {
210+
private static ClassLoader createClassLoaderForTask(Project project, Project bootstrapProject, String muzzleTaskName, RegularFile shadowMuzzleArchiveFile) {
205211
List<URL> userUrls = new ArrayList<>()
206212

207213
project.getLogger().info("Creating task classpath")
@@ -214,6 +220,9 @@ class MuzzlePlugin implements Plugin<Project> {
214220
project.getLogger().info("-- Added to instrumentation bootstrap classpath: $f")
215221
userUrls.add(f.toURI().toURL())
216222
}
223+
if (shadowMuzzleArchiveFile != null) {
224+
userUrls.add(shadowMuzzleArchiveFile.asFile.toURI().toURL())
225+
}
217226
return new URLClassLoader(userUrls.toArray(new URL[0]), ClassLoader.platformClassLoader)
218227
}
219228

@@ -377,12 +386,14 @@ class MuzzlePlugin implements Plugin<Project> {
377386
ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject, toolingProject)
378387
def ccl = Thread.currentThread().contextClassLoader
379388
Thread.currentThread().contextClassLoader = instrumentationCL
380-
ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName)
389+
def shadowMuzzleTask = project.tasks.findByName("shadowMuzzleBootstrap") as AbstractArchiveTask
390+
RegularFile shadowMuzzleArchiveFile
391+
if (shadowMuzzleTask != null) {
392+
shadowMuzzleArchiveFile = shadowMuzzleTask.getArchiveFile().get()
393+
}
394+
ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName, shadowMuzzleArchiveFile)
381395
try {
382-
// find all instrumenters, get muzzle, and assert
383-
Method assertionMethod = instrumentationCL.loadClass('io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil')
384-
.getMethod('assertInstrumentationMuzzled', ClassLoader.class, ClassLoader.class, boolean.class)
385-
assertionMethod.invoke(null, instrumentationCL, userCL, muzzleDirective.assertPass)
396+
MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, muzzleDirective.assertPass)
386397
} finally {
387398
Thread.currentThread().contextClassLoader = ccl
388399
}

instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/client/HttpClientResponseTracingHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import io.opentelemetry.api.trace.Span;
2929
import io.opentelemetry.context.Context;
3030
import io.opentelemetry.context.Scope;
31-
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
31+
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
3232
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.AttributeKeys;
3333
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.DataCaptureUtils;
3434
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyClientSingletons;

instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerResponseTracingHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import io.opentelemetry.api.trace.Span;
2929
import io.opentelemetry.context.Context;
3030
import io.opentelemetry.context.Scope;
31-
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
31+
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
3232
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.AttributeKeys;
3333
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.DataCaptureUtils;
3434
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyServerSingletons;

instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientResponseTracingHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import io.opentelemetry.api.trace.Span;
2929
import io.opentelemetry.context.Context;
3030
import io.opentelemetry.context.Scope;
31-
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
31+
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
3232
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys;
3333
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils;
3434
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyClientSingletons;

instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerResponseTracingHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import io.opentelemetry.api.trace.Span;
2929
import io.opentelemetry.context.Context;
3030
import io.opentelemetry.context.Scope;
31-
import io.opentelemetry.instrumentation.api.tracer.HttpStatusConverter;
31+
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpStatusConverter;
3232
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys;
3333
import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils;
3434
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyServerSingletons;

instrumentation/servlet/servlet-3.0/build.gradle.kts

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ afterEvaluate{
3030
val versions: Map<String, String> by extra
3131

3232
dependencies {
33-
implementation("io.opentelemetry.instrumentation:opentelemetry-servlet-common:${versions["opentelemetry_java_agent"]}")
33+
implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common:${versions["opentelemetry_java_agent"]}")
3434
implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}") // Servlet3Accessor
3535
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
3636
testImplementation("io.opentelemetry.javaagent:opentelemetry-muzzle:${versions["opentelemetry_java_agent"]}")
3737
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
3838
compileOnly("javax.servlet:javax.servlet-api:3.1.0")
39+
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
40+
muzzleBootstrap("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
3941

4042
testImplementation(project(":instrumentation:servlet:servlet-rw"))
4143
testImplementation(testFixtures(project(":testing-common")) as ProjectDependency) {

instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/BodyCaptureAsyncListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import io.opentelemetry.api.trace.Span;
2020
import io.opentelemetry.instrumentation.api.field.VirtualField;
21-
import io.opentelemetry.instrumentation.servlet.ServletAsyncListener;
2221
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Utils;
22+
import io.opentelemetry.javaagent.instrumentation.servlet.ServletAsyncListener;
2323
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons;
2424
import java.io.BufferedReader;
2525
import java.io.PrintWriter;

instrumentation/spark-2.3/build.gradle.kts

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
plugins {
23
`java-library`
34
id("net.bytebuddy.byte-buddy")
@@ -30,6 +31,8 @@ dependencies {
3031
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-spark-2.3:${versions["opentelemetry_java_agent"]}")
3132
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
3233
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-jetty-8.0:${versions["opentelemetry_java_agent"]}")
34+
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
35+
muzzleBootstrap("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
3336

3437
compileOnly("com.sparkjava:spark-core:2.3")
3538

instrumentation/struts-2.3/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ dependencies {
1212
exclude(group = "org.eclipse.jetty", module = "jetty-server")
1313
}
1414
testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-3.0:${versions["opentelemetry_java_agent"]}")
15+
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
1516
testImplementation("org.apache.struts:struts2-core:2.3.1")
1617
testImplementation("org.apache.struts:struts2-json-plugin:2.3.1")
1718
testImplementation("org.eclipse.jetty:jetty-server:8.0.0.v20110901")

instrumentation/undertow/undertow-1.4/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ dependencies {
3333
testImplementation("io.undertow:undertow-servlet:2.0.0.Final")
3434
testRuntimeOnly(project(":instrumentation:servlet:servlet-3.0"))
3535
testRuntimeOnly(project(":instrumentation:undertow:undertow-servlet-1.4"))
36+
testRuntimeOnly("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-servlet-common-bootstrap:${versions["opentelemetry_java_agent"]}")
3637
}
3738

javaagent-tooling/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dependencies {
2121
instrumentationMuzzle("io.opentelemetry.instrumentation:gradle-plugins:${versions["opentelemetry_gradle_plugin"]}")
2222
instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
2323
instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}")
24-
instrumentationMuzzle("net.bytebuddy:byte-buddy-dep:1.11.22")
24+
instrumentationMuzzle("net.bytebuddy:byte-buddy-dep:1.12.6")
2525
instrumentationMuzzle("com.google.auto.service:auto-service:1.0")
2626
instrumentationMuzzle("org.slf4j:slf4j-api:${versions["slf4j"]}")
2727
}

smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,13 @@ public void postJson() throws IOException, InterruptedException {
174174

175175
ArrayList<ExportMetricsServiceRequest> metrics = new ArrayList<>(waitForMetrics());
176176
Assertions.assertTrue(hasMetricNamed("otlp.exporter.seen", metrics));
177-
Assertions.assertTrue(hasMetricNamed("otlp.exported.exported", metrics));
177+
Assertions.assertTrue(hasMetricNamed("otlp.exporter.exported", metrics));
178+
/*
179+
These metrics stopped being reported in OTEL SDK 1.10.0, due to a bug in the OpenTelemetry SDK
180+
Autoconfigure project https://github.com/open-telemetry/opentelemetry-java/issues/4109
178181
Assertions.assertTrue(hasMetricNamed("processedSpans", metrics));
179182
Assertions.assertTrue(hasMetricNamed("queueSize", metrics));
183+
*/
180184
Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.count", metrics));
181185
Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.time", metrics));
182186
Assertions.assertTrue(hasMetricNamed("runtime.jvm.memory.pool", metrics));

testing-bootstrap/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ dependencies {
1313
api("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
1414
api("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}")
1515
api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}")
16+
api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal:${versions["opentelemetry_java_agent"]}")
17+
api("io.opentelemetry:opentelemetry-exporter-otlp:${versions["opentelemetry"]}")
1618
implementation(project(":javaagent-core"))
1719
implementation(project(":filter-api"))
1820

testing-common/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
testFixturesCompileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha")
2222
testFixturesApi("com.squareup.okhttp3:okhttp:4.9.0")
2323
testFixturesApi("com.squareup.okhttp3:logging-interceptor:4.9.0")
24+
testFixturesImplementation("io.opentelemetry:opentelemetry-exporter-logging:${versions["opentelemetry"]}")
2425
testFixturesImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}")
2526
testFixturesImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions["opentelemetry_java_agent"]}") {
2627
constraints {

testing-common/src/testFixtures/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java

+23-7
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
import io.opentelemetry.api.GlobalOpenTelemetry;
2222
import io.opentelemetry.api.trace.Tracer;
2323
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
24-
import io.opentelemetry.javaagent.extension.AgentListener;
2524
import io.opentelemetry.javaagent.tooling.AgentInstaller;
2625
import java.io.IOException;
2726
import java.lang.instrument.ClassFileTransformer;
2827
import java.lang.instrument.Instrumentation;
28+
import java.lang.reflect.Field;
2929
import java.util.Arrays;
3030
import java.util.Collections;
3131
import java.util.concurrent.TimeUnit;
@@ -47,8 +47,6 @@ public abstract class AbstractInstrumenterTest {
4747
private static final org.slf4j.Logger log =
4848
LoggerFactory.getLogger(AbstractInstrumenterTest.class);
4949

50-
private static final AgentListener COMPONENT_INSTALLER;
51-
5250
/**
5351
* For test runs, agent's global tracer will report to this list writer.
5452
*
@@ -72,8 +70,6 @@ public abstract class AbstractInstrumenterTest {
7270
// TODO causes Caused by: java.lang.ClassCastException
7371
((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.WARN);
7472
((Logger) LoggerFactory.getLogger("io.opentelemetry")).setLevel(Level.DEBUG);
75-
76-
COMPONENT_INSTALLER = new TestOpenTelemetryInstaller(TEST_WRITER);
7773
}
7874

7975
private static ClassFileTransformer classFileTransformer;
@@ -88,10 +84,30 @@ public abstract class AbstractInstrumenterTest {
8884

8985
@BeforeAll
9086
public static void beforeAll() {
87+
/*
88+
* OpenTelemetry moved the initialization of some agent primitives to the OTEL class
89+
* OpenTelemetryAgent which does not get used in the scope of these tests. To remove this
90+
* workaround, we should adopt their testing pattern leveraging the agent-for-teseting artifact
91+
* and the AgentInstrumentationExtension for JUnit.
92+
*/
93+
TestAgentStarter testAgentStarter = new TestAgentStarter();
94+
try {
95+
Class<?> agentInitializerClass =
96+
ClassLoader.getSystemClassLoader()
97+
.loadClass("io.opentelemetry.javaagent.bootstrap.AgentInitializer");
98+
Field agentClassLoaderField = agentInitializerClass.getDeclaredField("agentClassLoader");
99+
agentClassLoaderField.setAccessible(true);
100+
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
101+
agentClassLoaderField.set(null, systemClassLoader);
102+
Field agentStarterField = agentInitializerClass.getDeclaredField("agentStarter");
103+
agentStarterField.setAccessible(true);
104+
agentStarterField.set(null, testAgentStarter);
105+
} catch (Throwable t) {
106+
throw new AssertionError("Could not access agent classLoader", t);
107+
}
91108
if (classFileTransformer == null) {
92109
classFileTransformer =
93-
AgentInstaller.installBytebuddyAgent(
94-
INSTRUMENTATION, Collections.singleton(COMPONENT_INSTALLER));
110+
AgentInstaller.installBytebuddyAgent(INSTRUMENTATION, Collections.emptyList());
95111
}
96112
if (TEST_TRACER == null) {
97113
TEST_TRACER = GlobalOpenTelemetry.getTracer("io.opentelemetry.auto");

0 commit comments

Comments
 (0)