From 271577b82fd3fbaf19a1375f923f27d9dbb43bed Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Mon, 7 Jun 2021 12:55:51 +0900 Subject: [PATCH 1/2] Use autoconfigure SPI for trace-propagators extension. --- extensions/trace-propagators/build.gradle.kts | 2 ++ .../propagation/B3ConfigurablePropagator.java | 25 +++++++++++++++ .../B3MultiConfigurablePropagator.java | 26 +++++++++++++++ .../JaegerConfigurablePropagator.java | 25 +++++++++++++++ .../OtTraceConfigurablePropagator.java | 25 +++++++++++++++ ...nfigure.spi.ConfigurablePropagatorProvider | 4 +++ sdk-extensions/autoconfigure/build.gradle.kts | 1 - .../PropagatorConfiguration.java | 32 ++++--------------- .../sdk/autoconfigure/NotOnClasspathTest.java | 4 +-- .../sdk/autoconfigure/ConfigErrorTest.java | 4 ++- 10 files changed, 118 insertions(+), 30 deletions(-) create mode 100644 extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java create mode 100644 extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java create mode 100644 extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java create mode 100644 extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java create mode 100644 extensions/trace-propagators/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider diff --git a/extensions/trace-propagators/build.gradle.kts b/extensions/trace-propagators/build.gradle.kts index 2933f417a65..67683e5c57f 100644 --- a/extensions/trace-propagators/build.gradle.kts +++ b/extensions/trace-propagators/build.gradle.kts @@ -12,6 +12,8 @@ extra["moduleName"] = "io.opentelemetry.extension.trace.propagation" dependencies { api(project(":api:all")) + compileOnly(project(":sdk-extensions:autoconfigure")) + testImplementation("io.jaegertracing:jaeger-client") testImplementation("com.google.guava:guava") diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java new file mode 100644 index 00000000000..5c8900e3b8f --- /dev/null +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.extension.trace.propagation; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; + +/** + * A {@link ConfigurablePropagatorProvider} which allows enabling the {@linkplain + * B3Propagator#injectingSingleHeader()} B3-single propagator} with the propagator name {@code b3}. + */ +public class B3ConfigurablePropagator implements ConfigurablePropagatorProvider { + @Override + public TextMapPropagator getPropagator() { + return B3Propagator.injectingSingleHeader(); + } + + @Override + public String getName() { + return "b3"; + } +} diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java new file mode 100644 index 00000000000..55f38b02974 --- /dev/null +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.extension.trace.propagation; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; + +/** + * A {@link ConfigurablePropagatorProvider} which allows enabling the {@linkplain + * B3Propagator#injectingMultiHeaders() B3-multi propagator} with the propagator name {@code + * b3multi}. + */ +public class B3MultiConfigurablePropagator implements ConfigurablePropagatorProvider { + @Override + public TextMapPropagator getPropagator() { + return B3Propagator.injectingMultiHeaders(); + } + + @Override + public String getName() { + return "b3multi"; + } +} diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java new file mode 100644 index 00000000000..c3186e09d44 --- /dev/null +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.extension.trace.propagation; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; + +/** + * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link JaegerPropagator} with + * the propagator name {@code jaeger}. + */ +public class JaegerConfigurablePropagator implements ConfigurablePropagatorProvider { + @Override + public TextMapPropagator getPropagator() { + return JaegerPropagator.getInstance(); + } + + @Override + public String getName() { + return "jaeger"; + } +} diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java new file mode 100644 index 00000000000..3d5a3c59ee2 --- /dev/null +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.extension.trace.propagation; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; + +/** + * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link OtTracePropagator} with + * the propagator name {@code ottrace}. + */ +public class OtTraceConfigurablePropagator implements ConfigurablePropagatorProvider { + @Override + public TextMapPropagator getPropagator() { + return OtTracePropagator.getInstance(); + } + + @Override + public String getName() { + return "ottrace"; + } +} diff --git a/extensions/trace-propagators/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider b/extensions/trace-propagators/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider new file mode 100644 index 00000000000..f07ba17a1cd --- /dev/null +++ b/extensions/trace-propagators/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider @@ -0,0 +1,4 @@ +io.opentelemetry.extension.trace.propagation.B3ConfigurablePropagator +io.opentelemetry.extension.trace.propagation.B3MultiConfigurablePropagator +io.opentelemetry.extension.trace.propagation.JaegerConfigurablePropagator +io.opentelemetry.extension.trace.propagation.OtTraceConfigurablePropagator diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index e104346eeb1..b1e0a10e992 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -26,7 +26,6 @@ dependencies { implementation(project(":semconv")) - compileOnly(project(":extensions:trace-propagators")) compileOnly(project(":exporters:jaeger")) compileOnly(project(":exporters:logging")) compileOnly(project(":exporters:otlp:all")) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/PropagatorConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/PropagatorConfiguration.java index f66ba8d85fc..137a9fa7091 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/PropagatorConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/PropagatorConfiguration.java @@ -9,9 +9,6 @@ import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.extension.trace.propagation.B3Propagator; -import io.opentelemetry.extension.trace.propagation.JaegerPropagator; -import io.opentelemetry.extension.trace.propagation.OtTracePropagator; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; import java.util.Arrays; import java.util.LinkedHashSet; @@ -54,29 +51,14 @@ private static TextMapPropagator getPropagator( return W3CBaggagePropagator.getInstance(); } - // Other propagators are in the extension artifact. Check one of the propagators. - ClasspathUtil.checkClassExists( - "io.opentelemetry.extension.trace.propagation.B3Propagator", - name + " propagator", - "opentelemetry-extension-trace-propagators"); - - switch (name) { - case "b3": - return B3Propagator.injectingSingleHeader(); - case "b3multi": - return B3Propagator.injectingMultiHeaders(); - case "jaeger": - return JaegerPropagator.getInstance(); - // NB: https://github.com/open-telemetry/opentelemetry-specification/pull/1406 - case "ottrace": - return OtTracePropagator.getInstance(); - default: - TextMapPropagator spiPropagator = spiPropagators.get(name); - if (spiPropagator != null) { - return spiPropagator; - } - throw new ConfigurationException("Unrecognized value for otel.propagators: " + name); + TextMapPropagator spiPropagator = spiPropagators.get(name); + if (spiPropagator != null) { + return spiPropagator; } + throw new ConfigurationException( + "Unrecognized value for otel.propagators: " + + name + + ". Make sure the artifact including the propagator is on the classpath."); } private PropagatorConfiguration() {} diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java index c2686149f67..f047c671466 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/NotOnClasspathTest.java @@ -93,8 +93,6 @@ void b3propagator() { ConfigProperties.createForTest( Collections.singletonMap("otel.propagators", "b3")))) .isInstanceOf(ConfigurationException.class) - .hasMessageContaining( - "b3 propagator enabled but opentelemetry-extension-trace-propagators not found on " - + "classpath"); + .hasMessageContaining("Unrecognized value for otel.propagators: b3"); } } diff --git a/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java b/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java index 2b1507563e1..7de0a76b5d1 100644 --- a/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java +++ b/sdk-extensions/autoconfigure/src/testConfigError/java/io/opentelemetry/sdk/autoconfigure/ConfigErrorTest.java @@ -30,7 +30,9 @@ class ConfigErrorTest { void invalidPropagator() { assertThatThrownBy(OpenTelemetrySdkAutoConfiguration::initialize) .isInstanceOf(ConfigurationException.class) - .hasMessage("Unrecognized value for otel.propagators: cat"); + .hasMessage( + "Unrecognized value for otel.propagators: cat. Make sure the artifact " + + "including the propagator is on the classpath."); } @Test From c42a2491e68da9875316e8b7ac03d5a44fe8ad92 Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Mon, 7 Jun 2021 12:57:36 +0900 Subject: [PATCH 2/2] final --- .../extension/trace/propagation/B3ConfigurablePropagator.java | 2 +- .../trace/propagation/B3MultiConfigurablePropagator.java | 2 +- .../trace/propagation/JaegerConfigurablePropagator.java | 2 +- .../trace/propagation/OtTraceConfigurablePropagator.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java index 5c8900e3b8f..4bbd434aeac 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3ConfigurablePropagator.java @@ -12,7 +12,7 @@ * A {@link ConfigurablePropagatorProvider} which allows enabling the {@linkplain * B3Propagator#injectingSingleHeader()} B3-single propagator} with the propagator name {@code b3}. */ -public class B3ConfigurablePropagator implements ConfigurablePropagatorProvider { +public final class B3ConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator() { return B3Propagator.injectingSingleHeader(); diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java index 55f38b02974..34945a16f09 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/B3MultiConfigurablePropagator.java @@ -13,7 +13,7 @@ * B3Propagator#injectingMultiHeaders() B3-multi propagator} with the propagator name {@code * b3multi}. */ -public class B3MultiConfigurablePropagator implements ConfigurablePropagatorProvider { +public final class B3MultiConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator() { return B3Propagator.injectingMultiHeaders(); diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java index c3186e09d44..720f8e7d970 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerConfigurablePropagator.java @@ -12,7 +12,7 @@ * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link JaegerPropagator} with * the propagator name {@code jaeger}. */ -public class JaegerConfigurablePropagator implements ConfigurablePropagatorProvider { +public final class JaegerConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator() { return JaegerPropagator.getInstance(); diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java index 3d5a3c59ee2..943d771fef9 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTraceConfigurablePropagator.java @@ -12,7 +12,7 @@ * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link OtTracePropagator} with * the propagator name {@code ottrace}. */ -public class OtTraceConfigurablePropagator implements ConfigurablePropagatorProvider { +public final class OtTraceConfigurablePropagator implements ConfigurablePropagatorProvider { @Override public TextMapPropagator getPropagator() { return OtTracePropagator.getInstance();