Skip to content

Commit 31af9ff

Browse files
committed
Changes as of 3/11/2025
1 parent 396f02e commit 31af9ff

File tree

9 files changed

+226
-145
lines changed

9 files changed

+226
-145
lines changed

sdk-extensions/incubator/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ dependencies {
6262
// it was needed after 0.3.0 release because file_format in the examples weren't updated prior to the release tag
6363
// val configurationTag = "0.3.0"
6464
// val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit
65-
val configurationRef = "ebb5dba5735425e8785ac55450cad6f7aa1b9f2d"
65+
val configurationRef = "8425d9b03344ff96df181b9c46ec57ebdbc185e2"
6666
val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip"
6767
val buildDirectory = layout.buildDirectory.asFile.get()
6868

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

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55

66
package io.opentelemetry.sdk.extension.incubator.fileconfig;
77

8-
import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull;
9-
108
import io.opentelemetry.context.propagation.ContextPropagators;
119
import io.opentelemetry.context.propagation.TextMapPropagator;
1210
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1311
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel;
1413
import java.io.Closeable;
14+
import java.util.ArrayList;
15+
import java.util.Arrays;
16+
import java.util.HashSet;
1517
import java.util.List;
18+
import java.util.Set;
19+
import java.util.stream.Collectors;
1620

1721
final class PropagatorFactory implements Factory<PropagatorModel, ContextPropagators> {
1822

@@ -27,9 +31,41 @@ static PropagatorFactory getInstance() {
2731
@Override
2832
public ContextPropagators create(
2933
PropagatorModel model, SpiHelper spiHelper, List<Closeable> closeables) {
30-
List<String> compositeModel = requireNonNull(model.getComposite(), "composite propagator");
31-
TextMapPropagator textMapPropagator =
32-
TextMapPropagatorFactory.getInstance().create(compositeModel, spiHelper, closeables);
33-
return ContextPropagators.create(textMapPropagator);
34+
List<TextMapPropagatorModel> textMapPropagatorModels = model.getComposite();
35+
Set<String> propagatorNames = new HashSet<>();
36+
List<TextMapPropagator> textMapPropagators = new ArrayList<>();
37+
if (textMapPropagatorModels != null && !textMapPropagatorModels.isEmpty()) {
38+
textMapPropagatorModels.forEach(
39+
textMapPropagatorModel -> {
40+
TextMapPropagatorAndName propagatorAndName =
41+
TextMapPropagatorFactory.getInstance()
42+
.create(textMapPropagatorModel, spiHelper, closeables);
43+
textMapPropagators.add(propagatorAndName.getTextMapPropagator());
44+
propagatorNames.add(propagatorAndName.getName());
45+
});
46+
}
47+
48+
String compositeList = model.getCompositeList();
49+
if (compositeList != null) {
50+
List<String> propagatorNamesList =
51+
// Process string list same as we process OTEL_PROPAGATORS, trimming and filtering empty
52+
// and 'none'
53+
Arrays.asList(compositeList.split(",")).stream()
54+
.map(String::trim)
55+
.filter(s -> !s.isEmpty())
56+
.filter(s -> !s.equals("none"))
57+
.collect(Collectors.toList());
58+
for (String propagatorName : propagatorNamesList) {
59+
// Only add entries which weren't already previously added
60+
if (!propagatorNames.add(propagatorName)) {
61+
continue;
62+
}
63+
textMapPropagators.add(
64+
TextMapPropagatorFactory.getPropagator(spiHelper, propagatorName)
65+
.getTextMapPropagator());
66+
}
67+
}
68+
69+
return ContextPropagators.create(TextMapPropagator.composite(textMapPropagators));
3470
}
3571
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
7+
8+
import com.google.auto.value.AutoValue;
9+
import io.opentelemetry.context.propagation.TextMapPropagator;
10+
11+
@AutoValue
12+
abstract class TextMapPropagatorAndName {
13+
14+
static TextMapPropagatorAndName create(TextMapPropagator textMapPropagator, String name) {
15+
return new AutoValue_TextMapPropagatorAndName(textMapPropagator, name);
16+
}
17+
18+
abstract TextMapPropagator getTextMapPropagator();
19+
20+
abstract String getName();
21+
}

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

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@
55

66
package io.opentelemetry.sdk.extension.incubator.fileconfig;
77

8+
import static java.util.stream.Collectors.joining;
9+
810
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
911
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1012
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1113
import io.opentelemetry.context.propagation.TextMapPropagator;
1214
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
15+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel;
1316
import java.io.Closeable;
14-
import java.util.ArrayList;
15-
import java.util.Arrays;
1617
import java.util.Collections;
1718
import java.util.List;
19+
import java.util.Map;
1820

19-
final class TextMapPropagatorFactory implements Factory<List<String>, TextMapPropagator> {
21+
final class TextMapPropagatorFactory
22+
implements Factory<TextMapPropagatorModel, TextMapPropagatorAndName> {
2023

2124
private static final TextMapPropagatorFactory INSTANCE = new TextMapPropagatorFactory();
2225

@@ -27,37 +30,63 @@ static TextMapPropagatorFactory getInstance() {
2730
}
2831

2932
@Override
30-
public TextMapPropagator create(
31-
List<String> model, SpiHelper spiHelper, List<Closeable> closeables) {
32-
if (model.isEmpty()) {
33-
model = Arrays.asList("tracecontext", "baggage");
33+
public TextMapPropagatorAndName create(
34+
TextMapPropagatorModel model, SpiHelper spiHelper, List<Closeable> closeables) {
35+
if (model.getTracecontext() != null) {
36+
return getPropagator(spiHelper, "tracecontext");
3437
}
35-
36-
if (model.contains("none")) {
37-
if (model.size() > 1) {
38+
if (model.getBaggage() != null) {
39+
return getPropagator(spiHelper, "baggage");
40+
}
41+
if (model.getB3() != null) {
42+
return getPropagator(spiHelper, "b3");
43+
}
44+
if (model.getB3multi() != null) {
45+
return getPropagator(spiHelper, "b3multi");
46+
}
47+
if (model.getJaeger() != null) {
48+
return getPropagator(spiHelper, "jaeger");
49+
}
50+
if (model.getOttrace() != null) {
51+
return getPropagator(spiHelper, "ottrace");
52+
}
53+
if (!model.getAdditionalProperties().isEmpty()) {
54+
Map<String, Object> additionalProperties = model.getAdditionalProperties();
55+
if (additionalProperties.size() > 1) {
3856
throw new DeclarativeConfigException(
39-
"propagators contains \"none\" along with other propagators");
57+
"Invalid configuration - multiple propgators set: "
58+
+ additionalProperties.keySet().stream().collect(joining(",", "[", "]")));
4059
}
41-
return TextMapPropagator.noop();
42-
}
43-
44-
List<TextMapPropagator> propagators = new ArrayList<>();
45-
for (String propagator : model) {
46-
propagators.add(getPropagator(spiHelper, propagator));
60+
Map.Entry<String, Object> propagatorKeyValue =
61+
additionalProperties.entrySet().stream()
62+
.findFirst()
63+
.orElseThrow(
64+
() ->
65+
new IllegalStateException(
66+
"Missing propagator. This is a programming error."));
67+
TextMapPropagator propagator =
68+
FileConfigUtil.loadComponent(
69+
spiHelper,
70+
TextMapPropagator.class,
71+
propagatorKeyValue.getKey(),
72+
propagatorKeyValue.getValue());
73+
return TextMapPropagatorAndName.create(propagator, propagatorKeyValue.getKey());
74+
} else {
75+
throw new DeclarativeConfigException("propagator must be set");
4776
}
48-
49-
return TextMapPropagator.composite(propagators);
5077
}
5178

52-
private static TextMapPropagator getPropagator(SpiHelper spiHelper, String name) {
79+
static TextMapPropagatorAndName getPropagator(SpiHelper spiHelper, String name) {
80+
TextMapPropagator textMapPropagator;
5381
if (name.equals("tracecontext")) {
54-
return W3CTraceContextPropagator.getInstance();
55-
}
56-
if (name.equals("baggage")) {
57-
return W3CBaggagePropagator.getInstance();
82+
textMapPropagator = W3CTraceContextPropagator.getInstance();
83+
} else if (name.equals("baggage")) {
84+
textMapPropagator = W3CBaggagePropagator.getInstance();
85+
} else {
86+
textMapPropagator =
87+
FileConfigUtil.loadComponent(
88+
spiHelper, TextMapPropagator.class, name, Collections.emptyMap());
5889
}
59-
60-
return FileConfigUtil.loadComponent(
61-
spiHelper, TextMapPropagator.class, name, Collections.emptyMap());
90+
return TextMapPropagatorAndName.create(textMapPropagator, name);
6291
}
6392
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,7 @@ void parse_KitchenSinkExampleFile() throws IOException {
152152

153153
PropagatorModel propagator =
154154
new PropagatorModel()
155-
.withComposite(
156-
Arrays.asList(
157-
"tracecontext", "baggage", "b3", "b3multi", "jaeger", "xray", "ottrace"));
155+
.withCompositeList("tracecontext,baggage,b3,b3multi,jaeger,xray,ottrace");
158156
expected.withPropagator(propagator);
159157

160158
// TracerProvider config

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,7 @@ void create_Configured() {
212212
.withFileFormat("0.3")
213213
.withPropagator(
214214
new PropagatorModel()
215-
.withComposite(
216-
Arrays.asList(
217-
"tracecontext",
218-
"baggage",
219-
"ottrace",
220-
"b3multi",
221-
"b3",
222-
"jaeger")))
215+
.withCompositeList("tracecontext,baggage,ottrace,b3multi,b3,jaeger"))
223216
.withResource(
224217
new ResourceModel()
225218
.withAttributes(

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

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,31 @@
66
package io.opentelemetry.sdk.extension.incubator.fileconfig;
77

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
910

1011
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
12+
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
13+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1114
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1215
import io.opentelemetry.context.propagation.ContextPropagators;
1316
import io.opentelemetry.context.propagation.TextMapPropagator;
1417
import io.opentelemetry.extension.trace.propagation.B3Propagator;
1518
import io.opentelemetry.extension.trace.propagation.JaegerPropagator;
1619
import io.opentelemetry.extension.trace.propagation.OtTracePropagator;
1720
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.component.TextMapPropagatorComponentProvider;
22+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3MultiPropagatorModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.B3PropagatorModel;
24+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BaggagePropagatorModel;
25+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.JaegerPropagatorModel;
26+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTracingPropagatorModel;
1827
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PropagatorModel;
28+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TextMapPropagatorModel;
29+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TraceContextPropagatorModel;
1930
import java.util.Arrays;
2031
import java.util.Collections;
2132
import java.util.stream.Stream;
33+
import org.junit.jupiter.api.Test;
2234
import org.junit.jupiter.params.ParameterizedTest;
2335
import org.junit.jupiter.params.provider.Arguments;
2436
import org.junit.jupiter.params.provider.MethodSource;
@@ -39,17 +51,101 @@ void create(PropagatorModel model, ContextPropagators expectedPropagators) {
3951

4052
private static Stream<Arguments> createArguments() {
4153
return Stream.of(
54+
// structured list
4255
Arguments.of(
4356
new PropagatorModel()
4457
.withComposite(
45-
Arrays.asList("tracecontext", "baggage", "ottrace", "b3multi", "b3", "jaeger")),
58+
Arrays.asList(
59+
new TextMapPropagatorModel()
60+
.withTracecontext(new TraceContextPropagatorModel()),
61+
new TextMapPropagatorModel().withBaggage(new BaggagePropagatorModel()),
62+
new TextMapPropagatorModel().withOttrace(new OpenTracingPropagatorModel()),
63+
new TextMapPropagatorModel().withB3multi(new B3MultiPropagatorModel()),
64+
new TextMapPropagatorModel().withB3(new B3PropagatorModel()),
65+
new TextMapPropagatorModel().withJaeger(new JaegerPropagatorModel()))),
4666
ContextPropagators.create(
4767
TextMapPropagator.composite(
4868
W3CTraceContextPropagator.getInstance(),
4969
W3CBaggagePropagator.getInstance(),
5070
OtTracePropagator.getInstance(),
5171
B3Propagator.injectingMultiHeaders(),
5272
B3Propagator.injectingSingleHeader(),
53-
JaegerPropagator.getInstance()))));
73+
JaegerPropagator.getInstance()))),
74+
// string list
75+
Arguments.of(
76+
new PropagatorModel()
77+
.withCompositeList("tracecontext,baggage,ottrace,b3multi,b3,jaeger ,none"),
78+
ContextPropagators.create(
79+
TextMapPropagator.composite(
80+
W3CTraceContextPropagator.getInstance(),
81+
W3CBaggagePropagator.getInstance(),
82+
OtTracePropagator.getInstance(),
83+
B3Propagator.injectingMultiHeaders(),
84+
B3Propagator.injectingSingleHeader(),
85+
JaegerPropagator.getInstance()))),
86+
// structured list and string list
87+
Arguments.of(
88+
new PropagatorModel()
89+
.withComposite(
90+
Arrays.asList(
91+
new TextMapPropagatorModel()
92+
.withTracecontext(new TraceContextPropagatorModel()),
93+
new TextMapPropagatorModel().withBaggage(new BaggagePropagatorModel())))
94+
.withCompositeList("ottrace,b3multi,b3,jaeger"),
95+
ContextPropagators.create(
96+
TextMapPropagator.composite(
97+
W3CTraceContextPropagator.getInstance(),
98+
W3CBaggagePropagator.getInstance(),
99+
OtTracePropagator.getInstance(),
100+
B3Propagator.injectingMultiHeaders(),
101+
B3Propagator.injectingSingleHeader(),
102+
JaegerPropagator.getInstance()))),
103+
// structured list and string list with overlap
104+
Arguments.of(
105+
new PropagatorModel()
106+
.withComposite(
107+
Arrays.asList(
108+
new TextMapPropagatorModel()
109+
.withTracecontext(new TraceContextPropagatorModel()),
110+
new TextMapPropagatorModel().withBaggage(new BaggagePropagatorModel())))
111+
.withCompositeList("tracecontext,ottrace,b3multi,b3,jaeger"),
112+
ContextPropagators.create(
113+
TextMapPropagator.composite(
114+
W3CTraceContextPropagator.getInstance(),
115+
W3CBaggagePropagator.getInstance(),
116+
OtTracePropagator.getInstance(),
117+
B3Propagator.injectingMultiHeaders(),
118+
B3Propagator.injectingSingleHeader(),
119+
JaegerPropagator.getInstance()))),
120+
// spi
121+
Arguments.of(
122+
new PropagatorModel()
123+
.withComposite(
124+
Collections.singletonList(
125+
new TextMapPropagatorModel().withAdditionalProperty("test", null))),
126+
ContextPropagators.create(
127+
TextMapPropagator.composite(
128+
new TextMapPropagatorComponentProvider.TestTextMapPropagator(
129+
DeclarativeConfigProperties.empty())))),
130+
Arguments.of(
131+
new PropagatorModel().withCompositeList("test"),
132+
ContextPropagators.create(
133+
TextMapPropagator.composite(
134+
new TextMapPropagatorComponentProvider.TestTextMapPropagator(
135+
DeclarativeConfigProperties.empty())))));
136+
}
137+
138+
@Test
139+
void create_SpiPropagator_Unknown() {
140+
assertThatThrownBy(
141+
() ->
142+
PropagatorFactory.getInstance()
143+
.create(
144+
new PropagatorModel().withCompositeList("foo"),
145+
spiHelper,
146+
Collections.emptyList()))
147+
.isInstanceOf(DeclarativeConfigException.class)
148+
.hasMessage(
149+
"No component provider detected for io.opentelemetry.context.propagation.TextMapPropagator with name \"foo\".");
54150
}
55151
}

0 commit comments

Comments
 (0)