From 2268defc7229dac5aa000a65c8978e3983e395c3 Mon Sep 17 00:00:00 2001 From: brunobat Date: Wed, 12 Apr 2023 09:48:54 +0100 Subject: [PATCH] xray propagation in an IT test --- bom/application/pom.xml | 72 ------------------- docs/src/main/asciidoc/opentelemetry.adoc | 16 ++--- extensions/opentelemetry/deployment/pom.xml | 17 ----- .../deployment/tracing/TracerProcessor.java | 5 ++ .../OpenTelemetryLegacyConfigurationTest.java | 4 ++ .../OpenTelemetryPropagatorsTest.java | 31 -------- .../runtime/OpenTelemetryUtil.java | 44 ------------ .../OTelFallbackConfigSourceInterceptor.java | 2 + integration-tests/opentelemetry-spi/pom.xml | 6 ++ .../opentelemetry/spi/ExporterResource.java | 13 ++++ .../src/main/resources/application.properties | 1 + .../OpenTelemetryPropagatorsIT.java | 7 ++ .../OpenTelemetryPropagatorsTest.java | 28 ++++++++ 13 files changed, 74 insertions(+), 172 deletions(-) delete mode 100644 extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryPropagatorsTest.java create mode 100644 integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsIT.java create mode 100644 integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsTest.java diff --git a/bom/application/pom.xml b/bom/application/pom.xml index deee8abce6db1..acb6c5873717f 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -38,8 +38,6 @@ 0.1.5 1.23.1 1.23.0-alpha - 1.23.0-alpha - 1.23.0 1.8.1 5.0.1.Final 1.10.5 @@ -3923,76 +3921,6 @@ rxjava ${rxjava.version} - - - io.opentelemetry.contrib - opentelemetry-aws-xray-propagator - ${opentelemetry-aws.contrib.version} - - - io.opentelemetry - opentelemetry-api - - - - - io.opentelemetry.contrib - opentelemetry-aws-resources - ${opentelemetry-aws.contrib.version} - - - io.opentelemetry - opentelemetry-api - - - io.opentelemetry - opentelemetry-sdk - - - io.opentelemetry - opentelemetry-semconv - - - com.fasterxml.jackson.core - jackson-core - - - com.squareup.okhttp3 - okhttp - - - - - io.opentelemetry.contrib - opentelemetry-aws-xray - ${opentelemetry-aws-xray.contrib.version} - - - io.opentelemetry - opentelemetry-sdk - - - io.opentelemetry - opentelemetry-sdk-trace - - - io.opentelemetry - opentelemetry-semconv - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - com.squareup.okhttp3 - okhttp - - - io.opentracing opentracing-api diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index 96c7913e20c02..eb330845297b6 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -263,9 +263,9 @@ data across the lifespan of a distributed transaction. By default, the OpenTelemetry extension enables the https://www.w3.org/TR/trace-context/[W3C Trace Context] and the https://www.w3.org/TR/baggage/[W3C Baggage] propagators, you can however choose any of the supported OpenTelemetry propagators by setting the `propagators` config that is described in the <>. -[NOTE] -==== -The `b3`, `b3multi`, `jaeger` and `ottrace` propagators will need the https://github.com/open-telemetry/opentelemetry-java/tree/main/extensions/trace-propagators[trace-propagators] +==== Additional Propagators + +* The `b3`, `b3multi`, `jaeger` and `ottrace` propagators will need the https://github.com/open-telemetry/opentelemetry-java/tree/main/extensions/trace-propagators[trace-propagators] extension to be added as a dependency to your project. [source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] @@ -283,23 +283,23 @@ extension to be added as a dependency to your project. implementation("io.opentelemetry:opentelemetry-extension-trace-propagators") ---- -The `xray` propagator will need the https://github.com/open-telemetry/opentelemetry-java/tree/main/extensions/aws[aws] extension to be added as a dependency to your project. +* The `xray` propagator will need the https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator[aws] +extension to be added as a dependency to your project. [source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] .pom.xml ---- - io.opentelemetry - opentelemetry-extension-aws + io.opentelemetry.contrib + opentelemetry-aws-xray-propagator ---- [source,gradle,role="secondary asciidoc-tabs-target-sync-gradle"] .build.gradle ---- -implementation("io.opentelemetry:opentelemetry-extension-aws") +implementation("io.opentelemetry.contrib:opentelemetry-aws-xray-propagator") ---- -==== === Resource A https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/overview.md#resources[resource] is a representation diff --git a/extensions/opentelemetry/deployment/pom.xml b/extensions/opentelemetry/deployment/pom.xml index 1ac589ecce4e2..6bf02358c72a3 100644 --- a/extensions/opentelemetry/deployment/pom.xml +++ b/extensions/opentelemetry/deployment/pom.xml @@ -116,23 +116,6 @@ opentelemetry-jdbc test - - - - - - - - - - - - - - - - - io.quarkus quarkus-jdbc-h2-deployment diff --git a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/tracing/TracerProcessor.java b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/tracing/TracerProcessor.java index 1b80e915f4875..c958840b8e702 100644 --- a/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/tracing/TracerProcessor.java +++ b/extensions/opentelemetry/deployment/src/main/java/io/quarkus/opentelemetry/deployment/tracing/TracerProcessor.java @@ -14,6 +14,7 @@ import org.jboss.jandex.IndexView; import org.jboss.jandex.MethodInfo; +import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.SpanProcessor; @@ -46,6 +47,7 @@ public class TracerProcessor { private static final DotName SAMPLER = DotName.createSimple(Sampler.class.getName()); private static final DotName SPAN_EXPORTER = DotName.createSimple(SpanExporter.class.getName()); private static final DotName SPAN_PROCESSOR = DotName.createSimple(SpanProcessor.class.getName()); + private static final DotName TEXT_MAP_PROPAGATOR = DotName.createSimple(TextMapPropagator.class.getName()); @BuildStep UnremovableBeanBuildItem ensureProducersAreRetained( @@ -83,6 +85,9 @@ UnremovableBeanBuildItem ensureProducersAreRetained( knownClasses.add(SPAN_PROCESSOR.toString()); index.getAllKnownImplementors(SPAN_PROCESSOR) .forEach(classInfo -> knownClasses.add(classInfo.name().toString())); + knownClasses.add(TEXT_MAP_PROPAGATOR.toString()); + index.getAllKnownImplementors(TEXT_MAP_PROPAGATOR) + .forEach(classInfo -> knownClasses.add(classInfo.name().toString())); Set retainProducers = new HashSet<>(); diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryLegacyConfigurationTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryLegacyConfigurationTest.java index b76bf259b7ce6..79cd04d59c38b 100644 --- a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryLegacyConfigurationTest.java +++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryLegacyConfigurationTest.java @@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.Arrays; + import jakarta.inject.Inject; import org.junit.jupiter.api.Test; @@ -21,6 +23,7 @@ class OpenTelemetryLegacyConfigurationTest { static final QuarkusUnitTest TEST = new QuarkusUnitTest() .overrideConfigKey("quarkus.opentelemetry.enabled", "false") .overrideConfigKey("quarkus.opentelemetry.tracer.enabled", "false") + .overrideConfigKey("quarkus.opentelemetry.propagators", "tracecontext") .overrideConfigKey("quarkus.opentelemetry.tracer.suppress-non-application-uris", "false") .overrideConfigKey("quarkus.opentelemetry.tracer.include-static-resources", "true") .overrideConfigKey("quarkus.opentelemetry.tracer.sampler", "off") @@ -43,6 +46,7 @@ void config() { assertEquals(FALSE, oTelBuildConfig.enabled()); assertTrue(oTelBuildConfig.traces().enabled().isPresent()); assertEquals(FALSE, oTelBuildConfig.traces().enabled().get()); + assertEquals(Arrays.asList("tracecontext"), oTelBuildConfig.propagators()); // will not include the default baggagge assertEquals(FALSE, oTelRuntimeConfig.traces().suppressNonApplicationUris()); assertEquals(TRUE, oTelRuntimeConfig.traces().includeStaticResources()); assertEquals("always_off", oTelBuildConfig.traces().sampler()); diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryPropagatorsTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryPropagatorsTest.java deleted file mode 100644 index 1a6db4f3cc10d..0000000000000 --- a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryPropagatorsTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.quarkus.opentelemetry.deployment; - -import jakarta.inject.Inject; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.quarkus.opentelemetry.deployment.common.TestUtil; -import io.quarkus.test.QuarkusUnitTest; - -@Disabled("We need to move the AWS dependency testing to an independent module") -public class OpenTelemetryPropagatorsTest { - @RegisterExtension - static final QuarkusUnitTest unitTest = new QuarkusUnitTest() - .overrideConfigKey("quarkus.opentelemetry.propagators", "tracecontext,xray") - .withApplicationRoot((jar) -> jar.addClass(TestUtil.class)); - - @Inject - OpenTelemetry openTelemetry; - - @Test - void test() throws NoSuchFieldException, IllegalAccessException { - TextMapPropagator[] textMapPropagators = TestUtil.getTextMapPropagators(openTelemetry); - - // assertThat(textMapPropagators, arrayContainingInAnyOrder(W3CTraceContextPropagator.getInstance(), - // AwsXrayPropagator.getInstance())); - } -} diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/OpenTelemetryUtil.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/OpenTelemetryUtil.java index 151006e3ba31d..6ab6ffac43112 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/OpenTelemetryUtil.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/OpenTelemetryUtil.java @@ -1,22 +1,13 @@ package io.quarkus.opentelemetry.runtime; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; -import java.util.Set; -import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.Context; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; import io.opentelemetry.sdk.trace.ReadableSpan; import io.quarkus.vertx.core.runtime.VertxMDC; @@ -29,41 +20,6 @@ public final class OpenTelemetryUtil { private OpenTelemetryUtil() { } - private static TextMapPropagator getPropagator( - String name, Map spiPropagators) { - if ("tracecontext".equals(name)) { - return W3CTraceContextPropagator.getInstance(); - } - if ("baggage".equals(name)) { - return W3CBaggagePropagator.getInstance(); - } - - TextMapPropagator spiPropagator = spiPropagators.get(name); - if (spiPropagator != null) { - return spiPropagator; - } - throw new IllegalArgumentException( - "Unrecognized value for propagator: " + name - + ". Make sure the artifact including the propagator is on the classpath."); - } - - public static ContextPropagators mapPropagators(List propagators) { - Map spiPropagators = new HashMap<>(); - for (var provider : ServiceLoader.load(ConfigurablePropagatorProvider.class)) { - // Even though this param was added, propagators currently don't use any config properties - // when the time arrives, and they do use it, we will need to implement a Quarkus - // backed `ConfigProperties` class - spiPropagators.put(provider.getName(), provider.getPropagator(null)); - } - - Set selectedPropagators = new HashSet<>(propagators.size()); - for (String propagator : propagators) { - selectedPropagators.add(getPropagator(propagator.trim(), spiPropagators)); - } - - return ContextPropagators.create(TextMapPropagator.composite(selectedPropagators)); - } - /** * Converts a list of "key=value" pairs into a map. * Empty entries will be removed. diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/OTelFallbackConfigSourceInterceptor.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/OTelFallbackConfigSourceInterceptor.java index aaf47e84c3306..ce1ea16693839 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/OTelFallbackConfigSourceInterceptor.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/OTelFallbackConfigSourceInterceptor.java @@ -21,6 +21,7 @@ public OTelFallbackConfigSourceInterceptor() { super(Map.of( "quarkus.otel.enabled", "quarkus.opentelemetry.enabled", "quarkus.otel.traces.enabled", "quarkus.opentelemetry.tracer.enabled", + "quarkus.otel.propagators", "quarkus.opentelemetry.propagators", "quarkus.otel.traces.suppress-non-application-uris", "quarkus.opentelemetry.tracer.suppress-non-application-uris", "quarkus.otel.traces.include-static-resources", "quarkus.opentelemetry.tracer.include-static-resources", @@ -50,6 +51,7 @@ public Iterator iterateNames(final ConfigSourceInterceptorContext contex // TODO - Required because the defaults ConfigSource for mappings does not provide configuration names. names.add("quarkus.otel.enabled"); names.add("quarkus.otel.metrics.exporter"); + names.add("quarkus.otel.propagators"); names.add("quarkus.otel.logs.exporter"); names.add("quarkus.otel.traces.enabled"); names.add("quarkus.otel.traces.exporter"); diff --git a/integration-tests/opentelemetry-spi/pom.xml b/integration-tests/opentelemetry-spi/pom.xml index 052bd173f6876..92d6f12e918b5 100644 --- a/integration-tests/opentelemetry-spi/pom.xml +++ b/integration-tests/opentelemetry-spi/pom.xml @@ -37,6 +37,12 @@ opentelemetry-sdk-testing + + io.opentelemetry.contrib + opentelemetry-aws-xray-propagator + 1.23.0-alpha + + io.quarkus diff --git a/integration-tests/opentelemetry-spi/src/main/java/io/quarkus/it/opentelemetry/spi/ExporterResource.java b/integration-tests/opentelemetry-spi/src/main/java/io/quarkus/it/opentelemetry/spi/ExporterResource.java index dfb717776dc7d..ef54c627da519 100644 --- a/integration-tests/opentelemetry-spi/src/main/java/io/quarkus/it/opentelemetry/spi/ExporterResource.java +++ b/integration-tests/opentelemetry-spi/src/main/java/io/quarkus/it/opentelemetry/spi/ExporterResource.java @@ -1,5 +1,6 @@ package io.quarkus.it.opentelemetry.spi; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -11,6 +12,8 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Response; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; import io.opentelemetry.sdk.trace.data.SpanData; @@ -19,6 +22,9 @@ public class ExporterResource { @Inject InMemorySpanExporter inMemorySpanExporter; + @Inject + OpenTelemetry openTelemetry; + @GET @Path("/reset") public Response reset() { @@ -35,6 +41,13 @@ public List export() { .collect(Collectors.toList()); } + @GET + @Path("/export/propagation") + public List exportPropagation() throws NoSuchFieldException, IllegalAccessException { + TextMapPropagator textMapPropagator = openTelemetry.getPropagators().getTextMapPropagator(); + return new ArrayList<>(textMapPropagator.fields()); + } + @ApplicationScoped static class InMemorySpanExporterProducer { @Produces diff --git a/integration-tests/opentelemetry-spi/src/main/resources/application.properties b/integration-tests/opentelemetry-spi/src/main/resources/application.properties index 306143b1cffb9..b08e1cd0930c4 100644 --- a/integration-tests/opentelemetry-spi/src/main/resources/application.properties +++ b/integration-tests/opentelemetry-spi/src/main/resources/application.properties @@ -3,6 +3,7 @@ quarkus.application.name=opentelemetry-integration-test-spi quarkus.application.version=999-SNAPSHOT quarkus.otel.traces.sampler=custom-spi-sampler +quarkus.otel.propagators=tracecontext,xray # speed up build quarkus.otel.bsp.schedule.delay=100 diff --git a/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsIT.java b/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsIT.java new file mode 100644 index 0000000000000..0f45f38510f6d --- /dev/null +++ b/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsIT.java @@ -0,0 +1,7 @@ +package io.quarkus.it.opentelemetry.spi.propagation; + +import io.quarkus.test.junit.QuarkusIntegrationTest; + +@QuarkusIntegrationTest +public class OpenTelemetryPropagatorsIT extends OpenTelemetryPropagatorsTest { +} diff --git a/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsTest.java b/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsTest.java new file mode 100644 index 0000000000000..0defc648be260 --- /dev/null +++ b/integration-tests/opentelemetry-spi/src/test/java/io/quarkus/it/opentelemetry/spi/propagation/OpenTelemetryPropagatorsTest.java @@ -0,0 +1,28 @@ +package io.quarkus.it.opentelemetry.spi.propagation; + +import static io.restassured.RestAssured.given; + +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +public class OpenTelemetryPropagatorsTest { + + @Test + void test() throws NoSuchFieldException, IllegalAccessException { + given() + .contentType("application/json") + .when().get("/export/propagation") + .then() + .statusCode(200) + .body("", Matchers.containsInAnyOrder( + //default baggage will be missing + //W3C headers: + "traceparent", + "tracestate", + //XRAY headers: + "X-Amzn-Trace-Id")); + } +}