Skip to content

Commit d37c1c7

Browse files
authored
Add file configuration ComponentProvider support for propagators (open-telemetry#6624)
1 parent 938b03d commit d37c1c7

10 files changed

Lines changed: 233 additions & 23 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.trace.propagation.internal;
7+
8+
import io.opentelemetry.context.propagation.TextMapPropagator;
9+
import io.opentelemetry.extension.trace.propagation.B3Propagator;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
12+
13+
/**
14+
* File configuration SPI implementation for {@link B3Propagator} which allows enables the {@link
15+
* B3Propagator#injectingSingleHeader()}.
16+
*
17+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
18+
* at any time.
19+
*/
20+
public final class B3ComponentProvider implements ComponentProvider<TextMapPropagator> {
21+
22+
@Override
23+
public Class<TextMapPropagator> getType() {
24+
return TextMapPropagator.class;
25+
}
26+
27+
@Override
28+
public String getName() {
29+
return "b3";
30+
}
31+
32+
@Override
33+
public TextMapPropagator create(StructuredConfigProperties config) {
34+
return B3Propagator.injectingSingleHeader();
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.trace.propagation.internal;
7+
8+
import io.opentelemetry.context.propagation.TextMapPropagator;
9+
import io.opentelemetry.extension.trace.propagation.B3Propagator;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
12+
13+
/**
14+
* File configuration SPI implementation for {@link B3Propagator} which allows enables the {@link
15+
* B3Propagator#injectingMultiHeaders()}.
16+
*
17+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
18+
* at any time.
19+
*/
20+
public final class B3MultiComponentProvider implements ComponentProvider<TextMapPropagator> {
21+
22+
@Override
23+
public Class<TextMapPropagator> getType() {
24+
return TextMapPropagator.class;
25+
}
26+
27+
@Override
28+
public String getName() {
29+
return "b3multi";
30+
}
31+
32+
@Override
33+
public TextMapPropagator create(StructuredConfigProperties config) {
34+
return B3Propagator.injectingMultiHeaders();
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.trace.propagation.internal;
7+
8+
import io.opentelemetry.context.propagation.TextMapPropagator;
9+
import io.opentelemetry.extension.trace.propagation.JaegerPropagator;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
12+
13+
/**
14+
* File configuration SPI implementation for {@link JaegerPropagator}.
15+
*
16+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
17+
* at any time.
18+
*/
19+
public final class JaegerComponentProvider implements ComponentProvider<TextMapPropagator> {
20+
21+
@Override
22+
public Class<TextMapPropagator> getType() {
23+
return TextMapPropagator.class;
24+
}
25+
26+
@Override
27+
public String getName() {
28+
return "jaeger";
29+
}
30+
31+
@Override
32+
public TextMapPropagator create(StructuredConfigProperties config) {
33+
return JaegerPropagator.getInstance();
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.trace.propagation.internal;
7+
8+
import io.opentelemetry.context.propagation.TextMapPropagator;
9+
import io.opentelemetry.extension.trace.propagation.B3Propagator;
10+
import io.opentelemetry.extension.trace.propagation.OtTracePropagator;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
12+
import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
13+
14+
/**
15+
* File configuration SPI implementation for {@link B3Propagator}.
16+
*
17+
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
18+
* at any time.
19+
*/
20+
public final class OtTraceComponentProvider implements ComponentProvider<TextMapPropagator> {
21+
22+
@Override
23+
public Class<TextMapPropagator> getType() {
24+
return TextMapPropagator.class;
25+
}
26+
27+
@Override
28+
public String getName() {
29+
return "ottrace";
30+
}
31+
32+
@Override
33+
public TextMapPropagator create(StructuredConfigProperties config) {
34+
return OtTracePropagator.getInstance();
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
io.opentelemetry.extension.trace.propagation.internal.B3ComponentProvider
2+
io.opentelemetry.extension.trace.propagation.internal.B3MultiComponentProvider
3+
io.opentelemetry.extension.trace.propagation.internal.JaegerComponentProvider
4+
io.opentelemetry.extension.trace.propagation.internal.OtTraceComponentProvider

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactory.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,13 @@
88
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
99
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1010
import io.opentelemetry.context.propagation.TextMapPropagator;
11-
import io.opentelemetry.sdk.autoconfigure.internal.NamedSpiManager;
1211
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
13-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider;
1412
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
15-
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1613
import java.io.Closeable;
14+
import java.util.ArrayList;
1715
import java.util.Arrays;
1816
import java.util.Collections;
19-
import java.util.LinkedHashSet;
2017
import java.util.List;
21-
import java.util.Set;
2218

2319
final class TextMapPropagatorFactory implements Factory<List<String>, TextMapPropagator> {
2420

@@ -45,33 +41,23 @@ public TextMapPropagator create(
4541
return TextMapPropagator.noop();
4642
}
4743

48-
NamedSpiManager<TextMapPropagator> spiPropagatorsManager =
49-
spiHelper.loadConfigurable(
50-
ConfigurablePropagatorProvider.class,
51-
ConfigurablePropagatorProvider::getName,
52-
ConfigurablePropagatorProvider::getPropagator,
53-
DefaultConfigProperties.createFromMap(Collections.emptyMap()));
54-
Set<TextMapPropagator> propagators = new LinkedHashSet<>();
44+
List<TextMapPropagator> propagators = new ArrayList<>();
5545
for (String propagator : model) {
56-
propagators.add(getPropagator(propagator, spiPropagatorsManager));
46+
propagators.add(getPropagator(spiHelper, propagator));
5747
}
5848

5949
return TextMapPropagator.composite(propagators);
6050
}
6151

62-
private static TextMapPropagator getPropagator(
63-
String name, NamedSpiManager<TextMapPropagator> spiPropagatorsManager) {
52+
private static TextMapPropagator getPropagator(SpiHelper spiHelper, String name) {
6453
if (name.equals("tracecontext")) {
6554
return W3CTraceContextPropagator.getInstance();
6655
}
6756
if (name.equals("baggage")) {
6857
return W3CBaggagePropagator.getInstance();
6958
}
7059

71-
TextMapPropagator spiPropagator = spiPropagatorsManager.getByName(name);
72-
if (spiPropagator != null) {
73-
return spiPropagator;
74-
}
75-
throw new ConfigurationException("Unrecognized propagator: " + name);
60+
return FileConfigUtil.loadComponent(
61+
spiHelper, TextMapPropagator.class, name, Collections.emptyMap());
7662
}
7763
}

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/FileConfigurationCreateTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ void parseAndCreate_Examples(@TempDir Path tempDir)
8686
"client_key: .*\n", "client_key: " + clientKeyPath + System.lineSeparator())
8787
.replaceAll(
8888
"client_certificate: .*\n",
89-
"client_certificate: " + clientCertificatePath + System.lineSeparator());
89+
"client_certificate: " + clientCertificatePath + System.lineSeparator())
90+
// TODO: remove once ComponentProvider SPI implemented in
91+
// https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator
92+
.replaceAll("xray,", "");
9093
InputStream is =
9194
new ByteArrayInputStream(rewrittenExampleContent.getBytes(StandardCharsets.UTF_8));
9295

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/TextMapPropagatorFactoryTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import io.opentelemetry.extension.trace.propagation.OtTracePropagator;
1717
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1818
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.component.TextMapPropagatorComponentProvider;
20+
import java.util.ArrayList;
1921
import java.util.Arrays;
2022
import java.util.Collections;
2123
import java.util.List;
@@ -68,12 +70,28 @@ void create_NoneAndOther() {
6870
}
6971

7072
@Test
71-
void create_UnknownSpiPropagator() {
73+
void create_SpiPropagator_Unknown() {
7274
assertThatThrownBy(
7375
() ->
7476
TextMapPropagatorFactory.getInstance()
7577
.create(Collections.singletonList("foo"), spiHelper, Collections.emptyList()))
7678
.isInstanceOf(ConfigurationException.class)
77-
.hasMessage("Unrecognized propagator: foo");
79+
.hasMessage(
80+
"No component provider detected for io.opentelemetry.context.propagation.TextMapPropagator with name \"foo\".");
81+
}
82+
83+
@Test
84+
void create_SpiPropagator_Valid() {
85+
TextMapPropagator textMapPropagator =
86+
TextMapPropagatorFactory.getInstance()
87+
.create(Collections.singletonList("test"), spiHelper, new ArrayList<>());
88+
assertThat(textMapPropagator)
89+
.isInstanceOfSatisfying(
90+
TextMapPropagatorComponentProvider.TestTextMapPropagator.class,
91+
testTextMapPropagator ->
92+
assertThat(testTextMapPropagator.config)
93+
.isInstanceOfSatisfying(
94+
YamlStructuredConfigProperties.class,
95+
config -> assertThat(config.getPropertyKeys()).isEmpty()));
7896
}
7997
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig.component;
7+
8+
import io.opentelemetry.context.Context;
9+
import io.opentelemetry.context.propagation.TextMapGetter;
10+
import io.opentelemetry.context.propagation.TextMapPropagator;
11+
import io.opentelemetry.context.propagation.TextMapSetter;
12+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
13+
import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties;
14+
import java.util.Collection;
15+
import java.util.Collections;
16+
import javax.annotation.Nullable;
17+
18+
public class TextMapPropagatorComponentProvider implements ComponentProvider<TextMapPropagator> {
19+
@Override
20+
public Class<TextMapPropagator> getType() {
21+
return TextMapPropagator.class;
22+
}
23+
24+
@Override
25+
public String getName() {
26+
return "test";
27+
}
28+
29+
@Override
30+
public TextMapPropagator create(StructuredConfigProperties config) {
31+
return new TestTextMapPropagator(config);
32+
}
33+
34+
public static class TestTextMapPropagator implements TextMapPropagator {
35+
36+
public final StructuredConfigProperties config;
37+
38+
private TestTextMapPropagator(StructuredConfigProperties config) {
39+
this.config = config;
40+
}
41+
42+
@Override
43+
public Collection<String> fields() {
44+
return Collections.emptyList();
45+
}
46+
47+
@Override
48+
public <C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter) {}
49+
50+
@Override
51+
public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {
52+
return context;
53+
}
54+
}
55+
}

sdk-extensions/incubator/src/test/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
io.opentelemetry.sdk.extension.incubator.fileconfig.component.MetricExporterComponentProvider
22
io.opentelemetry.sdk.extension.incubator.fileconfig.component.SpanExporterComponentProvider
33
io.opentelemetry.sdk.extension.incubator.fileconfig.component.LogRecordExporterComponentProvider
4+
io.opentelemetry.sdk.extension.incubator.fileconfig.component.TextMapPropagatorComponentProvider
45
io.opentelemetry.sdk.extension.incubator.fileconfig.component.SamplerComponentProvider
56
io.opentelemetry.sdk.extension.incubator.fileconfig.component.SpanProcessorComponentProvider
67
io.opentelemetry.sdk.extension.incubator.fileconfig.component.LogRecordProcessorComponentProvider

0 commit comments

Comments
 (0)