diff --git a/CHANGELOG.md b/CHANGELOG.md index 386c20ba941..27f58b30e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +### API + +#### Extensions + +* Trace propagators: Fix `JaegerPropagator` overwriting existing baggage when the `jaeger-baggage` + header has no parsable entries + ([#8632](https://github.com/open-telemetry/opentelemetry-java/pull/8632)) + ### SDK #### Exporters diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java index 4acebd2c399..c984ec7f2c6 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java @@ -291,7 +291,11 @@ private static Baggage getBaggageFromHeader(@Nullable C carrier, TextMapGett } } } - return builder == null ? null : builder.build(); + if (builder == null) { + return null; + } + Baggage baggage = builder.build(); + return baggage.isEmpty() ? null : baggage; } /** Returns a two-element array of {@code [entriesAdded, bytesAdded]}. */ diff --git a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java index 80165071e20..f1123fbee2b 100644 --- a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java +++ b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java @@ -443,6 +443,26 @@ void extract_baggageOnly_withHeader_invalid() { .isEqualTo(Baggage.empty()); } + @ParameterizedTest + @MethodSource + void extract_baggageOnly_withHeader_invalid_keepsExistingBaggage(String headerValue) { + Baggage existingBaggage = Baggage.builder().put("user", "alice").build(); + Map carrier = new LinkedHashMap<>(); + carrier.put(BAGGAGE_HEADER, headerValue); + + Context context = Context.root().with(existingBaggage); + assertThat(fromContext(jaegerPropagator.extract(context, carrier, getter))) + .isEqualTo(existingBaggage); + } + + static Stream extract_baggageOnly_withHeader_invalid_keepsExistingBaggage() { + return Stream.of( + Arguments.argumentSet("no separator", "nometa+novalue"), + Arguments.argumentSet("empty value", "user="), + Arguments.argumentSet("empty header", ""), + Arguments.argumentSet("too many separators", "a=b=c")); + } + @Test void extract_baggageOnly_withHeader_andPrefix() { Map carrier = new LinkedHashMap<>();