From 7e4c0fd615783c9f4d10a1706362616bacaaef65 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 11 Jul 2023 09:07:55 -0700 Subject: [PATCH] Fix instrumentation of Azure SDK EventHubs library (#8916) --- .../v1_36/AzureSdkInstrumentationModule.java | 10 +++- .../com.azure.core.util.tracing.Tracer | 1 + .../src/test/java/AzureSdkTestOld.java | 60 +++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 instrumentation/azure-core/azure-core-1.36/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.36/javaagent/src/test/java/AzureSdkTestOld.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 2f3f4b4472..212d10d109 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 @@ -7,7 +7,7 @@ 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.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; @@ -30,6 +30,11 @@ public class AzureSdkInstrumentationModule extends InstrumentationModule { 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 @@ -47,7 +52,8 @@ public class AzureSdkInstrumentationModule extends InstrumentationModule { public static class EmptyTypeInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return named("com.azure.core.util.tracing.TracerProvider"); + return namedOneOf( + "com.azure.core.util.tracing.TracerProvider", "com.azure.core.util.tracing.Tracer"); } @Override diff --git a/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer b/instrumentation/azure-core/azure-core-1.36/javaagent/src/main/resources/azure-core-1.36/META-INF/services/com.azure.core.util.tracing.Tracer new file mode 100644 index 0000000000..00cafebf9a --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.36/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.36/javaagent/src/test/java/AzureSdkTestOld.java b/instrumentation/azure-core/azure-core-1.36/javaagent/src/test/java/AzureSdkTestOld.java new file mode 100644 index 0000000000..4adf7049c6 --- /dev/null +++ b/instrumentation/azure-core/azure-core-1.36/javaagent/src/test/java/AzureSdkTestOld.java @@ -0,0 +1,60 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +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; + } +}