From 67ee3d73162f30188f0df129f776e88017865fbb Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Fri, 18 Oct 2024 21:08:45 -0700 Subject: [PATCH 1/9] Fix HTTP suppression in azure-core instrumentation --- .../javaagent/build.gradle.kts | 1 + .../javaagent/build.gradle.kts | 1 + .../javaagent/build.gradle.kts | 2 +- .../v1_36/AzureHttpClientInstrumentation.java | 11 ++- .../v1_36/SuppressNestedClientHelper.java | 11 ++- .../build.gradle.kts | 2 +- .../javaagent/build.gradle.kts | 57 +++++++++++++ .../v1_36/AzureHttpClientInstrumentation.java | 75 +++++++++++++++++ .../v1_36/AzureSdkInstrumentationModule.java | 80 +++++++++++++++++++ .../v1_36/SuppressNestedClientHelper.java | 58 ++++++++++++++ .../com.azure.core.util.tracing.Tracer | 1 + ...com.azure.core.util.tracing.TracerProvider | 1 + .../azurecore/v1_36/AzureSdkTest.java | 56 +++++++++++++ .../azurecore/v1_36/AzureSdkTestOld.java | 62 ++++++++++++++ .../build.gradle.kts | 28 +++++++ .../OpenTelemetryTracingOptions.java | 16 ++++ 16 files changed, 452 insertions(+), 10 deletions(-) create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java create mode 100644 instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts create mode 100644 instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java diff --git a/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts index 0833f4e53432..0d59e808acbb 100644 --- a/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts index 0a32d0161335..117de3afae7d 100644 --- a/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts index 3a8fd040b87c..1accae216ba5 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("com.azure") module.set("azure-core") - versions.set("[1.36.0,)") + versions.set("[1.36.0,1.53.0)") assertInverse.set(true) } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java index 2e1a68f2affe..4ca3c0e47a6b 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java @@ -12,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.azure.core.http.HttpResponse; import io.opentelemetry.context.Scope; @@ -35,12 +36,14 @@ public void transform(TypeTransformer transformer) { isMethod() .and(isPublic()) .and(named("send")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) .and(returns(named("reactor.core.publisher.Mono"))), this.getClass().getName() + "$SuppressNestedClientMonoAdvice"); transformer.applyAdviceToMethod( isMethod() .and(isPublic()) .and(named("sendSync")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) .and(returns(named("com.azure.core.http.HttpResponse"))), this.getClass().getName() + "$SuppressNestedClientSyncAdvice"); } @@ -48,8 +51,8 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SuppressNestedClientMonoAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void asyncSendExit(@Advice.Return(readOnly = false) Mono mono) { - mono = disallowNestedClientSpanMono(mono); + public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Return(readOnly = false) Mono mono) { + mono = disallowNestedClientSpanMono(mono, azContext); } } @@ -57,8 +60,8 @@ public static void asyncSendExit(@Advice.Return(readOnly = false) Mono Mono disallowNestedClientSpanMono(Mono delegate) { + public static Mono disallowNestedClientSpanMono(Mono delegate, com.azure.core.util.Context azContext) { return new Mono() { @Override public void subscribe(CoreSubscriber coreSubscriber) { Context parentContext = currentContext(); - if (doesNotHaveClientSpan(parentContext)) { + + boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); + if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { try (Scope ignored = disallowNestedClientSpan(parentContext).makeCurrent()) { delegate.subscribe(coreSubscriber); } diff --git a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts index 423f391f7e29..b7819f18d081 100644 --- a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { - implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.42") + implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.49") } tasks { diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts new file mode 100644 index 000000000000..029dc7e374c1 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts @@ -0,0 +1,57 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("com.azure") + module.set("azure-core") + versions.set("[1.53.0,)") + assertInverse.set(true) + } +} + +sourceSets { + main { + val shadedDep = project(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded") + output.dir( + shadedDep.file("build/extracted/shadow"), + "builtBy" to ":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded:extractShadowJar" + ) + } +} + +dependencies { + compileOnly(project(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded", configuration = "shadow")) + + library("com.azure:azure-core:1.53.0") + + // Ensure no cross interference + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) +} + +val latestDepTest = findProperty("testLatestDeps") as Boolean + +testing { + suites { + // using a test suite to ensure that classes from library-instrumentation-shaded that were + // extracted to the output directory are not available during tests + val testAzure by registering(JvmTestSuite::class) { + dependencies { + if (latestDepTest) { + implementation("com.azure:azure-core:+") + } else { + implementation("com.azure:azure-core:1.53.0") + } + } + } + } +} + +tasks { + check { + dependsOn(testing.suites) + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java new file mode 100644 index 000000000000..4ca3c0e47a6b --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java @@ -0,0 +1,75 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.SuppressNestedClientHelper.disallowNestedClientSpanMono; +import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.SuppressNestedClientHelper.disallowNestedClientSpanSync; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import com.azure.core.http.HttpResponse; +import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import reactor.core.publisher.Mono; + +public class AzureHttpClientInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("com.azure.core.http.HttpClient")); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + isMethod() + .and(isPublic()) + .and(named("send")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) + .and(returns(named("reactor.core.publisher.Mono"))), + this.getClass().getName() + "$SuppressNestedClientMonoAdvice"); + transformer.applyAdviceToMethod( + isMethod() + .and(isPublic()) + .and(named("sendSync")) + .and(takesArgument(1, named("com.azure.core.util.Context"))) + .and(returns(named("com.azure.core.http.HttpResponse"))), + this.getClass().getName() + "$SuppressNestedClientSyncAdvice"); + } + + @SuppressWarnings("unused") + public static class SuppressNestedClientMonoAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) + public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Return(readOnly = false) Mono mono) { + mono = disallowNestedClientSpanMono(mono, azContext); + } + } + + @SuppressWarnings("unused") + public static class SuppressNestedClientSyncAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void syncSendEnter(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Local("otelScope") Scope scope) { + scope = disallowNestedClientSpanSync(azContext); + } + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void syncSendExit( + @Advice.Return HttpResponse response, @Advice.Local("otelScope") Scope scope) { + if (scope != null) { + scope.close(); + } + } + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java new file mode 100644 index 000000000000..665ace5d14f7 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java @@ -0,0 +1,80 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; + +import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static java.util.Arrays.asList; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.not; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.HelperResourceBuilder; +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.extension.instrumentation.internal.ExperimentalInstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; +import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode; +import java.util.List; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class AzureSdkInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public AzureSdkInstrumentationModule() { + super("azure-core", "azure-core-1.36"); + } + + @Override + public void registerHelperResources(HelperResourceBuilder helperResourceBuilder) { + helperResourceBuilder.register( + "META-INF/services/com.azure.core.util.tracing.TracerProvider", + "azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider"); + // some azure sdks (e.g. EventHubs) are still looking up Tracer via service loader + // and not yet using the new TracerProvider + helperResourceBuilder.register( + "META-INF/services/com.azure.core.util.tracing.Tracer", + "azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer"); + } + + @Override + public void injectClasses(ClassInjector injector) { + injector + .proxyBuilder( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer") + .inject(InjectionMode.CLASS_ONLY); + injector + .proxyBuilder( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider") + .inject(InjectionMode.CLASS_ONLY); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // this class was introduced in azure-core 1.36 + return hasClassesNamed("com.azure.core.util.tracing.TracerProvider") + .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))); + } + + @Override + public List typeInstrumentations() { + return asList(new EmptyTypeInstrumentation(), new AzureHttpClientInstrumentation()); + } + + public static class EmptyTypeInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return namedOneOf( + "com.azure.core.util.tracing.TracerProvider", "com.azure.core.util.tracing.Tracer"); + } + + @Override + public void transform(TypeTransformer transformer) { + // Nothing to instrument, no methods to match + } + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java new file mode 100644 index 000000000000..e3cb7f80ef06 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; + +import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.internal.SpanKey; +import reactor.core.CoreSubscriber; +import reactor.core.publisher.Mono; + +public class SuppressNestedClientHelper { + + public static Scope disallowNestedClientSpanSync(com.azure.core.util.Context azContext) { + Context parentContext = currentContext(); + boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); + if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { + return disallowNestedClientSpan(parentContext).makeCurrent(); + } + return null; + } + + public static Mono disallowNestedClientSpanMono(Mono delegate, com.azure.core.util.Context azContext) { + return new Mono() { + @Override + public void subscribe(CoreSubscriber coreSubscriber) { + Context parentContext = currentContext(); + + boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); + if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { + try (Scope ignored = disallowNestedClientSpan(parentContext).makeCurrent()) { + delegate.subscribe(coreSubscriber); + } + } else { + delegate.subscribe(coreSubscriber); + } + } + }; + } + + private static boolean doesNotHaveClientSpan(Context parentContext) { + return SpanKey.KIND_CLIENT.fromContextOrNull(parentContext) == null + && SpanKey.HTTP_CLIENT.fromContextOrNull(parentContext) == null; + } + + private static Context disallowNestedClientSpan(Context parentContext) { + Span span = Span.getInvalid(); + return SpanKey.HTTP_CLIENT.storeInContext( + SpanKey.KIND_CLIENT.storeInContext(parentContext, span), span); + } + + private SuppressNestedClientHelper() {} +} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer new file mode 100644 index 000000000000..00cafebf9a66 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer @@ -0,0 +1 @@ +io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider new file mode 100644 index 000000000000..15aff8ad759e --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider @@ -0,0 +1 @@ +io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider \ No newline at end of file diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java new file mode 100644 index 000000000000..4661a9cf7ea0 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.azure.core.util.Context; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.trace.data.StatusData; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class AzureSdkTest { + + @RegisterExtension + public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Test + void testHelperClassesInjected() { + com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); + assertThat(azTracer.isEnabled()).isTrue(); + + assertThat(azTracer.getClass().getName()) + .isEqualTo( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + } + + @Test + void testSpan() { + com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); + Context context = azTracer.start("hello", Context.NONE); + azTracer.end(null, null, context); + + testing.waitAndAssertTracesWithoutScopeVersionVerification( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("hello") + .hasKind(SpanKind.INTERNAL) + .hasStatus(StatusData.unset()) + .hasAttributesSatisfying(Attributes::isEmpty))); + } + + private static com.azure.core.util.tracing.Tracer createAzTracer() { + com.azure.core.util.tracing.TracerProvider azProvider = + com.azure.core.util.tracing.TracerProvider.getDefaultProvider(); + return azProvider.createTracer("test-lib", "test-version", "otel.tests", null); + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java new file mode 100644 index 000000000000..650f84ebeecb --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.azure.core.util.Context; +import com.azure.core.util.tracing.Tracer; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.sdk.trace.data.StatusData; +import java.util.Iterator; +import java.util.ServiceLoader; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +// some azure sdks (e.g. EventHubs) are still looking up Tracer via service loader +// and not yet using the new TracerProvider +class AzureSdkTestOld { + + @RegisterExtension + public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Test + void testHelperClassesInjected() { + com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); + assertThat(azTracer.isEnabled()).isTrue(); + + assertThat(azTracer.getClass().getName()) + .isEqualTo( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + } + + @Test + void testSpan() { + com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); + Context context = azTracer.start("hello", Context.NONE); + azTracer.end(null, null, context); + + testing.waitAndAssertTracesWithoutScopeVersionVerification( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("hello") + .hasKind(SpanKind.INTERNAL) + .hasStatus(StatusData.unset()) + .hasAttributesSatisfying(Attributes::isEmpty))); + } + + private static com.azure.core.util.tracing.Tracer createAzTracer() { + Iterable tracers = + ServiceLoader.load(com.azure.core.util.tracing.Tracer.class); + Iterator it = tracers.iterator(); + return it.hasNext() ? it.next() : null; + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts new file mode 100644 index 000000000000..9bf53a76ea7c --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("com.gradleup.shadow") + id("otel.java-conventions") +} + +group = "io.opentelemetry.javaagent.instrumentation" + +dependencies { + implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.50") +} + +tasks { + shadowJar { + exclude("META-INF/services/*") + + dependencies { + // including only azure-core-tracing-opentelemetry excludes its transitive dependencies + include(dependency("com.azure:azure-core-tracing-opentelemetry")) + } + relocate("com.azure.core.tracing.opentelemetry", "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry") + } + + val extractShadowJar by registering(Copy::class) { + dependsOn(shadowJar) + from(zipTree(shadowJar.get().archiveFile)) + into("build/extracted/shadow") + } +} diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java new file mode 100644 index 000000000000..99338d6958ea --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java @@ -0,0 +1,16 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.azure.core.tracing.opentelemetry; + +import com.azure.core.util.TracingOptions; + +/** + * Replace {@link OpenTelemetryTracingOptions} from com.azure:azure-core-tracing-opentelemetry with + * a stub. Auto instrumentation does not use {@link OpenTelemetryTracingOptions}. This is needed + * because {@link OpenTelemetryTracingOptions} calls super constructor in {@link TracingOptions} + * that does exist in com.azure:azure-core:1.36.0 which triggers muzzle failure. + */ +public class OpenTelemetryTracingOptions extends TracingOptions {} From ed22dc23a1ff3626ac0d9203d67e0068ccf4efd2 Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Fri, 18 Oct 2024 21:40:42 -0700 Subject: [PATCH 2/9] More fixes --- .../v1_36/AzureSdkInstrumentationModule.java | 3 ++- .../AzureHttpClientInstrumentation.java | 6 +++--- .../AzureSdkInstrumentationModule.java | 16 ++++++++-------- .../SuppressNestedClientHelper.java | 2 +- .../services/com.azure.core.util.tracing.Tracer | 1 - .../com.azure.core.util.tracing.TracerProvider | 1 - .../services/com.azure.core.util.tracing.Tracer | 1 + .../com.azure.core.util.tracing.TracerProvider | 1 + .../azurecore/{v1_36 => v1_53}/AzureSdkTest.java | 4 ++-- .../{v1_36 => v1_53}/AzureSdkTestOld.java | 4 ++-- .../OpenTelemetryTracingOptions.java | 16 ---------------- settings.gradle.kts | 2 ++ 12 files changed, 22 insertions(+), 35 deletions(-) rename instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/{v1_36 => v1_53}/AzureHttpClientInstrumentation.java (95%) rename instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/{v1_36 => v1_53}/AzureSdkInstrumentationModule.java (87%) rename instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/{v1_36 => v1_53}/SuppressNestedClientHelper.java (99%) delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer create mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider rename instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/{v1_36 => v1_53}/AzureSdkTest.java (99%) rename instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/{v1_36 => v1_53}/AzureSdkTestOld.java (99%) delete mode 100644 instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java index 665ace5d14f7..644413283ad9 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java @@ -57,7 +57,8 @@ public void injectClasses(ClassInjector injector) { public ElementMatcher.Junction classLoaderMatcher() { // this class was introduced in azure-core 1.36 return hasClassesNamed("com.azure.core.util.tracing.TracerProvider") - .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))); + .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))) + .and(not(hasClassesNamed("com.azure.core.util.LibraryTelemetryOptions"))); } @Override diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java similarity index 95% rename from instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java rename to instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java index 4ca3c0e47a6b..56635d2c3441 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; -import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.SuppressNestedClientHelper.disallowNestedClientSpanMono; -import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.SuppressNestedClientHelper.disallowNestedClientSpanSync; +import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.SuppressNestedClientHelper.disallowNestedClientSpanMono; +import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.SuppressNestedClientHelper.disallowNestedClientSpanSync; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java similarity index 87% rename from instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java rename to instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java index 665ace5d14f7..2eec753f6032 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static java.util.Arrays.asList; @@ -26,37 +26,37 @@ public class AzureSdkInstrumentationModule extends InstrumentationModule implements ExperimentalInstrumentationModule { public AzureSdkInstrumentationModule() { - super("azure-core", "azure-core-1.36"); + super("azure-core", "azure-core-1.53"); } @Override public void registerHelperResources(HelperResourceBuilder helperResourceBuilder) { helperResourceBuilder.register( "META-INF/services/com.azure.core.util.tracing.TracerProvider", - "azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider"); + "azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider"); // some azure sdks (e.g. EventHubs) are still looking up Tracer via service loader // and not yet using the new TracerProvider helperResourceBuilder.register( "META-INF/services/com.azure.core.util.tracing.Tracer", - "azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer"); + "azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer"); } @Override public void injectClasses(ClassInjector injector) { injector .proxyBuilder( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer") + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer") .inject(InjectionMode.CLASS_ONLY); injector .proxyBuilder( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider") + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider") .inject(InjectionMode.CLASS_ONLY); } @Override public ElementMatcher.Junction classLoaderMatcher() { - // this class was introduced in azure-core 1.36 - return hasClassesNamed("com.azure.core.util.tracing.TracerProvider") + // this class was introduced in azure-core 1.53 + return hasClassesNamed("com.azure.core.util.LibraryTelemetryOptions") .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))); } diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java similarity index 99% rename from instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java rename to instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java index e3cb7f80ef06..1e64e1803744 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer deleted file mode 100644 index 00cafebf9a66..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider deleted file mode 100644 index 15aff8ad759e..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.TracerProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider \ No newline at end of file diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer new file mode 100644 index 000000000000..ac10fa408e6d --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer @@ -0,0 +1 @@ +io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider new file mode 100644 index 000000000000..4d7af1762308 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider @@ -0,0 +1 @@ +io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java similarity index 99% rename from instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java rename to instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java index 4661a9cf7ea0..83e01f260549 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; import static org.assertj.core.api.Assertions.assertThat; @@ -28,7 +28,7 @@ void testHelperClassesInjected() { assertThat(azTracer.getClass().getName()) .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded" + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java similarity index 99% rename from instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java rename to instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java index 650f84ebeecb..cc8f518cc858 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_36; +package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; import static org.assertj.core.api.Assertions.assertThat; @@ -33,7 +33,7 @@ void testHelperClassesInjected() { assertThat(azTracer.getClass().getName()) .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded" + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java deleted file mode 100644 index 99338d6958ea..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracingOptions.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.azure.core.tracing.opentelemetry; - -import com.azure.core.util.TracingOptions; - -/** - * Replace {@link OpenTelemetryTracingOptions} from com.azure:azure-core-tracing-opentelemetry with - * a stub. Auto instrumentation does not use {@link OpenTelemetryTracingOptions}. This is needed - * because {@link OpenTelemetryTracingOptions} calls super constructor in {@link TracingOptions} - * that does exist in com.azure:azure-core:1.36.0 which triggers muzzle failure. - */ -public class OpenTelemetryTracingOptions extends TracingOptions {} diff --git a/settings.gradle.kts b/settings.gradle.kts index c9e944fdb48c..82c41cf90a89 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -217,6 +217,8 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:azure-core:azure-core-1.36:javaagent") include(":instrumentation:azure-core:azure-core-1.36:library-instrumentation-shaded") +include(":instrumentation:azure-core:azure-core-1.53:javaagent") +include(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded") include(":instrumentation:c3p0-0.9:javaagent") include(":instrumentation:c3p0-0.9:library") include(":instrumentation:c3p0-0.9:testing") From e247e56151d77ca116f17a74f0090830277df1fb Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Thu, 24 Oct 2024 16:00:38 -0700 Subject: [PATCH 3/9] Address feedback, add tests, update changelog, lint --- CHANGELOG.md | 4 + .../v1_36/AzureHttpClientInstrumentation.java | 8 +- .../v1_36/AzureSdkInstrumentationModule.java | 1 + .../v1_36/SuppressNestedClientHelper.java | 3 +- .../build.gradle.kts | 1 + .../javaagent/build.gradle.kts | 2 + .../v1_53/AzureHttpClientInstrumentation.java | 8 +- .../v1_53/SuppressNestedClientHelper.java | 3 +- .../azurecore/v1_53/AzureSdkTest.java | 102 ++++++++++++++++++ .../build.gradle.kts | 1 + 10 files changed, 127 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d34915588364..92e019ebd390 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Update azure-core-tracing-opentelemetry version and improve HTTP suppression to back off + when Azure SDK tracing was disabled. + ([#12489](https://github.com/open-telemetry/opentelemetry-java-instrumentation/pull/12489)) + ## Version 2.9.0 (2024-10-17) ### 📈 Enhancements diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java index 4ca3c0e47a6b..9cce8f85e7fb 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureHttpClientInstrumentation.java @@ -51,7 +51,9 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SuppressNestedClientMonoAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Return(readOnly = false) Mono mono) { + public static void asyncSendExit( + @Advice.Argument(1) com.azure.core.util.Context azContext, + @Advice.Return(readOnly = false) Mono mono) { mono = disallowNestedClientSpanMono(mono, azContext); } } @@ -60,7 +62,9 @@ public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context public static class SuppressNestedClientSyncAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static void syncSendEnter(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Local("otelScope") Scope scope) { + public static void syncSendEnter( + @Advice.Argument(1) com.azure.core.util.Context azContext, + @Advice.Local("otelScope") Scope scope) { scope = disallowNestedClientSpanSync(azContext); } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java index 644413283ad9..c32dcc91f08f 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java @@ -58,6 +58,7 @@ public ElementMatcher.Junction classLoaderMatcher() { // this class was introduced in azure-core 1.36 return hasClassesNamed("com.azure.core.util.tracing.TracerProvider") .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))) + // this class was introduced in azure-core 1.53 .and(not(hasClassesNamed("com.azure.core.util.LibraryTelemetryOptions"))); } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java index e3cb7f80ef06..23b51987ca55 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/SuppressNestedClientHelper.java @@ -25,7 +25,8 @@ public static Scope disallowNestedClientSpanSync(com.azure.core.util.Context azC return null; } - public static Mono disallowNestedClientSpanMono(Mono delegate, com.azure.core.util.Context azContext) { + public static Mono disallowNestedClientSpanMono( + Mono delegate, com.azure.core.util.Context azContext) { return new Mono() { @Override public void subscribe(CoreSubscriber coreSubscriber) { diff --git a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts index b7819f18d081..1384db004feb 100644 --- a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { + // this is the latest version that works with azure-core 1.36 implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.49") } diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts index 029dc7e374c1..e8ae7836ea26 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts @@ -42,8 +42,10 @@ testing { dependencies { if (latestDepTest) { implementation("com.azure:azure-core:+") + implementation("com.azure:azure-core-test:+") } else { implementation("com.azure:azure-core:1.53.0") + implementation("com.azure:azure-core-test:1.26.2") } } } diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java index 56635d2c3441..64894df76d0e 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java @@ -51,7 +51,9 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SuppressNestedClientMonoAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Return(readOnly = false) Mono mono) { + public static void asyncSendExit( + @Advice.Argument(1) com.azure.core.util.Context azContext, + @Advice.Return(readOnly = false) Mono mono) { mono = disallowNestedClientSpanMono(mono, azContext); } } @@ -60,7 +62,9 @@ public static void asyncSendExit(@Advice.Argument(1) com.azure.core.util.Context public static class SuppressNestedClientSyncAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static void syncSendEnter(@Advice.Argument(1) com.azure.core.util.Context azContext, @Advice.Local("otelScope") Scope scope) { + public static void syncSendEnter( + @Advice.Argument(1) com.azure.core.util.Context azContext, + @Advice.Local("otelScope") Scope scope) { scope = disallowNestedClientSpanSync(azContext); } diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java index 1e64e1803744..37c25b5f2bd1 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java @@ -25,7 +25,8 @@ public static Scope disallowNestedClientSpanSync(com.azure.core.util.Context azC return null; } - public static Mono disallowNestedClientSpanMono(Mono delegate, com.azure.core.util.Context azContext) { + public static Mono disallowNestedClientSpanMono( + Mono delegate, com.azure.core.util.Context azContext) { return new Mono() { @Override public void subscribe(CoreSubscriber coreSubscriber) { diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java index 83e01f260549..2ab4e9ba9ca6 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java @@ -7,14 +7,34 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.azure.core.annotation.ExpectedResponses; +import com.azure.core.annotation.Get; +import com.azure.core.annotation.Host; +import com.azure.core.annotation.ServiceInterface; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.HttpPolicyProviders; +import com.azure.core.http.rest.Response; +import com.azure.core.http.rest.RestProxy; +import com.azure.core.test.http.MockHttpResponse; +import com.azure.core.util.ClientOptions; import com.azure.core.util.Context; +import com.azure.core.util.TracingOptions; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; class AzureSdkTest { @@ -48,9 +68,91 @@ void testSpan() { .hasAttributesSatisfying(Attributes::isEmpty))); } + @Test + void testPipelineAndSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check if suppression is working + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, true).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isTrue(); + testing.waitAndAssertTracesWithoutScopeVersionVerification( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("myService.testMethod") + .hasKind(SpanKind.INTERNAL) + .hasStatus(StatusData.unset()) + .hasAttributesSatisfying(Attributes::isEmpty), + span -> + span.hasName("GET").hasKind(SpanKind.CLIENT).hasStatus(StatusData.unset()))); + } + + @Test + void testDisabledTracingNoSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check if suppression is working + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, false).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isFalse(); + } + private static com.azure.core.util.tracing.Tracer createAzTracer() { com.azure.core.util.tracing.TracerProvider azProvider = com.azure.core.util.tracing.TracerProvider.getDefaultProvider(); return azProvider.createTracer("test-lib", "test-version", "otel.tests", null); } + + private static TestInterface createService(HttpClient httpClient, boolean tracingEnabled) { + List policies = new ArrayList<>(); + HttpPolicyProviders.addAfterRetryPolicies(policies); + + ClientOptions clientOptions = + new ClientOptions().setTracingOptions(new TracingOptions().setEnabled(tracingEnabled)); + HttpPipeline pipeline = + new HttpPipelineBuilder() + .policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient) + .clientOptions(clientOptions) + .build(); + + return RestProxy.create(TestInterface.class, pipeline); + } + + private static boolean hasClientAndHttpSpans() { + io.opentelemetry.context.Context ctx = io.opentelemetry.context.Context.current(); + return SpanKey.KIND_CLIENT.fromContextOrNull(ctx) != null + && SpanKey.HTTP_CLIENT.fromContextOrNull(ctx) != null; + } + + @Host("https://azure.com") + @ServiceInterface(name = "myService") + interface TestInterface { + @Get("path") + @ExpectedResponses({200}) + Mono> testMethod(); + } } diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts index 9bf53a76ea7c..443943fed934 100644 --- a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { + // this is the latest version that works with azure-core 1.53 implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.50") } From 7adffc6f4789f79bc5910bc7c769f38d0fe9c98b Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Thu, 24 Oct 2024 16:05:55 -0700 Subject: [PATCH 4/9] up --- .../javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java index 2ab4e9ba9ca6..4b2b24086e0d 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java @@ -107,7 +107,7 @@ void testDisabledTracingNoSuppression() { request -> Mono.defer( () -> { - // check if suppression is working + // check no suppression hasClientAndHttpKeys.set(hasClientAndHttpSpans()); return Mono.just(new MockHttpResponse(request, 200)); }); From e41ce9e921fa6d7c3b741da0f09e1a96a679a523 Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Thu, 24 Oct 2024 18:45:11 -0700 Subject: [PATCH 5/9] fix some test failures --- .../azure-core/azure-core-1.36/javaagent/build.gradle.kts | 1 + .../instrumentation/azurecore/v1_36/AzureSdkTest.java | 4 +--- .../instrumentation/azurecore/v1_36/AzureSdkTestOld.java | 4 +--- .../instrumentation/azurecore/v1_53/AzureSdkTest.java | 4 +--- .../instrumentation/azurecore/v1_53/AzureSdkTestOld.java | 4 +--- .../library-instrumentation-shaded/build.gradle.kts | 1 - 6 files changed, 5 insertions(+), 13 deletions(-) diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts index 1accae216ba5..0393f6f62ba3 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) + testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index 4661a9cf7ea0..6c843f7f4c22 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -27,9 +27,7 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" - + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java index 650f84ebeecb..3c5a01ba609e 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java @@ -32,9 +32,7 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" - + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .endsWith(".shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java index 4b2b24086e0d..111a37db4c44 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java @@ -47,9 +47,7 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded" - + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java index cc8f518cc858..90bd941fd747 100644 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java +++ b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java @@ -32,9 +32,7 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .isEqualTo( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded" - + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts index 443943fed934..9bf53a76ea7c 100644 --- a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts @@ -6,7 +6,6 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { - // this is the latest version that works with azure-core 1.53 implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.50") } From d473a59c0a8b140beaf48b9ea352ca4011368adf Mon Sep 17 00:00:00 2001 From: Liudmila Molkova Date: Thu, 24 Oct 2024 19:06:00 -0700 Subject: [PATCH 6/9] fix more tests --- .../library-instrumentation-shaded/build.gradle.kts | 5 +++-- .../library-instrumentation-shaded/build.gradle.kts | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts index 1384db004feb..f3ffaf42e612 100644 --- a/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/library-instrumentation-shaded/build.gradle.kts @@ -6,8 +6,9 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { - // this is the latest version that works with azure-core 1.36 - implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.49") + // this is the last good version that works with indy build + // update to 1.49 or latest once https://github.com/Azure/azure-sdk-for-java/pull/42586 is released. + implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.45") } tasks { diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts index 9bf53a76ea7c..db9f39f225f6 100644 --- a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts @@ -6,7 +6,9 @@ plugins { group = "io.opentelemetry.javaagent.instrumentation" dependencies { - implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.50") + // this is the last good version that works with indy build + // update to the latest once https://github.com/Azure/azure-sdk-for-java/pull/42586 is released. + implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.45") } tasks { From a1c340867550d1fce36dcc14ac85952e7f73c981 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 25 Oct 2024 17:08:38 -0700 Subject: [PATCH 7/9] simplify --- .../javaagent/build.gradle.kts | 1 - .../javaagent/build.gradle.kts | 1 - .../javaagent/build.gradle.kts | 11 +- .../v1_36/AzureSdkInstrumentationModule.java | 4 +- .../azurecore/v1_36/AzureSdkTest.java | 110 +++++++++++- .../azurecore/v1_36/AzureSdkTestOld.java | 4 +- .../javaagent/build.gradle.kts | 59 ------- .../v1_53/AzureHttpClientInstrumentation.java | 79 --------- .../v1_53/AzureSdkInstrumentationModule.java | 80 --------- .../v1_53/SuppressNestedClientHelper.java | 59 ------- .../com.azure.core.util.tracing.Tracer | 1 - ...com.azure.core.util.tracing.TracerProvider | 1 - .../azurecore/v1_53/AzureSdkTest.java | 156 ------------------ .../azurecore/v1_53/AzureSdkTestOld.java | 60 ------- .../build.gradle.kts | 30 ---- settings.gradle.kts | 2 - 16 files changed, 122 insertions(+), 536 deletions(-) delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java delete mode 100644 instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java delete mode 100644 instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts diff --git a/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts index 0d59e808acbb..0833f4e53432 100644 --- a/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.14/javaagent/build.gradle.kts @@ -29,7 +29,6 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts index 117de3afae7d..0a32d0161335 100644 --- a/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.19/javaagent/build.gradle.kts @@ -29,7 +29,6 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts index 0393f6f62ba3..5144db03647f 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/build.gradle.kts @@ -6,7 +6,7 @@ muzzle { pass { group.set("com.azure") module.set("azure-core") - versions.set("[1.36.0,1.53.0)") + versions.set("[1.36.0,)") assertInverse.set(true) } } @@ -29,11 +29,16 @@ dependencies { // Ensure no cross interference testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.53:javaagent")) } val latestDepTest = findProperty("testLatestDeps") as Boolean +tasks { + withType().configureEach { + systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) + } +} + testing { suites { // using a test suite to ensure that classes from library-instrumentation-shaded that were @@ -42,8 +47,10 @@ testing { dependencies { if (latestDepTest) { implementation("com.azure:azure-core:+") + implementation("com.azure:azure-core-test:+") } else { implementation("com.azure:azure-core:1.36.0") + implementation("com.azure:azure-core-test:1.16.2") } } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java index c32dcc91f08f..665ace5d14f7 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkInstrumentationModule.java @@ -57,9 +57,7 @@ public void injectClasses(ClassInjector injector) { public ElementMatcher.Junction classLoaderMatcher() { // this class was introduced in azure-core 1.36 return hasClassesNamed("com.azure.core.util.tracing.TracerProvider") - .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))) - // this class was introduced in azure-core 1.53 - .and(not(hasClassesNamed("com.azure.core.util.LibraryTelemetryOptions"))); + .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))); } @Override diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index 6c843f7f4c22..8ac1a352d946 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -7,14 +7,35 @@ import static org.assertj.core.api.Assertions.assertThat; +import com.azure.core.annotation.ExpectedResponses; +import com.azure.core.annotation.Get; +import com.azure.core.annotation.Host; +import com.azure.core.annotation.ServiceInterface; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.HttpPolicyProviders; +import com.azure.core.http.rest.Response; +import com.azure.core.http.rest.RestProxy; +import com.azure.core.test.http.MockHttpResponse; +import com.azure.core.util.ClientOptions; import com.azure.core.util.Context; +import com.azure.core.util.TracingOptions; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; class AzureSdkTest { @@ -27,7 +48,9 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .isEqualTo( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test @@ -46,9 +69,94 @@ void testSpan() { .hasAttributesSatisfying(Attributes::isEmpty))); } + @Test + void testPipelineAndSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check if suppression is working + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, true).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isTrue(); + testing.waitAndAssertTracesWithoutScopeVersionVerification( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("myService.testMethod") + .hasKind(SpanKind.INTERNAL) + .hasStatus(StatusData.unset()) + .hasAttributesSatisfyingExactly(), + span -> + span.hasKind(SpanKind.CLIENT) + .hasName(Boolean.getBoolean("testLatestDeps") ? "GET" : "HTTP GET") + .hasStatus(StatusData.unset()) + .hasAttribute(AttributeKey.longKey("http.response.status_code"), 200L))); + } + + @Test + void testDisabledTracingNoSuppression() { + AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); + + HttpClient mockClient = + request -> + Mono.defer( + () -> { + // check no suppression + hasClientAndHttpKeys.set(hasClientAndHttpSpans()); + return Mono.just(new MockHttpResponse(request, 200)); + }); + + StepVerifier.create(createService(mockClient, false).testMethod()) + .expectNextCount(1) + .expectComplete() + .verify(); + + assertThat(hasClientAndHttpKeys.get()).isFalse(); + } + private static com.azure.core.util.tracing.Tracer createAzTracer() { com.azure.core.util.tracing.TracerProvider azProvider = com.azure.core.util.tracing.TracerProvider.getDefaultProvider(); return azProvider.createTracer("test-lib", "test-version", "otel.tests", null); } + + private static TestInterface createService(HttpClient httpClient, boolean tracingEnabled) { + List policies = new ArrayList<>(); + HttpPolicyProviders.addAfterRetryPolicies(policies); + + ClientOptions clientOptions = + new ClientOptions().setTracingOptions(new TracingOptions().setEnabled(tracingEnabled)); + HttpPipeline pipeline = + new HttpPipelineBuilder() + .policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient) + .clientOptions(clientOptions) + .build(); + + return RestProxy.create(TestInterface.class, pipeline); + } + + private static boolean hasClientAndHttpSpans() { + io.opentelemetry.context.Context ctx = io.opentelemetry.context.Context.current(); + return SpanKey.KIND_CLIENT.fromContextOrNull(ctx) != null + && SpanKey.HTTP_CLIENT.fromContextOrNull(ctx) != null; + } + + @Host("https://azure.com") + @ServiceInterface(name = "myService") + interface TestInterface { + @Get("path") + @ExpectedResponses({200}) + Mono> testMethod(); + } } diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java index 3c5a01ba609e..650f84ebeecb 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTestOld.java @@ -32,7 +32,9 @@ void testHelperClassesInjected() { assertThat(azTracer.isEnabled()).isTrue(); assertThat(azTracer.getClass().getName()) - .endsWith(".shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); + .isEqualTo( + "io.opentelemetry.javaagent.instrumentation.azurecore.v1_36.shaded" + + ".com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); } @Test diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts deleted file mode 100644 index e8ae7836ea26..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/build.gradle.kts +++ /dev/null @@ -1,59 +0,0 @@ -plugins { - id("otel.javaagent-instrumentation") -} - -muzzle { - pass { - group.set("com.azure") - module.set("azure-core") - versions.set("[1.53.0,)") - assertInverse.set(true) - } -} - -sourceSets { - main { - val shadedDep = project(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded") - output.dir( - shadedDep.file("build/extracted/shadow"), - "builtBy" to ":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded:extractShadowJar" - ) - } -} - -dependencies { - compileOnly(project(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded", configuration = "shadow")) - - library("com.azure:azure-core:1.53.0") - - // Ensure no cross interference - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.14:javaagent")) - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.19:javaagent")) - testInstrumentation(project(":instrumentation:azure-core:azure-core-1.36:javaagent")) -} - -val latestDepTest = findProperty("testLatestDeps") as Boolean - -testing { - suites { - // using a test suite to ensure that classes from library-instrumentation-shaded that were - // extracted to the output directory are not available during tests - val testAzure by registering(JvmTestSuite::class) { - dependencies { - if (latestDepTest) { - implementation("com.azure:azure-core:+") - implementation("com.azure:azure-core-test:+") - } else { - implementation("com.azure:azure-core:1.53.0") - implementation("com.azure:azure-core-test:1.26.2") - } - } - } - } -} - -tasks { - check { - dependsOn(testing.suites) - } -} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java deleted file mode 100644 index 64894df76d0e..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureHttpClientInstrumentation.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; - -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; -import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.SuppressNestedClientHelper.disallowNestedClientSpanMono; -import static io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.SuppressNestedClientHelper.disallowNestedClientSpanSync; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.returns; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import com.azure.core.http.HttpResponse; -import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; -import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import reactor.core.publisher.Mono; - -public class AzureHttpClientInstrumentation implements TypeInstrumentation { - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("com.azure.core.http.HttpClient")); - } - - @Override - public void transform(TypeTransformer transformer) { - transformer.applyAdviceToMethod( - isMethod() - .and(isPublic()) - .and(named("send")) - .and(takesArgument(1, named("com.azure.core.util.Context"))) - .and(returns(named("reactor.core.publisher.Mono"))), - this.getClass().getName() + "$SuppressNestedClientMonoAdvice"); - transformer.applyAdviceToMethod( - isMethod() - .and(isPublic()) - .and(named("sendSync")) - .and(takesArgument(1, named("com.azure.core.util.Context"))) - .and(returns(named("com.azure.core.http.HttpResponse"))), - this.getClass().getName() + "$SuppressNestedClientSyncAdvice"); - } - - @SuppressWarnings("unused") - public static class SuppressNestedClientMonoAdvice { - @Advice.OnMethodExit(suppress = Throwable.class) - public static void asyncSendExit( - @Advice.Argument(1) com.azure.core.util.Context azContext, - @Advice.Return(readOnly = false) Mono mono) { - mono = disallowNestedClientSpanMono(mono, azContext); - } - } - - @SuppressWarnings("unused") - public static class SuppressNestedClientSyncAdvice { - - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void syncSendEnter( - @Advice.Argument(1) com.azure.core.util.Context azContext, - @Advice.Local("otelScope") Scope scope) { - scope = disallowNestedClientSpanSync(azContext); - } - - @Advice.OnMethodExit(suppress = Throwable.class) - public static void syncSendExit( - @Advice.Return HttpResponse response, @Advice.Local("otelScope") Scope scope) { - if (scope != null) { - scope.close(); - } - } - } -} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java deleted file mode 100644 index 2eec753f6032..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkInstrumentationModule.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; - -import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static java.util.Arrays.asList; -import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; -import static net.bytebuddy.matcher.ElementMatchers.not; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.extension.instrumentation.HelperResourceBuilder; -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.extension.instrumentation.internal.ExperimentalInstrumentationModule; -import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; -import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode; -import java.util.List; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -@AutoService(InstrumentationModule.class) -public class AzureSdkInstrumentationModule extends InstrumentationModule - implements ExperimentalInstrumentationModule { - public AzureSdkInstrumentationModule() { - super("azure-core", "azure-core-1.53"); - } - - @Override - public void registerHelperResources(HelperResourceBuilder helperResourceBuilder) { - helperResourceBuilder.register( - "META-INF/services/com.azure.core.util.tracing.TracerProvider", - "azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider"); - // some azure sdks (e.g. EventHubs) are still looking up Tracer via service loader - // and not yet using the new TracerProvider - helperResourceBuilder.register( - "META-INF/services/com.azure.core.util.tracing.Tracer", - "azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer"); - } - - @Override - public void injectClasses(ClassInjector injector) { - injector - .proxyBuilder( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer") - .inject(InjectionMode.CLASS_ONLY); - injector - .proxyBuilder( - "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider") - .inject(InjectionMode.CLASS_ONLY); - } - - @Override - public ElementMatcher.Junction classLoaderMatcher() { - // this class was introduced in azure-core 1.53 - return hasClassesNamed("com.azure.core.util.LibraryTelemetryOptions") - .and(not(hasClassesNamed("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"))); - } - - @Override - public List typeInstrumentations() { - return asList(new EmptyTypeInstrumentation(), new AzureHttpClientInstrumentation()); - } - - public static class EmptyTypeInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - return namedOneOf( - "com.azure.core.util.tracing.TracerProvider", "com.azure.core.util.tracing.Tracer"); - } - - @Override - public void transform(TypeTransformer transformer) { - // Nothing to instrument, no methods to match - } - } -} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java deleted file mode 100644 index 37c25b5f2bd1..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/SuppressNestedClientHelper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; - -import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext; - -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.internal.SpanKey; -import reactor.core.CoreSubscriber; -import reactor.core.publisher.Mono; - -public class SuppressNestedClientHelper { - - public static Scope disallowNestedClientSpanSync(com.azure.core.util.Context azContext) { - Context parentContext = currentContext(); - boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); - if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { - return disallowNestedClientSpan(parentContext).makeCurrent(); - } - return null; - } - - public static Mono disallowNestedClientSpanMono( - Mono delegate, com.azure.core.util.Context azContext) { - return new Mono() { - @Override - public void subscribe(CoreSubscriber coreSubscriber) { - Context parentContext = currentContext(); - - boolean hasAzureClientSpan = azContext.getData("client-method-call-flag").isPresent(); - if (doesNotHaveClientSpan(parentContext) && hasAzureClientSpan) { - try (Scope ignored = disallowNestedClientSpan(parentContext).makeCurrent()) { - delegate.subscribe(coreSubscriber); - } - } else { - delegate.subscribe(coreSubscriber); - } - } - }; - } - - private static boolean doesNotHaveClientSpan(Context parentContext) { - return SpanKey.KIND_CLIENT.fromContextOrNull(parentContext) == null - && SpanKey.HTTP_CLIENT.fromContextOrNull(parentContext) == null; - } - - private static Context disallowNestedClientSpan(Context parentContext) { - Span span = Span.getInvalid(); - return SpanKey.HTTP_CLIENT.storeInContext( - SpanKey.KIND_CLIENT.storeInContext(parentContext, span), span); - } - - private SuppressNestedClientHelper() {} -} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer deleted file mode 100644 index ac10fa408e6d..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.Tracer +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracer diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider b/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider deleted file mode 100644 index 4d7af1762308..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/main/resources/azure-core-1.53/META-INF/services/com.azure.core.util.tracing.TracerProvider +++ /dev/null @@ -1 +0,0 @@ -io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry.OpenTelemetryTracerProvider diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java deleted file mode 100644 index 111a37db4c44..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTest.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.azure.core.annotation.ExpectedResponses; -import com.azure.core.annotation.Get; -import com.azure.core.annotation.Host; -import com.azure.core.annotation.ServiceInterface; -import com.azure.core.http.HttpClient; -import com.azure.core.http.HttpPipeline; -import com.azure.core.http.HttpPipelineBuilder; -import com.azure.core.http.policy.HttpPipelinePolicy; -import com.azure.core.http.policy.HttpPolicyProviders; -import com.azure.core.http.rest.Response; -import com.azure.core.http.rest.RestProxy; -import com.azure.core.test.http.MockHttpResponse; -import com.azure.core.util.ClientOptions; -import com.azure.core.util.Context; -import com.azure.core.util.TracingOptions; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.api.internal.SpanKey; -import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.sdk.trace.data.StatusData; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; - -class AzureSdkTest { - - @RegisterExtension - public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - - @Test - void testHelperClassesInjected() { - com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); - assertThat(azTracer.isEnabled()).isTrue(); - - assertThat(azTracer.getClass().getName()) - .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); - } - - @Test - void testSpan() { - com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); - Context context = azTracer.start("hello", Context.NONE); - azTracer.end(null, null, context); - - testing.waitAndAssertTracesWithoutScopeVersionVerification( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("hello") - .hasKind(SpanKind.INTERNAL) - .hasStatus(StatusData.unset()) - .hasAttributesSatisfying(Attributes::isEmpty))); - } - - @Test - void testPipelineAndSuppression() { - AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); - - HttpClient mockClient = - request -> - Mono.defer( - () -> { - // check if suppression is working - hasClientAndHttpKeys.set(hasClientAndHttpSpans()); - return Mono.just(new MockHttpResponse(request, 200)); - }); - - StepVerifier.create(createService(mockClient, true).testMethod()) - .expectNextCount(1) - .expectComplete() - .verify(); - - assertThat(hasClientAndHttpKeys.get()).isTrue(); - testing.waitAndAssertTracesWithoutScopeVersionVerification( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("myService.testMethod") - .hasKind(SpanKind.INTERNAL) - .hasStatus(StatusData.unset()) - .hasAttributesSatisfying(Attributes::isEmpty), - span -> - span.hasName("GET").hasKind(SpanKind.CLIENT).hasStatus(StatusData.unset()))); - } - - @Test - void testDisabledTracingNoSuppression() { - AtomicBoolean hasClientAndHttpKeys = new AtomicBoolean(false); - - HttpClient mockClient = - request -> - Mono.defer( - () -> { - // check no suppression - hasClientAndHttpKeys.set(hasClientAndHttpSpans()); - return Mono.just(new MockHttpResponse(request, 200)); - }); - - StepVerifier.create(createService(mockClient, false).testMethod()) - .expectNextCount(1) - .expectComplete() - .verify(); - - assertThat(hasClientAndHttpKeys.get()).isFalse(); - } - - private static com.azure.core.util.tracing.Tracer createAzTracer() { - com.azure.core.util.tracing.TracerProvider azProvider = - com.azure.core.util.tracing.TracerProvider.getDefaultProvider(); - return azProvider.createTracer("test-lib", "test-version", "otel.tests", null); - } - - private static TestInterface createService(HttpClient httpClient, boolean tracingEnabled) { - List policies = new ArrayList<>(); - HttpPolicyProviders.addAfterRetryPolicies(policies); - - ClientOptions clientOptions = - new ClientOptions().setTracingOptions(new TracingOptions().setEnabled(tracingEnabled)); - HttpPipeline pipeline = - new HttpPipelineBuilder() - .policies(policies.toArray(new HttpPipelinePolicy[0])) - .httpClient(httpClient) - .clientOptions(clientOptions) - .build(); - - return RestProxy.create(TestInterface.class, pipeline); - } - - private static boolean hasClientAndHttpSpans() { - io.opentelemetry.context.Context ctx = io.opentelemetry.context.Context.current(); - return SpanKey.KIND_CLIENT.fromContextOrNull(ctx) != null - && SpanKey.HTTP_CLIENT.fromContextOrNull(ctx) != null; - } - - @Host("https://azure.com") - @ServiceInterface(name = "myService") - interface TestInterface { - @Get("path") - @ExpectedResponses({200}) - Mono> testMethod(); - } -} diff --git a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java deleted file mode 100644 index 90bd941fd747..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_53/AzureSdkTestOld.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.azurecore.v1_53; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.azure.core.util.Context; -import com.azure.core.util.tracing.Tracer; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; -import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.sdk.trace.data.StatusData; -import java.util.Iterator; -import java.util.ServiceLoader; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -// some azure sdks (e.g. EventHubs) are still looking up Tracer via service loader -// and not yet using the new TracerProvider -class AzureSdkTestOld { - - @RegisterExtension - public static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); - - @Test - void testHelperClassesInjected() { - com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); - assertThat(azTracer.isEnabled()).isTrue(); - - assertThat(azTracer.getClass().getName()) - .endsWith("com.azure.core.tracing.opentelemetry.OpenTelemetryTracer"); - } - - @Test - void testSpan() { - com.azure.core.util.tracing.Tracer azTracer = createAzTracer(); - Context context = azTracer.start("hello", Context.NONE); - azTracer.end(null, null, context); - - testing.waitAndAssertTracesWithoutScopeVersionVerification( - trace -> - trace.hasSpansSatisfyingExactly( - span -> - span.hasName("hello") - .hasKind(SpanKind.INTERNAL) - .hasStatus(StatusData.unset()) - .hasAttributesSatisfying(Attributes::isEmpty))); - } - - private static com.azure.core.util.tracing.Tracer createAzTracer() { - Iterable tracers = - ServiceLoader.load(com.azure.core.util.tracing.Tracer.class); - Iterator it = tracers.iterator(); - return it.hasNext() ? it.next() : null; - } -} diff --git a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts b/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts deleted file mode 100644 index db9f39f225f6..000000000000 --- a/instrumentation/azure-core/azure-core-1.53/library-instrumentation-shaded/build.gradle.kts +++ /dev/null @@ -1,30 +0,0 @@ -plugins { - id("com.gradleup.shadow") - id("otel.java-conventions") -} - -group = "io.opentelemetry.javaagent.instrumentation" - -dependencies { - // this is the last good version that works with indy build - // update to the latest once https://github.com/Azure/azure-sdk-for-java/pull/42586 is released. - implementation("com.azure:azure-core-tracing-opentelemetry:1.0.0-beta.45") -} - -tasks { - shadowJar { - exclude("META-INF/services/*") - - dependencies { - // including only azure-core-tracing-opentelemetry excludes its transitive dependencies - include(dependency("com.azure:azure-core-tracing-opentelemetry")) - } - relocate("com.azure.core.tracing.opentelemetry", "io.opentelemetry.javaagent.instrumentation.azurecore.v1_53.shaded.com.azure.core.tracing.opentelemetry") - } - - val extractShadowJar by registering(Copy::class) { - dependsOn(shadowJar) - from(zipTree(shadowJar.get().archiveFile)) - into("build/extracted/shadow") - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 82c41cf90a89..c9e944fdb48c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -217,8 +217,6 @@ include(":instrumentation:azure-core:azure-core-1.19:javaagent") include(":instrumentation:azure-core:azure-core-1.19:library-instrumentation-shaded") include(":instrumentation:azure-core:azure-core-1.36:javaagent") include(":instrumentation:azure-core:azure-core-1.36:library-instrumentation-shaded") -include(":instrumentation:azure-core:azure-core-1.53:javaagent") -include(":instrumentation:azure-core:azure-core-1.53:library-instrumentation-shaded") include(":instrumentation:c3p0-0.9:javaagent") include(":instrumentation:c3p0-0.9:library") include(":instrumentation:c3p0-0.9:testing") From 52a7f500214f00037da17e4c1377fd967428b0ec Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 26 Oct 2024 08:26:05 -0700 Subject: [PATCH 8/9] feedback --- .../instrumentation/azurecore/v1_36/AzureSdkTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index 8ac1a352d946..e1e757feb8be 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import io.opentelemetry.semconv.HttpAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import reactor.core.publisher.Mono; @@ -95,12 +96,12 @@ void testPipelineAndSuppression() { span.hasName("myService.testMethod") .hasKind(SpanKind.INTERNAL) .hasStatus(StatusData.unset()) - .hasAttributesSatisfyingExactly(), + .hasAttributes(Attributes.empty()), span -> span.hasKind(SpanKind.CLIENT) .hasName(Boolean.getBoolean("testLatestDeps") ? "GET" : "HTTP GET") .hasStatus(StatusData.unset()) - .hasAttribute(AttributeKey.longKey("http.response.status_code"), 200L))); + .hasAttribute(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200L))); } @Test From 65d6f002adfa2915319ac1db6be77ad57004d0c0 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 26 Oct 2024 09:02:04 -0700 Subject: [PATCH 9/9] spotless --- .../instrumentation/azurecore/v1_36/AzureSdkTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java index e1e757feb8be..f3be2c2129d0 100644 --- a/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/testAzure/java/io/opentelemetry/javaagent/instrumentation/azurecore/v1_36/AzureSdkTest.java @@ -22,17 +22,16 @@ import com.azure.core.util.ClientOptions; import com.azure.core.util.Context; import com.azure.core.util.TracingOptions; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.SpanKey; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.sdk.trace.data.StatusData; +import io.opentelemetry.semconv.HttpAttributes; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; -import io.opentelemetry.semconv.HttpAttributes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import reactor.core.publisher.Mono;