diff --git a/build.gradle.kts b/build.gradle.kts index 6f96cdf87..9627ca290 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,20 +40,16 @@ subprojects { extra.set("versions", mapOf( // when updating these values, some values must also be updated in buildSrc as this map // cannot be accessed there - // 7/23/22 version 1.11.1-alpha is specified for opentelemetry_java_agent_jaxrs - // gradle can't seem to load a more current version than that - "opentelemetry" to "1.13.0", - "opentelemetry_semconv" to "1.13.0-alpha", + "opentelemetry" to "1.24.0", + "opentelemetry_semconv" to "1.24.0-alpha", "opentelemetry_proto" to "0.11.0-alpha", - "opentelemetry_java_agent" to "1.13.1-alpha", - "opentelemetry_java_agent_all" to "1.13.1", - "opentelemetry_java_agent_jaxrs" to "1.11.1-alpha", - "opentelemetry_java_agent_netty" to "1.13.1-alpha", - "opentelemetry_java_agent-tooling" to "1.13.1-alpha", + "opentelemetry_java_agent" to "1.24.0-alpha", + "opentelemetry_java_agent_all" to "1.24.0", + "opentelemetry_java_agent-tooling" to "1.24.0-alpha", - "opentelemetry_gradle_plugin" to "1.16.0-alpha", + "opentelemetry_gradle_plugin" to "1.24.0-alpha", "byte_buddy" to "1.12.10", - "slf4j" to "1.7.32" + "slf4j" to "2.0.7" )) apply() diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 1103e1a19..1629cafbe 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -27,7 +27,7 @@ repositories { dependencies { implementation(gradleApi()) implementation(localGroovy()) - val otelInstrumentationVersion = "1.13.0-alpha" + val otelInstrumentationVersion = "1.24.0-alpha" implementation("io.opentelemetry.javaagent:opentelemetry-muzzle:$otelInstrumentationVersion") implementation("io.opentelemetry.instrumentation.muzzle-generation:io.opentelemetry.instrumentation.muzzle-generation.gradle.plugin:$otelInstrumentationVersion") implementation("io.opentelemetry.instrumentation.muzzle-check:io.opentelemetry.instrumentation.muzzle-check.gradle.plugin:$otelInstrumentationVersion") diff --git a/buildSrc/src/main/groovy/MuzzlePlugin.groovy b/buildSrc/src/main/groovy/MuzzlePlugin.groovy index cf4a290fe..85a20728d 100644 --- a/buildSrc/src/main/groovy/MuzzlePlugin.groovy +++ b/buildSrc/src/main/groovy/MuzzlePlugin.groovy @@ -89,7 +89,7 @@ class MuzzlePlugin implements Plugin { project.getLogger().info('No muzzle pass directives configured. Asserting pass against instrumentation compile-time dependencies') ClassLoader userCL = createCompileDepsClassLoader(project, bootstrapProject) ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject) - MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, true) + MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, muzzleDirective.excludedInstrumentationNames, true) } println "Muzzle executing for $project" } @@ -276,6 +276,7 @@ class MuzzlePlugin implements Plugin { inverseDirective.versions = version inverseDirective.assertPass = !muzzleDirective.assertPass inverseDirectives.add(inverseDirective) + inverseDirective.excludedInstrumentationNames.addAll(muzzleDirective.excludedInstrumentationNames) } return inverseDirectives @@ -393,7 +394,7 @@ class MuzzlePlugin implements Plugin { } ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName, shadowMuzzleArchiveFile) try { - MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, muzzleDirective.assertPass) + MuzzleGradlePluginUtil.@Companion.assertInstrumentationMuzzled(instrumentationCL, userCL, muzzleDirective.excludedInstrumentationNames, muzzleDirective.assertPass) } finally { Thread.currentThread().contextClassLoader = ccl } @@ -457,6 +458,7 @@ class MuzzleDirective { String versions Set skipVersions = new HashSet<>() List additionalDependencies = new ArrayList<>() + Set excludedInstrumentationNames = new HashSet<>() boolean assertPass boolean assertInverse = false boolean coreJdk = false @@ -474,6 +476,10 @@ class MuzzleDirective { additionalDependencies.add(compileString) } + void excludeInstrumentationName(String excludedInstName) { + excludedInstrumentationNames.add(excludedInstName) + } + /** * Slug of directive name. * diff --git a/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/AutoInstrumentationPlugin.java b/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/AutoInstrumentationPlugin.java index 99317d05b..ec9c8defd 100644 --- a/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/AutoInstrumentationPlugin.java +++ b/buildSrc/src/main/java/io/opentelemetry/instrumentation/gradle/AutoInstrumentationPlugin.java @@ -64,11 +64,11 @@ private void addDependencies(Project project) { "io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:" + versions .get("opentelemetry_java_agent")); dependencies.add("implementation", - "io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:" + versions - .get("opentelemetry_java_agent")); + "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:" + versions + .get("opentelemetry")); dependencies.add("implementation", "io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:" + versions - .get("opentelemetry_java_agent")); + .get("opentelemetry")); dependencies.add("implementation", dependencies.project(Map.of("path", ":javaagent-core"))); dependencies.add("implementation", dependencies.project(Map.of("path", ":filter-api"))); diff --git a/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java b/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java index 0595f1019..86e5f15f3 100644 --- a/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java +++ b/filter-api/src/main/java/org/hypertrace/agent/filter/FilterRegistry.java @@ -55,7 +55,11 @@ public static Filter getFilter() { if (filter == null) { try { FilterProviderConfig providerConfig = new FilterProviderConfig(); - filter = load(providerConfig, Collections.emptyList()); + filter = + load( + providerConfig, + Collections.emptyList(), + Thread.currentThread().getContextClassLoader()); } catch (Throwable t) { logger.error("Throwable thrown while loading filter jars", t); } @@ -72,17 +76,19 @@ public static Filter getFilter() { * @param providerConfig config needed by the filter (Eg. service name) * @param jarPaths paths to filter jar files. */ - public static void initialize(FilterProviderConfig providerConfig, List jarPaths) { + public static void initialize( + FilterProviderConfig providerConfig, List jarPaths, ClassLoader cl) { try { - filter = load(providerConfig, jarPaths); + filter = load(providerConfig, jarPaths, cl); } catch (Throwable t) { logger.error("Throwable thrown while loading filter jars", t); } } - private static Filter load(FilterProviderConfig providerConfig, List jarPaths) { - ClassLoader cl = loadJars(jarPaths); - ServiceLoader providers = ServiceLoader.load(FilterProvider.class, cl); + private static Filter load( + FilterProviderConfig providerConfig, List jarPaths, ClassLoader cl) { + ClassLoader newCl = loadJars(jarPaths, cl); + ServiceLoader providers = ServiceLoader.load(FilterProvider.class, newCl); List filters = new ArrayList<>(); for (FilterProvider provider : providers) { @@ -100,7 +106,7 @@ private static Filter load(FilterProviderConfig providerConfig, List jar return new MultiFilter(filters); } - private static ClassLoader loadJars(List jarPaths) { + private static ClassLoader loadJars(List jarPaths, ClassLoader cl) { URL[] urls = new URL[jarPaths.size()]; int i = 0; for (String jarPath : jarPaths) { @@ -112,7 +118,7 @@ private static ClassLoader loadJars(List jarPaths) { logger.warn(String.format("Malformed URL exception for jar on path: %s", jarPath), e); } } - return new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); + return new URLClassLoader(urls, cl); } public static String getProviderDisabledPropertyName(Class clazz) { diff --git a/gradle/java.gradle b/gradle/java.gradle index 53b15c8a9..588429738 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -51,10 +51,10 @@ ext { ], groovy : "org.codehaus.groovy:groovy-all:2.5.11", testLogging: [ - dependencies.create(group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'), - dependencies.create(group: 'org.slf4j', name: 'log4j-over-slf4j', version: '1.7.30'), - dependencies.create(group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.30'), - dependencies.create(group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.30'), + dependencies.create(group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.6'), + dependencies.create(group: 'org.slf4j', name: 'log4j-over-slf4j', version: '2.0.7'), + dependencies.create(group: 'org.slf4j', name: 'jcl-over-slf4j', version: '2.0.7'), + dependencies.create(group: 'org.slf4j', name: 'jul-to-slf4j', version: '2.0.7'), ] ] } diff --git a/instrumentation/apache-httpasyncclient-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpasyncclient/ApacheAsyncClientInstrumentationModule.java b/instrumentation/apache-httpasyncclient-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpasyncclient/ApacheAsyncClientInstrumentationModule.java index 9bc9c3916..7012b2777 100644 --- a/instrumentation/apache-httpasyncclient-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpasyncclient/ApacheAsyncClientInstrumentationModule.java +++ b/instrumentation/apache-httpasyncclient-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpasyncclient/ApacheAsyncClientInstrumentationModule.java @@ -16,9 +16,9 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.apachehttpasyncclient; +import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; -import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; diff --git a/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheClientInstrumentationModule.java b/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheClientInstrumentationModule.java index 2e50b281a..f3c6d8f79 100644 --- a/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheClientInstrumentationModule.java +++ b/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheClientInstrumentationModule.java @@ -25,10 +25,10 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import java.util.Arrays; import java.util.List; import net.bytebuddy.asm.Advice; diff --git a/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/HttpEntityInstrumentation.java b/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/HttpEntityInstrumentation.java index 42c7b78de..5ea2bf410 100644 --- a/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/HttpEntityInstrumentation.java +++ b/instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/HttpEntityInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.hypertrace.apachehttpclient.v4_0.ApacheHttpClientObjectRegistry.SpanAndAttributeKey; diff --git a/instrumentation/build.gradle.kts b/instrumentation/build.gradle.kts index 065d5736b..cd687806f 100644 --- a/instrumentation/build.gradle.kts +++ b/instrumentation/build.gradle.kts @@ -26,8 +26,15 @@ tasks { // Keep in sync with https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/f893ca540b72a895fbf18c14d2df8d1cabaf2c7f/instrumentation/instrumentation.gradle#L51 shadowJar { dependencies{ - // exclude core, it lives in the bootstrap classloader + // exclude packages that live in the bootstrap classloader exclude(project(":javaagent-core")) + exclude(project(":filter-api")) + exclude("io/opentelemetry/semconv/**") + exclude("io/opentelemetry/context/**") + exclude(dependency("io.opentelemetry:opentelemetry-api")) + exclude("io/opentelemetry/instrumentation/api/**") + // exclude bootstrap part of javaagent-extension-api + exclude("io/opentelemetry/javaagent/bootstrap/**") } mergeServiceFiles() diff --git a/instrumentation/grpc-1.6/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/grpc/v1_6/NettyHttp2HeadersInstrumentationModule.java b/instrumentation/grpc-1.6/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/grpc/v1_6/NettyHttp2HeadersInstrumentationModule.java index 13ce76c43..5fcc9fa5a 100644 --- a/instrumentation/grpc-1.6/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/grpc/v1_6/NettyHttp2HeadersInstrumentationModule.java +++ b/instrumentation/grpc-1.6/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/grpc/v1_6/NettyHttp2HeadersInstrumentationModule.java @@ -25,10 +25,10 @@ import io.grpc.Metadata; import io.netty.handler.codec.http2.Http2Headers; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import io.opentelemetry.javaagent.instrumentation.hypertrace.grpc.GrpcSemanticAttributes; import java.util.ArrayList; import java.util.Arrays; diff --git a/instrumentation/grpc-shaded-netty-1.9/src/main/java/io/opentelemetry/javaagent/instrumentation/shaded/netty/ShadedNettyUtilsInstrumentation.java b/instrumentation/grpc-shaded-netty-1.9/src/main/java/io/opentelemetry/javaagent/instrumentation/shaded/netty/ShadedNettyUtilsInstrumentation.java index e9e1d16cc..2ccdb93d3 100644 --- a/instrumentation/grpc-shaded-netty-1.9/src/main/java/io/opentelemetry/javaagent/instrumentation/shaded/netty/ShadedNettyUtilsInstrumentation.java +++ b/instrumentation/grpc-shaded-netty-1.9/src/main/java/io/opentelemetry/javaagent/instrumentation/shaded/netty/ShadedNettyUtilsInstrumentation.java @@ -24,9 +24,9 @@ import io.grpc.Metadata; import io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Headers; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import io.opentelemetry.javaagent.instrumentation.shaded.netty.utils.NettyUtils; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; diff --git a/instrumentation/java-streams/build.gradle.kts b/instrumentation/java-streams/build.gradle.kts index 84301e05e..948ede59a 100644 --- a/instrumentation/java-streams/build.gradle.kts +++ b/instrumentation/java-streams/build.gradle.kts @@ -22,6 +22,7 @@ afterEvaluate{ val versions: Map by extra dependencies { + implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") testImplementation(testFixtures(project(":testing-common"))) testImplementation("io.opentelemetry.javaagent:opentelemetry-muzzle:${versions["opentelemetry_java_agent"]}") } diff --git a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamInstrumentationModule.java b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamInstrumentationModule.java index 485504289..6e995e8cb 100644 --- a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamInstrumentationModule.java +++ b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamInstrumentationModule.java @@ -26,7 +26,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java index 9941b9239..67fb84eee 100644 --- a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java +++ b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/inputstream/InputStreamUtils.java @@ -21,7 +21,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; diff --git a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/outputstream/OutputStreamInstrumentationModule.java b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/outputstream/OutputStreamInstrumentationModule.java index f4c60c653..c4395bc12 100644 --- a/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/outputstream/OutputStreamInstrumentationModule.java +++ b/instrumentation/java-streams/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/outputstream/OutputStreamInstrumentationModule.java @@ -24,7 +24,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -40,10 +40,10 @@ /** * {@link OutputStream} instrumentation. The type matcher applies to all implementations. However - * only streams that are in the {@link io.opentelemetry.instrumentation.api.field.VirtualField} are + * only streams that are in the {@link io.opentelemetry.instrumentation.api.util.VirtualField} are * instrumented, otherwise the instrumentation is noop. * - *

If the stream is in the {@link io.opentelemetry.instrumentation.api.field.VirtualField} then + *

If the stream is in the {@link io.opentelemetry.instrumentation.api.util.VirtualField} then * arguments to write methods are also passed to the buffered stream (value) from the map. The * buffered stream is then used by other instrumentations to capture body. */ diff --git a/instrumentation/java-streams/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/ContextAccessorInstrumentationModule.java b/instrumentation/java-streams/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/ContextAccessorInstrumentationModule.java index 44eda98ff..6271c3cd6 100644 --- a/instrumentation/java-streams/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/ContextAccessorInstrumentationModule.java +++ b/instrumentation/java-streams/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/java/ContextAccessorInstrumentationModule.java @@ -20,7 +20,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/jaxrs-client-2.0/build.gradle.kts b/instrumentation/jaxrs-client-2.0/build.gradle.kts index 31d0c8358..2473e2037 100644 --- a/instrumentation/jaxrs-client-2.0/build.gradle.kts +++ b/instrumentation/jaxrs-client-2.0/build.gradle.kts @@ -32,12 +32,27 @@ val versions: Map by extra dependencies { api(project(":instrumentation:java-streams")) - testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-jaxrs-client-2.0-common:${versions["opentelemetry_java_agent_jaxrs"]}") + api("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-http-url-connection:1.24.0-alpha") compileOnly("javax.ws.rs:javax.ws.rs-api:2.0.1") - testImplementation(testFixtures(project(":testing-common"))) + testImplementation(testFixtures(project(":testing-common"))) testImplementation("org.glassfish.jersey.core:jersey-client:2.27") testImplementation("org.glassfish.jersey.inject:jersey-hk2:2.27") testImplementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:${versions["opentelemetry_semconv"]}") + + testImplementation(project(":instrumentation:apache-httpclient-4.0")) + testImplementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-apache-httpclient-4.0:${versions["opentelemetry_java_agent"]}") + testImplementation("org.jboss.resteasy:resteasy-client:3.0.5.Final") + // ^ This version has timeouts https://issues.redhat.com/browse/RESTEASY-975 + testImplementation("org.apache.cxf:cxf-rt-rs-client:3.1.0") + // Doesn't work with CXF 3.0.x because their context is wrong: + // https://github.com/apache/cxf/commit/335c7bad2436f08d6d54180212df5a52157c9f21 + + testImplementation("javax.xml.bind:jaxb-api:2.2.3") + + testImplementation("org.glassfish.jersey.inject:jersey-hk2:2.+") + testImplementation("org.glassfish.jersey.core:jersey-client:2.+") + testImplementation("org.jboss.resteasy:resteasy-client:3.0.26.Final") + testImplementation("org.apache.cxf:cxf-rt-rs-client:3.+") } diff --git a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyCaptureFilter.java b/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyCaptureFilter.java deleted file mode 100644 index 51688d08b..000000000 --- a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyCaptureFilter.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.jaxrs.v2_0; - -import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import javax.ws.rs.client.ClientRequestContext; -import javax.ws.rs.client.ClientRequestFilter; -import javax.ws.rs.client.ClientResponseContext; -import javax.ws.rs.client.ClientResponseFilter; -import javax.ws.rs.core.MultivaluedMap; -import org.hypertrace.agent.core.config.InstrumentationConfig; -import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class JaxrsClientBodyCaptureFilter implements ClientRequestFilter, ClientResponseFilter { - - private static final Logger log = LoggerFactory.getLogger(JaxrsClientBodyCaptureFilter.class); - private static final InstrumentationConfig instrumentationConfig = - InstrumentationConfig.ConfigProvider.get(); - /** TODO find a better way to access this */ - public static final String OTEL_CONTEXT_PROPERTY_NAME = "io.opentelemetry.javaagent.context"; - /** - * In certain contexts, like reading HTTP client entities, the body will be read after the OTEL - * context has been removed from the carrier. In order to mitigate this, we re-store a reference - * to the object under a different property key and remove it when it is no longer needed - */ - public static final String HYPERTRACE_CONTEXT_PROPERTY_NAME = "org.hypertrace.javaagent.context"; - - @Override - public void filter(ClientRequestContext requestContext) { - Object contextObj = requestContext.getProperty(OTEL_CONTEXT_PROPERTY_NAME); - if (!(contextObj instanceof Context)) { - return; - } - requestContext.setProperty(HYPERTRACE_CONTEXT_PROPERTY_NAME, contextObj); - - Context currentContext = (Context) contextObj; - Span currentSpan = Span.fromContext(currentContext); - - try { - if (instrumentationConfig.httpHeaders().request()) { - captureHeaders( - currentSpan, - HypertraceSemanticAttributes::httpRequestHeader, - requestContext.getStringHeaders()); - } - } catch (Exception ex) { - log.error("Exception while getting request headers", ex); - } - } - - @Override - public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) { - Object contextObj = requestContext.getProperty(OTEL_CONTEXT_PROPERTY_NAME); - if (!(contextObj instanceof Context)) { - return; - } - - Context currentContext = (Context) contextObj; - Span currentSpan = Span.fromContext(currentContext); - - try { - if (instrumentationConfig.httpHeaders().response()) { - captureHeaders( - currentSpan, - HypertraceSemanticAttributes::httpResponseHeader, - responseContext.getHeaders()); - } - } catch (Exception ex) { - log.error("Exception while getting response headers", ex); - } - } - - private static void captureHeaders( - Span span, - Function> keySupplier, - MultivaluedMap headers) { - for (Map.Entry> entry : headers.entrySet()) { - for (Object value : entry.getValue()) { - span.setAttribute(keySupplier.apply(entry.getKey()), value.toString()); - } - } - } -} diff --git a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationModule.java b/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationModule.java deleted file mode 100644 index 4b51b8384..000000000 --- a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationModule.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.jaxrs.v2_0; - -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.returns; - -import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.field.VirtualField; -import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; -import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Collections; -import java.util.List; -import javax.ws.rs.client.Client; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.implementation.bytecode.assign.Assigner; -import net.bytebuddy.matcher.ElementMatcher; -import org.hypertrace.agent.core.instrumentation.SpanAndBuffer; -import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; - -@AutoService(InstrumentationModule.class) -public class JaxrsClientBodyInstrumentationModule extends InstrumentationModule { - - public JaxrsClientBodyInstrumentationModule() { - super(JaxrsClientBodyInstrumentationName.PRIMARY, JaxrsClientBodyInstrumentationName.OTHER); - } - - @Override - public List typeInstrumentations() { - return Collections.singletonList(new JaxrsClientBuilderInstrumentation()); - } - - class JaxrsClientBuilderInstrumentation implements TypeInstrumentation { - - @Override - public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("javax.ws.rs.client.ClientBuilder"); - } - - @Override - public ElementMatcher typeMatcher() { - return extendsClass(named("javax.ws.rs.client.ClientBuilder")); - } - - @Override - public void transform(TypeTransformer transformer) { - - transformer.applyAdviceToMethod( - named("build").and(returns(implementsInterface(named("javax.ws.rs.client.Client")))), - JaxrsClientBodyInstrumentationModule.class.getName() + "$ClientBuilder_build_Advice"); - } - } - - static class ClientBuilder_build_Advice { - @Advice.OnMethodExit - public static void registerFeature( - @Advice.Return(typing = Assigner.Typing.DYNAMIC) Client client) { - // Register on the generated client instead of the builder - // The build() can be called multiple times and is not thread safe - // A client is only created once - // Use lowest priority to run after OTEL filter that controls lifecycle of span - client.register(JaxrsClientBodyCaptureFilter.class, Integer.MIN_VALUE); - client.register( - new JaxrsClientEntityInterceptor( - VirtualField.find(InputStream.class, SpanAndBuffer.class), - VirtualField.find(OutputStream.class, BoundedByteArrayOutputStream.class))); - } - } -} diff --git a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationName.java b/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationName.java deleted file mode 100644 index a68292082..000000000 --- a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationName.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.jaxrs.v2_0; - -public class JaxrsClientBodyInstrumentationName { - public static final String PRIMARY = "jaxrs-client"; - public static final String[] OTHER = { - "jaxrs-client-2.0", "ht", "jaxrs-client-ht", "jaxrs-client-2.0-ht" - }; -} diff --git a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientEntityInterceptor.java b/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientEntityInterceptor.java deleted file mode 100644 index 1b1fe4e11..000000000 --- a/instrumentation/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientEntityInterceptor.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.jaxrs.v2_0; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.field.VirtualField; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.charset.Charset; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.ReaderInterceptor; -import javax.ws.rs.ext.ReaderInterceptorContext; -import javax.ws.rs.ext.WriterInterceptor; -import javax.ws.rs.ext.WriterInterceptorContext; -import org.hypertrace.agent.core.config.InstrumentationConfig; -import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; -import org.hypertrace.agent.core.instrumentation.SpanAndBuffer; -import org.hypertrace.agent.core.instrumentation.buffer.BoundedBuffersFactory; -import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; -import org.hypertrace.agent.core.instrumentation.utils.ContentLengthUtils; -import org.hypertrace.agent.core.instrumentation.utils.ContentTypeCharsetUtils; -import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class JaxrsClientEntityInterceptor implements ReaderInterceptor, WriterInterceptor { - - private static final Logger log = LoggerFactory.getLogger(JaxrsClientEntityInterceptor.class); - private static final InstrumentationConfig instrumentationConfig = - InstrumentationConfig.ConfigProvider.get(); - - private final VirtualField inputStreamContextStore; - private final VirtualField outputStreamContextStore; - - public JaxrsClientEntityInterceptor( - VirtualField inputStreamContextStore, - VirtualField outputStreamContextStore) { - this.inputStreamContextStore = inputStreamContextStore; - this.outputStreamContextStore = outputStreamContextStore; - } - - /** Writing response body to input stream */ - @Override - public Object aroundReadFrom(ReaderInterceptorContext responseContext) - throws IOException, WebApplicationException { - Object contextObj = - responseContext.getProperty(JaxrsClientBodyCaptureFilter.HYPERTRACE_CONTEXT_PROPERTY_NAME); - responseContext.removeProperty(JaxrsClientBodyCaptureFilter.HYPERTRACE_CONTEXT_PROPERTY_NAME); - - MediaType mediaType = responseContext.getMediaType(); - if (mediaType == null - || !ContentTypeUtils.shouldCapture(mediaType.toString()) - || !instrumentationConfig.httpBody().response()) { - return responseContext.proceed(); - } - - if (!(contextObj instanceof Context)) { - log.error( - "Span object is not present in the context properties, response object will not be captured"); - return responseContext.proceed(); - } - Context context = (Context) contextObj; - Span currentSpan = Span.fromContext(context); - - // TODO as optimization the type could be checked here and if it is a primitive type e.g. String - // it could be read directly. - // context.getType(); - - InputStream entityStream = responseContext.getInputStream(); - Object entity = null; - try { - String contentLengthStr = responseContext.getHeaders().getFirst(HttpHeaders.CONTENT_LENGTH); - int contentLength = ContentLengthUtils.parseLength(contentLengthStr); - - String charsetStr = null; - if (mediaType != null) { - charsetStr = mediaType.getParameters().get(MediaType.CHARSET_PARAMETER); - } - Charset charset = ContentTypeCharsetUtils.toCharset(charsetStr); - - BoundedByteArrayOutputStream buffer = - BoundedBuffersFactory.createStream(contentLength, charset); - - inputStreamContextStore.set( - entityStream, - new SpanAndBuffer( - currentSpan, buffer, HypertraceSemanticAttributes.HTTP_RESPONSE_BODY, charset)); - - entity = responseContext.proceed(); - } catch (Exception ex) { - log.error("Exception while capturing response body", ex); - } - return entity; - } - - /** Writing request body to output stream */ - @Override - public void aroundWriteTo(WriterInterceptorContext requestContext) - throws IOException, WebApplicationException { - - Object contextObj = - requestContext.getProperty(JaxrsClientBodyCaptureFilter.OTEL_CONTEXT_PROPERTY_NAME); - if (!(contextObj instanceof Context)) { - log.error( - "Span object is not present in the context properties, request body will not be captured"); - requestContext.proceed(); - return; - } - Context context = (Context) contextObj; - Span currentSpan = Span.fromContext(context); - - if (instrumentationConfig.httpBody().request()) { - MediaType mediaType = requestContext.getMediaType(); - if (mediaType == null || !ContentTypeUtils.shouldCapture(mediaType.toString())) { - requestContext.proceed(); - return; - } - } - - MediaType mediaType = requestContext.getMediaType(); - String charsetStr = null; - if (mediaType != null) { - charsetStr = mediaType.getParameters().get(MediaType.CHARSET_PARAMETER); - } - Charset charset = ContentTypeCharsetUtils.toCharset(charsetStr); - - // TODO length is not known - BoundedByteArrayOutputStream buffer = BoundedBuffersFactory.createStream(charset); - OutputStream entityStream = requestContext.getOutputStream(); - try { - outputStreamContextStore.set(entityStream, buffer); - requestContext.proceed(); - } catch (Exception ex) { - log.error("Failed to capture request body", ex); - } finally { - outputStreamContextStore.set(entityStream, null); - currentSpan.setAttribute( - HypertraceSemanticAttributes.HTTP_REQUEST_BODY, buffer.toStringWithSuppliedCharset()); - } - } -} diff --git a/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsAsyncClientBodyInstrumentationTest.java b/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsAsyncClientBodyInstrumentationTest.java index b0e6ba494..b152f10da 100644 --- a/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsAsyncClientBodyInstrumentationTest.java +++ b/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsAsyncClientBodyInstrumentationTest.java @@ -65,8 +65,8 @@ public Response doPostRequest( @Override public Response doGetRequest(String uri, Map headers) throws ExecutionException, InterruptedException { - ClientBuilder clientBuilder = ClientBuilder.newBuilder(); - Client client = clientBuilder.build(); + + Client client = ClientBuilder.newClient(); Invocation.Builder builder = client.target(uri).request(); diff --git a/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationTest.java b/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationTest.java index e4975ba42..912e4f912 100644 --- a/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationTest.java +++ b/instrumentation/jaxrs-client-2.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/jaxrs/v2_0/JaxrsClientBodyInstrumentationTest.java @@ -26,7 +26,7 @@ public class JaxrsClientBodyInstrumentationTest extends AbstractHttpClientTest { - private static final Client client = ClientBuilder.newBuilder().build(); + private static final Client client = ClientBuilder.newClient(); public JaxrsClientBodyInstrumentationTest() { super(true); diff --git a/instrumentation/netty/netty-4.0/build.gradle.kts b/instrumentation/netty/netty-4.0/build.gradle.kts index 8102439ed..e0470460e 100644 --- a/instrumentation/netty/netty-4.0/build.gradle.kts +++ b/instrumentation/netty/netty-4.0/build.gradle.kts @@ -47,6 +47,7 @@ val nettyVersion = "4.0.38.Final" dependencies { implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.0:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4-common:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.instrumentation:opentelemetry-netty-4-common:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry:opentelemetry-semconv:${versions["opentelemetry_semconv"]}") implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:${versions["opentelemetry_semconv"]}") compileOnly("io.netty:netty-codec-http:${nettyVersion}") { diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerBlockingRequestHandler.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerBlockingRequestHandler.java index 294ef0a9c..68a0b0010 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerBlockingRequestHandler.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/server/HttpServerBlockingRequestHandler.java @@ -28,8 +28,8 @@ import io.netty.util.ReferenceCountUtil; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_0.AttributeKeys; -import io.opentelemetry.javaagent.instrumentation.netty.common.HttpRequestAndChannel; import java.util.Map; import org.hypertrace.agent.filter.FilterRegistry; diff --git a/instrumentation/netty/netty-4.1/build.gradle.kts b/instrumentation/netty/netty-4.1/build.gradle.kts index 88c503893..e9d416987 100644 --- a/instrumentation/netty/netty-4.1/build.gradle.kts +++ b/instrumentation/netty/netty-4.1/build.gradle.kts @@ -44,8 +44,10 @@ val versions: Map by extra dependencies { implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4-common:${versions["opentelemetry_java_agent"]}") - implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.1-common:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.instrumentation:opentelemetry-netty-common:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.instrumentation:opentelemetry-netty-4-common:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry.javaagent.instrumentation:opentelemetry-javaagent-netty-4.1:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.instrumentation:opentelemetry-netty-4.1:${versions["opentelemetry_java_agent"]}") implementation("io.opentelemetry:opentelemetry-semconv:${versions["opentelemetry_semconv"]}") implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:${versions["opentelemetry_semconv"]}") library("io.netty:netty-codec-http:4.1.0.Final") diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/AttributeKeys.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/AttributeKeys.java index 1d4af58f4..d500054bf 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/AttributeKeys.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/AttributeKeys.java @@ -34,5 +34,5 @@ public class AttributeKeys { public static final AttributeKey REQUEST = AttributeKey.valueOf( - "io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyServerSingletons#http-server-request"); + "io.opentelemetry.instrumentation.netty.v4_1.internal.server.HttpServerRequestTracingHandler#http-server-request"); } diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyChannelPipelineInstrumentation.java index bd6561046..6bf6fd483 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/NettyChannelPipelineInstrumentation.java @@ -40,6 +40,7 @@ import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.server.HttpServerRequestTracingHandler; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.server.HttpServerResponseTracingHandler; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.server.HttpServerTracingHandler; +import io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyClientSingletons; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -102,7 +103,7 @@ public static void addHandler( // replace OTEL response handler because it closes request span before body (especially // chunked) is captured pipeline.replace( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerTracingHandler + io.opentelemetry.instrumentation.netty.v4_1.internal.server.HttpServerTracingHandler .class .getName(), HttpServerTracingHandler.class.getName(), @@ -110,11 +111,11 @@ public static void addHandler( pipeline.addBefore( HttpServerTracingHandler.class.getName(), - io.opentelemetry.javaagent.instrumentation.netty.v4_1.server + io.opentelemetry.instrumentation.netty.v4_1.internal.server .HttpServerRequestTracingHandler.class .getName(), - new io.opentelemetry.javaagent.instrumentation.netty.v4_1.server - .HttpServerRequestTracingHandler()); + new io.opentelemetry.instrumentation.netty.v4_1.internal.server + .HttpServerRequestTracingHandler(NettyClientSingletons.instrumenter())); pipeline.addLast( HttpServerBlockingRequestHandler.class.getName(), @@ -125,7 +126,7 @@ public static void addHandler( new HttpServerRequestTracingHandler()); } else if (handler instanceof HttpResponseEncoder) { pipeline.replace( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.server + io.opentelemetry.instrumentation.netty.v4_1.internal.server .HttpServerResponseTracingHandler.class .getName(), HttpServerResponseTracingHandler.class.getName(), @@ -137,7 +138,7 @@ public static void addHandler( // Client pipeline handlers if (handler instanceof HttpClientCodec) { pipeline.replace( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.HttpClientTracingHandler + io.opentelemetry.instrumentation.netty.v4_1.internal.client.HttpClientTracingHandler .class .getName(), HttpClientTracingHandler.class.getName(), @@ -146,18 +147,18 @@ public static void addHandler( // add OTEL request handler to start spans pipeline.addAfter( HttpClientTracingHandler.class.getName(), - io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.HttpClientTracingHandler + io.opentelemetry.instrumentation.netty.v4_1.internal.client.HttpClientTracingHandler .class .getName(), - new io.opentelemetry.javaagent.instrumentation.netty.v4_1.client - .HttpClientRequestTracingHandler()); + new io.opentelemetry.instrumentation.netty.v4_1.internal.client + .HttpClientRequestTracingHandler(NettyClientSingletons.instrumenter())); } else if (handler instanceof HttpRequestEncoder) { pipeline.addLast( HttpClientRequestTracingHandler.class.getName(), new HttpClientRequestTracingHandler()); } else if (handler instanceof HttpResponseDecoder) { pipeline.replace( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.client + io.opentelemetry.instrumentation.netty.v4_1.internal.client .HttpClientResponseTracingHandler.class .getName(), HttpClientResponseTracingHandler.class.getName(), diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientRequestTracingHandler.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientRequestTracingHandler.java index 18aeb632d..12e29864d 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientRequestTracingHandler.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientRequestTracingHandler.java @@ -51,8 +51,7 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) { Channel channel = ctx.channel(); Context context = channel - .attr( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys.CLIENT_CONTEXT) + .attr(io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys.CLIENT_CONTEXT) .get(); if (context == null) { ctx.write(msg, prm); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientResponseTracingHandler.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientResponseTracingHandler.java index 07e06ba9a..c056b47bf 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientResponseTracingHandler.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientResponseTracingHandler.java @@ -31,7 +31,7 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils; -import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyClientSingletons; +import io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyClientSingletons; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.nio.charset.Charset; import java.util.Map; @@ -53,8 +53,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { Channel channel = ctx.channel(); Context context = channel - .attr( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys.CLIENT_CONTEXT) + .attr(io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys.CLIENT_CONTEXT) .get(); if (context == null) { ctx.fireChannelRead(msg); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerBlockingRequestHandler.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerBlockingRequestHandler.java index 559eb71bc..01426c5e7 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerBlockingRequestHandler.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerBlockingRequestHandler.java @@ -28,8 +28,8 @@ import io.netty.util.ReferenceCountUtil; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.netty.v4.common.HttpRequestAndChannel; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys; -import io.opentelemetry.javaagent.instrumentation.netty.common.HttpRequestAndChannel; import java.util.Map; import org.hypertrace.agent.filter.FilterRegistry; @@ -40,8 +40,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { Channel channel = ctx.channel(); Context context = channel - .attr( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys.SERVER_CONTEXT) + .attr(io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys.SERVER_CONTEXT) .get(); if (context == null) { ctx.fireChannelRead(msg); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerRequestTracingHandler.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerRequestTracingHandler.java index ab7d18acc..30ba443c0 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerRequestTracingHandler.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerRequestTracingHandler.java @@ -50,8 +50,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { Channel channel = ctx.channel(); Context context = channel - .attr( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys.SERVER_CONTEXT) + .attr(io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys.SERVER_CONTEXT) .get(); if (context == null) { ctx.fireChannelRead(msg); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerResponseTracingHandler.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerResponseTracingHandler.java index 543837049..f5ddfe8ba 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerResponseTracingHandler.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/server/HttpServerResponseTracingHandler.java @@ -31,7 +31,7 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.AttributeKeys; import io.opentelemetry.javaagent.instrumentation.hypertrace.netty.v4_1.DataCaptureUtils; -import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.NettyServerSingletons; +import io.opentelemetry.javaagent.instrumentation.netty.v4_1.NettyServerSingletons; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import java.nio.charset.Charset; import java.util.Map; @@ -52,8 +52,7 @@ public class HttpServerResponseTracingHandler extends ChannelOutboundHandlerAdap public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) { Context context = ctx.channel() - .attr( - io.opentelemetry.javaagent.instrumentation.netty.v4_1.AttributeKeys.SERVER_CONTEXT) + .attr(io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys.SERVER_CONTEXT) .get(); if (context == null) { ctx.write(msg, prm); diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet30AndFilterInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet30AndFilterInstrumentation.java index b76f135d1..371e2581f 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet30AndFilterInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet30AndFilterInstrumentation.java @@ -25,10 +25,10 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; import java.io.BufferedReader; import java.io.PrintWriter; import java.util.Collections; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java index 3c271ca11..7176a416d 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java @@ -17,7 +17,7 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/BodyCaptureAsyncListener.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/BodyCaptureAsyncListener.java index 4b48fc46b..41cb69fd1 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/BodyCaptureAsyncListener.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/BodyCaptureAsyncListener.java @@ -17,7 +17,7 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.async; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Utils; import io.opentelemetry.javaagent.instrumentation.servlet.ServletAsyncListener; import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/Servlet30AsyncInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/Servlet30AsyncInstrumentation.java index 3c106f281..f36281d4b 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/Servlet30AsyncInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/async/Servlet30AsyncInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.servlet.ServletHelper; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamInstrumentation.java index 2b7d9ebb9..ad12db59a 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.IOException; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java index b701924e3..1eda82a3a 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java @@ -19,7 +19,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasSuperType; import static net.bytebuddy.matcher.ElementMatchers.*; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.BufferedReader; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamInstrumentation.java index b23f390e8..670b41660 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.IOException; diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java index 79d2671ba..61b1708b2 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.PrintWriter; diff --git a/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamContextAccessInstrumentationModule.java b/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamContextAccessInstrumentationModule.java index 894c2bac6..7ce37e038 100644 --- a/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamContextAccessInstrumentationModule.java +++ b/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletInputStreamContextAccessInstrumentationModule.java @@ -20,7 +20,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamContextAccessInstrumentationModule.java b/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamContextAccessInstrumentationModule.java index d8fc64539..dbcaaa039 100644 --- a/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamContextAccessInstrumentationModule.java +++ b/instrumentation/servlet/servlet-3.0/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletOutputStreamContextAccessInstrumentationModule.java @@ -20,7 +20,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java index c97a0a4e7..f3dcfafec 100644 --- a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java +++ b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.BufferedReader; diff --git a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterInstrumentation.java b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterInstrumentation.java index 9e4a89b4f..cda0ca824 100644 --- a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterInstrumentation.java +++ b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.io.IOException; diff --git a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderContextAccessInstrumentationModule.java b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderContextAccessInstrumentationModule.java index 514d73029..53e7fa8bb 100644 --- a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderContextAccessInstrumentationModule.java +++ b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderContextAccessInstrumentationModule.java @@ -18,7 +18,7 @@ import static net.bytebuddy.matcher.ElementMatchers.*; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterContextAccessInstrumentationModule.java b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterContextAccessInstrumentationModule.java index 51221f998..efa418b92 100644 --- a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterContextAccessInstrumentationModule.java +++ b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/writer/PrintWriterContextAccessInstrumentationModule.java @@ -20,7 +20,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/spring/spring-webflux-5.0/build.gradle.kts b/instrumentation/spring/spring-webflux-5.0/build.gradle.kts index 4b2ba1bcf..8596cc961 100644 --- a/instrumentation/spring/spring-webflux-5.0/build.gradle.kts +++ b/instrumentation/spring/spring-webflux-5.0/build.gradle.kts @@ -6,6 +6,14 @@ plugins { val versions: Map by extra +configurations.testRuntimeClasspath { + // We have newer version of slf4j but spring5 uses older versions + resolutionStrategy { + force("ch.qos.logback:logback-classic:1.2.11") + force("org.slf4j:slf4j-api:1.7.36") + } +} + dependencies { testImplementation(testFixtures(project(":testing-common"))) testImplementation(project(":instrumentation:netty:netty-4.1")) diff --git a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/StreamSourceChannelInstrumentation.java b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/StreamSourceChannelInstrumentation.java index bd467ba60..c9852788e 100644 --- a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/StreamSourceChannelInstrumentation.java +++ b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/StreamSourceChannelInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers; diff --git a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/UndertowHttpServerExchangeInstrumentation.java b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/UndertowHttpServerExchangeInstrumentation.java index 546726fb1..57365b125 100644 --- a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/UndertowHttpServerExchangeInstrumentation.java +++ b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/UndertowHttpServerExchangeInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.hypertrace.undertow.common.RequestBodyCaptureMethod; diff --git a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/utils/Utils.java b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/utils/Utils.java index 5d5ef0504..f42f23f14 100644 --- a/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/utils/Utils.java +++ b/instrumentation/undertow/undertow-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/v1_4/utils/Utils.java @@ -17,7 +17,7 @@ package io.opentelemetry.javaagent.instrumentation.hypertrace.undertow.v1_4.utils; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.instrumentation.undertow.UndertowSingletons; import io.undertow.server.HttpServerExchange; import io.undertow.util.Headers; diff --git a/instrumentation/undertow/undertow-servlet-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/servlet/v1_4/UndertowHttpServletRequestInstrumentation.java b/instrumentation/undertow/undertow-servlet-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/servlet/v1_4/UndertowHttpServletRequestInstrumentation.java index ca8c20e6b..597fd2992 100644 --- a/instrumentation/undertow/undertow-servlet-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/servlet/v1_4/UndertowHttpServletRequestInstrumentation.java +++ b/instrumentation/undertow/undertow-servlet-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/undertow/servlet/v1_4/UndertowHttpServletRequestInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.hypertrace.undertow.common.RequestBodyCaptureMethod; diff --git a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestHandleInstrumentation.java b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestHandleInstrumentation.java index 415d0e112..0cc261770 100644 --- a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestHandleInstrumentation.java +++ b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestHandleInstrumentation.java @@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.vertx.client.Contexts; diff --git a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestInstrumentation.java b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestInstrumentation.java index c070384e7..02c60d0f0 100644 --- a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestInstrumentation.java +++ b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestInstrumentation.java @@ -25,7 +25,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.vertx.client.Contexts; diff --git a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpResponseInstrumentation.java b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpResponseInstrumentation.java index fac690dcc..e70389c4e 100644 --- a/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpResponseInstrumentation.java +++ b/instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpResponseInstrumentation.java @@ -23,7 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.instrumentation.api.field.VirtualField; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.vertx.core.Handler; diff --git a/javaagent-bootstrap/build.gradle.kts b/javaagent-bootstrap/build.gradle.kts index be4a98145..822f06a6f 100644 --- a/javaagent-bootstrap/build.gradle.kts +++ b/javaagent-bootstrap/build.gradle.kts @@ -8,7 +8,7 @@ val versions: Map by extra dependencies{ api("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}") - api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}") + api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") api("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") implementation(project(":javaagent-core")) implementation(project(":filter-api")) diff --git a/javaagent-core/build.gradle.kts b/javaagent-core/build.gradle.kts index fc96bd393..67b5af426 100644 --- a/javaagent-core/build.gradle.kts +++ b/javaagent-core/build.gradle.kts @@ -7,7 +7,7 @@ val versions: Map by extra dependencies { api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}") - api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}") + api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3") { constraints { diff --git a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/DataCaptureConfig.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/DataCaptureConfig.java index 2b8b66026..394cb473e 100644 --- a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/DataCaptureConfig.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/DataCaptureConfig.java @@ -39,8 +39,8 @@ class ConfigProvider { * * @return */ - private static DataCaptureConfig load() { - ServiceLoader configs = ServiceLoader.load(DataCaptureConfig.class); + private static DataCaptureConfig load(ClassLoader cl) { + ServiceLoader configs = ServiceLoader.load(DataCaptureConfig.class, cl); Iterator iterator = configs.iterator(); if (!iterator.hasNext()) { logger.error("Failed to load data capture config"); @@ -52,11 +52,22 @@ private static DataCaptureConfig load() { /** * @return an implementation of the DataCaptureConfig interface, or null if one cannot be found */ + public static DataCaptureConfig get(ClassLoader cl) { + if (dataCaptureConfig == null) { + synchronized (ConfigProvider.class) { + if (dataCaptureConfig == null) { + dataCaptureConfig = load(cl); + } + } + } + return dataCaptureConfig; + } + public static DataCaptureConfig get() { if (dataCaptureConfig == null) { synchronized (ConfigProvider.class) { if (dataCaptureConfig == null) { - dataCaptureConfig = load(); + dataCaptureConfig = load(Thread.currentThread().getContextClassLoader()); } } } diff --git a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/InstrumentationConfig.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/InstrumentationConfig.java index 9aec3fe57..ee8e3adb6 100644 --- a/javaagent-core/src/main/java/org/hypertrace/agent/core/config/InstrumentationConfig.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/config/InstrumentationConfig.java @@ -75,9 +75,9 @@ public static void reset() { } } - private static InstrumentationConfig load() { + private static InstrumentationConfig load(ClassLoader cl) { ServiceLoader configs = - ServiceLoader.load(InstrumentationConfig.class); + ServiceLoader.load(InstrumentationConfig.class, cl); Iterator iterator = configs.iterator(); if (!iterator.hasNext()) { logger.error("Failed to load instrumentation config"); @@ -86,11 +86,22 @@ private static InstrumentationConfig load() { return iterator.next(); } + public static InstrumentationConfig get(ClassLoader cl) { + if (instrumentationConfig == null) { + synchronized (ConfigProvider.class) { + if (instrumentationConfig == null) { + instrumentationConfig = load(cl); + } + } + } + return instrumentationConfig; + } + public static InstrumentationConfig get() { if (instrumentationConfig == null) { synchronized (ConfigProvider.class) { if (instrumentationConfig == null) { - instrumentationConfig = load(); + instrumentationConfig = load(Thread.currentThread().getContextClassLoader()); } } } diff --git a/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/CallDepth.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/CallDepth.java index be8d7e790..9b6a4db1b 100644 --- a/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/CallDepth.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/CallDepth.java @@ -16,10 +16,7 @@ package org.hypertrace.agent.core.instrumentation; -/** - * Copy of the upstream {@link io.opentelemetry.javaagent.instrumentation.api.CallDepth} because we - * need access to the package-private reset method. - */ +/** Copy of the upstream CallDepth because we need access to the package-private reset method. */ public class CallDepth { private int depth; diff --git a/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/HypertraceCallDepthThreadLocalMap.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/HypertraceCallDepthThreadLocalMap.java index b207e13e0..df7376bb7 100644 --- a/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/HypertraceCallDepthThreadLocalMap.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/HypertraceCallDepthThreadLocalMap.java @@ -23,7 +23,7 @@ *

The copy is needed because in some cases Hypertrace instrumentation wants to use the same * class as a key to the map. * - *

see {@link io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap}. + *

see CallDepthThreadLocalMap. */ public class HypertraceCallDepthThreadLocalMap { private static final ClassValue TLS = diff --git a/javaagent-tooling/build.gradle.kts b/javaagent-tooling/build.gradle.kts index def0099f9..20fe6f63a 100644 --- a/javaagent-tooling/build.gradle.kts +++ b/javaagent-tooling/build.gradle.kts @@ -17,7 +17,7 @@ repositories { dependencies { instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-muzzle:${versions["opentelemetry_java_agent"]}") - api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}") + api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") instrumentationMuzzle("io.opentelemetry.instrumentation:gradle-plugins:${versions["opentelemetry_gradle_plugin"]}") instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}") instrumentationMuzzle("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") diff --git a/otel-extensions/build.gradle.kts b/otel-extensions/build.gradle.kts index 69f47d9bc..b1f30f8bf 100644 --- a/otel-extensions/build.gradle.kts +++ b/otel-extensions/build.gradle.kts @@ -31,14 +31,14 @@ dependencies { compileOnly("io.opentelemetry:opentelemetry-sdk:${versions["opentelemetry"]}") compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${versions["opentelemetry"]}-alpha") - compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:${versions["opentelemetry"]}-alpha") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:${versions["opentelemetry"]}") implementation("io.opentelemetry:opentelemetry-semconv:${versions["opentelemetry"]}-alpha") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") - implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry_java_agent"]}") + implementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:${versions["opentelemetry_java_agent-tooling"]}") { constraints { - implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9:1.7.2-alpha") { + implementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9:${versions["opentelemetry_java_agent-tooling"]}") { attributes { // this transitive dependency creates classes compatible with Java 9 and up, but is only referenced in safe ways for // java 8 by the javaagent-tooling dependency @@ -46,6 +46,7 @@ dependencies { } } } + exclude("io.opentelemetry.javaagent", "opentelemetry-javaagent-bootstrap") } implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/FilterComponentInstaller.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/FilterComponentInstaller.java index 06d2afd84..d4fa39559 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/FilterComponentInstaller.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/FilterComponentInstaller.java @@ -17,8 +17,8 @@ package org.hypertrace.agent.otel.extensions; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.config.Config; -import io.opentelemetry.javaagent.extension.AgentListener; +import com.google.protobuf.StringValue; +import io.opentelemetry.javaagent.tooling.BeforeAgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.util.List; import java.util.stream.Collectors; @@ -27,21 +27,20 @@ import org.hypertrace.agent.filter.spi.FilterProviderConfig; import org.hypertrace.agent.otel.extensions.config.HypertraceConfig; -@AutoService(AgentListener.class) -public class FilterComponentInstaller implements AgentListener { +@AutoService(BeforeAgentListener.class) +public class FilterComponentInstaller implements BeforeAgentListener { @Override - public void beforeAgent( - Config config, AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { + public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { FilterProviderConfig providerConfig = new FilterProviderConfig(); AgentConfig agentConfig = HypertraceConfig.get(); String serviceName = agentConfig.getServiceName().getValue(); providerConfig.setServiceName(serviceName); List jarPaths = agentConfig.getJavaagent().getFilterJarPathsList().stream() - .map(r -> r.getValue()) + .map(StringValue::getValue) .collect(Collectors.toList()); // resolves filter via service loader resolution - FilterRegistry.initialize(providerConfig, jarPaths); + FilterRegistry.initialize(providerConfig, jarPaths, getClass().getClassLoader()); } } diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceBootstrapPackagesProvider.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceBootstrapPackagesProvider.java index b9c66811b..7173726d9 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceBootstrapPackagesProvider.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceBootstrapPackagesProvider.java @@ -17,15 +17,16 @@ package org.hypertrace.agent.otel.extensions; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesBuilder; import io.opentelemetry.javaagent.tooling.bootstrap.BootstrapPackagesConfigurer; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(BootstrapPackagesConfigurer.class) public class HypertraceBootstrapPackagesProvider implements BootstrapPackagesConfigurer { @Override - public void configure(Config config, BootstrapPackagesBuilder builder) { - builder.add("org.hypertrace.agent"); + public void configure( + BootstrapPackagesBuilder bootstrapPackagesBuilder, ConfigProperties configProperties) { + bootstrapPackagesBuilder.add("org.hypertrace.agent"); } } diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceGlobalIgnoreMatcher.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceGlobalIgnoreMatcher.java index fb671004a..fac88a856 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceGlobalIgnoreMatcher.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/HypertraceGlobalIgnoreMatcher.java @@ -17,16 +17,17 @@ package org.hypertrace.agent.otel.extensions; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.config.Config; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesBuilder; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @AutoService(IgnoredTypesConfigurer.class) public class HypertraceGlobalIgnoreMatcher implements IgnoredTypesConfigurer { @Override - public void configure(Config config, IgnoredTypesBuilder builder) { - builder + public void configure( + IgnoredTypesBuilder ignoredTypesBuilder, ConfigProperties configProperties) { + ignoredTypesBuilder // ignored profiler classes .ignoreClass("com.yourkit") // allowed java io classes diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/DataCaptureConfigInstaller.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/DataCaptureConfigInstaller.java index 7841546dc..f35567fe1 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/DataCaptureConfigInstaller.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/DataCaptureConfigInstaller.java @@ -17,18 +17,16 @@ package org.hypertrace.agent.otel.extensions.config; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.config.Config; -import io.opentelemetry.javaagent.extension.AgentListener; +import io.opentelemetry.javaagent.tooling.BeforeAgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import org.hypertrace.agent.core.config.DataCaptureConfig.ConfigProvider; /** An AgentListener implementation that initializes the DataCaptureConfig.ConfigProvider. */ -@AutoService(AgentListener.class) -public class DataCaptureConfigInstaller implements AgentListener { +@AutoService(BeforeAgentListener.class) +public class DataCaptureConfigInstaller implements BeforeAgentListener { @Override - public void beforeAgent( - Config config, AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { - ConfigProvider.get(); + public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { + ConfigProvider.get(getClass().getClassLoader()); } } diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/HypertraceAgentConfiguration.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/HypertraceAgentConfiguration.java index e0bebabfe..3262d0bad 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/HypertraceAgentConfiguration.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/HypertraceAgentConfiguration.java @@ -18,7 +18,8 @@ import com.google.auto.service.AutoService; import com.google.common.annotations.VisibleForTesting; -import io.opentelemetry.javaagent.extension.config.ConfigPropertySource; +import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; +import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,8 +31,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@AutoService(ConfigPropertySource.class) -public class HypertraceAgentConfiguration implements ConfigPropertySource { +@AutoService(AutoConfigurationCustomizerProvider.class) +public class HypertraceAgentConfiguration implements AutoConfigurationCustomizerProvider { private static final Logger log = LoggerFactory.getLogger(HypertraceAgentConfiguration.class); @@ -53,7 +54,6 @@ public class HypertraceAgentConfiguration implements ConfigPropertySource { private static final String OTEL_ENABLED = "otel.javaagent.enabled"; private static final String OTEL_OTLP_CERT = "otel.exporter.otlp.certificate"; - @Override public Map getProperties() { AgentConfig agentConfig = HypertraceConfig.get(); @@ -109,4 +109,9 @@ public static String toOtelPropagators(List propagationFormat .map(v -> v.name().toLowerCase()) .collect(Collectors.joining(",")); } + + @Override + public void customize(AutoConfigurationCustomizer autoConfigurationCustomizer) { + autoConfigurationCustomizer.addPropertiesSupplier(this::getProperties); + } } diff --git a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/InstrumentationConfigInstaller.java b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/InstrumentationConfigInstaller.java index 40a990260..7faa58065 100644 --- a/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/InstrumentationConfigInstaller.java +++ b/otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/InstrumentationConfigInstaller.java @@ -17,18 +17,15 @@ package org.hypertrace.agent.otel.extensions.config; import com.google.auto.service.AutoService; -import io.opentelemetry.instrumentation.api.config.Config; -import io.opentelemetry.javaagent.extension.AgentListener; +import io.opentelemetry.javaagent.tooling.BeforeAgentListener; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import org.hypertrace.agent.core.config.InstrumentationConfig.ConfigProvider; -@AutoService(AgentListener.class) -public class InstrumentationConfigInstaller implements AgentListener { +@AutoService(BeforeAgentListener.class) +public class InstrumentationConfigInstaller implements BeforeAgentListener { @Override - public void beforeAgent( - Config config, - AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { // get initializes singleton - ConfigProvider.get(); + public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) { + ConfigProvider.get(getClass().getClassLoader()); } } diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/AppServerTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/AppServerTest.groovy index 90395382c..e98de3e9f 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/AppServerTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/AppServerTest.groovy @@ -88,14 +88,17 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 2 traces.countFilteredAttributes("http.target", "/app/greeting") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 and: "Client and server spans for the remote call" // client span still has the http.url attribute traces.countFilteredAttributes("http.url", "http://localhost:8080/app/headers") == 1 traces.countFilteredAttributes("http.target", "/app/headers") == 1 - traces.countFilteredAttributes("http.host", "localhost:8080") == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + cleanup: response?.close() @@ -137,13 +140,17 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 2 traces.countFilteredAttributes("http.target", "/app/echo") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + and: "Client and server spans for the remote call" // client span still has the http.url attribute traces.countFilteredAttributes("http.url", "http://localhost:8080/app/headers") == 1 traces.countFilteredAttributes("http.target", "/app/headers") == 1 - traces.countFilteredAttributes("http.host", "localhost:8080") == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + and: "response body attribute should be present" traces.countFilteredAttributes("http.response.body") == 1 @@ -191,7 +198,9 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 1 traces.countFilteredAttributes("http.target", "/app/hello.txt") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + cleanup: response?.close() @@ -226,7 +235,9 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 1 traces.countFilteredAttributes("http.target", "/app/file-that-does-not-exist") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + cleanup: response?.close() @@ -269,7 +280,9 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 1 traces.countFilteredAttributes("http.target", "/app/WEB-INF/web.xml") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + cleanup: response?.close() @@ -309,7 +322,9 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 1 traces.countFilteredAttributes("http.target", "/app/exception") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + cleanup: response?.close() @@ -350,7 +365,8 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 1 traces.countFilteredAttributes("http.target", "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", 8080, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", 8080, "int").count() == 1 cleanup: response?.close() @@ -389,13 +405,16 @@ abstract class AppServerTest extends SmokeTest { and: "The span for the initial web request" traces.countFilteredAttributes("http.scheme", "http") == 2 traces.countFilteredAttributes("http.target", "/app/asyncgreeting") == 1 - traces.countFilteredAttributes("http.host", "localhost:" + port) == 1 + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 || + traces.filterSpansByAttributes(traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.sock.host.port", port, "int").count() == 1 + and: "Client and server spans for the remote call" // client span still has the http.url attribute traces.countFilteredAttributes("http.url", "http://localhost:8080/app/headers") == 1 traces.countFilteredAttributes("http.target", "/app/headers") == 1 - traces.countFilteredAttributes("http.host", "localhost:8080") == 1 + traces.filterSpansByAttributes( + traces.filterSpansByAttributes(traces.getSpanStream(), "net.host.name", "localhost", "string"), "net.host.port", port, "int").count() == 1 cleanup: response?.close() @@ -410,12 +429,14 @@ abstract class AppServerTest extends SmokeTest { case "/app/headers": case "/app/exception": case "/app/asyncgreeting": - return path + return "GET " + path + case "/app/echo": + return "POST " + path case "/app/hello.txt": case "/app/file-that-does-not-exist": - return "/app/*" + return "GET " + "/app/*" } - return "HTTP GET" + return "GET" } protected List> getTestParams() { diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/GlassFishSmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/GlassFishSmokeTest.groovy index 1ad19c41e..3512ea0c0 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/GlassFishSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/GlassFishSmokeTest.groovy @@ -38,7 +38,7 @@ class GlassFishSmokeTest extends AppServerTest { protected String getSpanName(String path) { switch (path) { case "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless": - return "/*" + return "GET /*" } return super.getSpanName(path) } diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertyServletOnlySmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertyServletOnlySmokeTest.groovy index e32d89b83..a2e5164b9 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertyServletOnlySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertyServletOnlySmokeTest.groovy @@ -20,7 +20,7 @@ class LibertyServletOnlySmokeTest extends LibertySmokeTest { switch (path) { case "/app/hello.txt": case "/app/file-that-does-not-exist": - return "HTTP GET" + return "GET" } return super.getSpanName(path) } diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertySmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertySmokeTest.groovy index a85aa1f99..bfeb54b8c 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/LibertySmokeTest.groovy @@ -31,7 +31,7 @@ class LibertySmokeTest extends AppServerTest { switch (path) { case "/app/hello.txt": case "/app/file-that-does-not-exist": - return "/app/*" + return "GET /app/*" } return super.getSpanName(path) } diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/PlaySmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/PlaySmokeTest.groovy index 2c9d66920..152377552 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/PlaySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/PlaySmokeTest.groovy @@ -26,9 +26,10 @@ class PlaySmokeTest extends SmokeTest { then: response.body().string() == "Welcome 1." - //Both play and akka-http support produce spans with the same name. - //One internal, one SERVER - countSpansByName(traces, '/welcome') == 2 + + // Play produces one Internal span and akka produces a server span + countSpansByName(traces, '/welcome') == 1 // play Internal span + countSpansByName(traces, 'GET /welcome') == 1 // akka Server span cleanup: stopTarget() diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TomeeSmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TomeeSmokeTest.groovy index b097b8f36..93326a994 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TomeeSmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TomeeSmokeTest.groovy @@ -34,7 +34,7 @@ class TomeeSmokeTest extends AppServerTest { protected String getSpanName(String path) { switch (path) { case "/this-is-definitely-not-there-but-there-should-be-a-trace-nevertheless": - return "/*" + return "GET /*" } return super.getSpanName(path) } diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TraceInspector.java b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TraceInspector.java index 1e5a4bb38..d9b6ac022 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TraceInspector.java +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/TraceInspector.java @@ -69,6 +69,18 @@ public long countFilteredAttributes(String attributeName, Object attributeValue) .count(); } + public Stream filterSpansByAttributes( + Stream spans, String attributeName, Object attributeValue, String valueType) { + return spans.filter( + s -> + s.getAttributesList().stream() + .anyMatch( + a -> + a.getKey().equals(attributeName) && valueType.equals("int") + ? a.getValue().getIntValue() == (int) attributeValue + : a.getValue().getStringValue().equals(attributeValue))); + } + public long countFilteredAttributes(String attributeName) { return getSpanStream() .flatMap(s -> s.getAttributesList().stream()) diff --git a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/WildflySmokeTest.groovy b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/WildflySmokeTest.groovy index 466f490aa..334d5c8a1 100644 --- a/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/WildflySmokeTest.groovy +++ b/smoke-tests/src/test/groovy/org/hypertrace/agent/smoketest/WildflySmokeTest.groovy @@ -47,7 +47,7 @@ class WildflySmokeTest extends AppServerTest { traces.countSpansByKind(Span.SpanKind.SPAN_KIND_SERVER) == 1 - traces.countSpansByName('/app/jsp') == 1 + traces.countSpansByName('GET /app/jsp') == 1 where: [appServer, jdk] << getTestParams() diff --git a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDiabledAgentSmokeTest.java b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDiabledAgentSmokeTest.java index d163938bf..d58195d6d 100644 --- a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDiabledAgentSmokeTest.java +++ b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDiabledAgentSmokeTest.java @@ -41,7 +41,9 @@ protected String getTargetImage(int jdk) { @BeforeEach void beforeEach() { app = createAppUnderTest(8); + // TODO: use this to disable ht-javaagent app.addEnv("HT_ENABLED", "false"); + app.addEnv("OTEL_JAVAAGENT_ENABLED", "false"); app.withCopyFileToContainer( MountableFile.forClasspathResource("/ht-config-all-disabled.yaml"), "/etc/ht-config-all-disabled.yaml"); diff --git a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDisabledBodyCaptureSmokeTest.java b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDisabledBodyCaptureSmokeTest.java index ca02e48ae..0c77b9ee1 100644 --- a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDisabledBodyCaptureSmokeTest.java +++ b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootDisabledBodyCaptureSmokeTest.java @@ -77,7 +77,7 @@ public void get() throws IOException { .getMainAttributes() .get(OTEL_INSTRUMENTATION_VERSION_MANIFEST_PROP); - Assertions.assertEquals(1, countSpansByName(traces, "/greeting")); + Assertions.assertEquals(1, countSpansByName(traces, "GET /greeting")); Assertions.assertEquals(1, countSpansByName(traces, "WebController.greeting")); Assertions.assertTrue( getInstrumentationLibSpanStream(traces) diff --git a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java index 918f3c709..da19ca902 100644 --- a/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java +++ b/smoke-tests/src/test/java/org/hypertrace/agent/smoketest/SpringBootSmokeTest.java @@ -121,7 +121,7 @@ public void postJson() throws IOException, InterruptedException { .getValue() .getStringValue()); - Assertions.assertEquals(1, countSpansByName(traces, "/echo")); + Assertions.assertEquals(1, countSpansByName(traces, "POST /echo")); Assertions.assertEquals(1, countSpansByName(traces, "WebController.echo")); Assertions.assertTrue( getInstrumentationLibSpanStream(traces) @@ -177,16 +177,12 @@ public void postJson() throws IOException, InterruptedException { Assertions.assertTrue(hasMetricNamed("otlp.exporter.exported", metrics)); Assertions.assertTrue(hasMetricNamed("processedSpans", metrics)); Assertions.assertTrue(hasMetricNamed("queueSize", metrics)); - Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.count", metrics)); - Assertions.assertTrue(hasMetricNamed("runtime.jvm.gc.time", metrics)); + Assertions.assertTrue(hasMetricNamed("http.server.request.size", metrics)); + Assertions.assertTrue(hasMetricNamed("http.server.response.size", metrics)); + Assertions.assertTrue(hasMetricNamed("http.server.duration", metrics)); Assertions.assertTrue(hasMetricNamed("process.runtime.jvm.memory.usage", metrics)); Assertions.assertTrue(hasMetricNamed("process.runtime.jvm.memory.init", metrics)); Assertions.assertTrue(hasMetricNamed("process.runtime.jvm.memory.committed", metrics)); - - // The following metrics are no longer produced by the OTEL Java agent (as of the 1.13.1 - // release) - // Assertions.assertTrue(hasMetricNamed("runtime.jvm.memory.pool", metrics)); - // Assertions.assertTrue(hasMetricNamed("runtime.jvm.memory.area", metrics)); } @Test diff --git a/testing-bootstrap/build.gradle.kts b/testing-bootstrap/build.gradle.kts index 2212f8b37..92065cd15 100644 --- a/testing-bootstrap/build.gradle.kts +++ b/testing-bootstrap/build.gradle.kts @@ -12,12 +12,11 @@ val versions: Map by extra dependencies { api("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap:${versions["opentelemetry_java_agent"]}") api("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") - api("io.opentelemetry.javaagent:opentelemetry-javaagent-instrumentation-api:${versions["opentelemetry_java_agent"]}") - api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-appender-api-internal:${versions["opentelemetry_java_agent"]}") + api("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") implementation(project(":javaagent-core")) implementation(project(":filter-api")) - implementation("ch.qos.logback:logback-classic:1.2.7") + implementation("ch.qos.logback:logback-classic:1.4.6") implementation("org.slf4j:slf4j-api:${versions["slf4j"]}") } diff --git a/testing-common/build.gradle.kts b/testing-common/build.gradle.kts index c0fbd0def..3f4a2f783 100644 --- a/testing-common/build.gradle.kts +++ b/testing-common/build.gradle.kts @@ -35,8 +35,8 @@ dependencies { } } testFixturesImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api:${versions["opentelemetry_java_agent"]}") - testFixturesImplementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry_java_agent"]}") - testFixturesImplementation("ch.qos.logback:logback-classic:1.2.3") + testFixturesImplementation("io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:${versions["opentelemetry"]}") + testFixturesImplementation("ch.qos.logback:logback-classic:1.4.6") testFixturesImplementation("org.slf4j:log4j-over-slf4j:${versions["slf4j"]}") testFixturesImplementation("org.slf4j:jcl-over-slf4j:${versions["slf4j"]}") testFixturesImplementation("org.slf4j:jul-to-slf4j:${versions["slf4j"]}") diff --git a/testing-common/src/testFixtures/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java b/testing-common/src/testFixtures/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java index 997b52f5c..bb3cfefb5 100644 --- a/testing-common/src/testFixtures/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java +++ b/testing-common/src/testFixtures/java/org/hypertrace/agent/testing/AbstractInstrumenterTest.java @@ -20,14 +20,13 @@ import ch.qos.logback.classic.Logger; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.javaagent.bootstrap.AgentInitializer; import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder; import io.opentelemetry.javaagent.tooling.AgentInstaller; import java.io.IOException; -import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.lang.reflect.Field; import java.util.Arrays; -import java.util.Collections; import java.util.concurrent.TimeUnit; import net.bytebuddy.agent.ByteBuddyAgent; import okhttp3.MediaType; @@ -74,8 +73,7 @@ public abstract class AbstractInstrumenterTest { ((Logger) LoggerFactory.getLogger("io.opentelemetry")).setLevel(Level.DEBUG); } - private static ClassFileTransformer classFileTransformer; - + private static boolean INSTRUMENTED = false; private static final int DEFAULT_TIMEOUT_SECONDS = 30; protected OkHttpClient httpClient = new OkHttpClient.Builder() @@ -107,7 +105,7 @@ public static void beforeAll() { } catch (Throwable t) { throw new AssertionError("Could not access agent classLoader", t); } - if (classFileTransformer == null) { + if (!INSTRUMENTED) { // --------------------------------------------------------------------- // Set the otel.instrumentation.internal-reflection.enabled property to // 'false'. This causes the OTEL agent to filter out virtual field @@ -116,8 +114,9 @@ public static void beforeAll() { // is not set. // --------------------------------------------------------------------- System.setProperty("otel.instrumentation.internal-reflection.enabled", "false"); - classFileTransformer = - AgentInstaller.installBytebuddyAgent(INSTRUMENTATION, Collections.emptyList()); + AgentInstaller.installBytebuddyAgent( + INSTRUMENTATION, AgentInitializer.getExtensionsClassLoader()); + INSTRUMENTED = true; } if (TEST_TRACER == null) { TEST_TRACER = GlobalOpenTelemetry.getTracer("io.opentelemetry.auto");