diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java index 3bd0ed771f..105c3830c7 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/OtTracePropagator.java @@ -20,6 +20,7 @@ import io.opentelemetry.context.propagation.TextMapSetter; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Locale; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -108,14 +109,17 @@ public final class OtTracePropagator implements TextMapPropagator { if (carrier != null) { BaggageBuilder baggageBuilder = Baggage.builder(); for (String key : getter.keys(carrier)) { - if (!key.startsWith(PREFIX_BAGGAGE_HEADER)) { + String lowercaseKey = key.toLowerCase(Locale.ROOT); + if (!lowercaseKey.startsWith(PREFIX_BAGGAGE_HEADER)) { continue; } String value = getter.get(carrier, key); if (value == null) { continue; } - baggageBuilder.put(key.replace(OtTracePropagator.PREFIX_BAGGAGE_HEADER, ""), value); + String baggageKey = + lowercaseKey.substring(OtTracePropagator.PREFIX_BAGGAGE_HEADER.length()); + baggageBuilder.put(baggageKey, value); } Baggage baggage = baggageBuilder.build(); if (!baggage.isEmpty()) { diff --git a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/OtTracePropagatorTest.java b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/OtTracePropagatorTest.java index 39e4bbfc0d..7b1c743429 100644 --- a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/OtTracePropagatorTest.java +++ b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/OtTracePropagatorTest.java @@ -20,6 +20,7 @@ import io.opentelemetry.context.propagation.TextMapSetter; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.Map; import javax.annotation.Nullable; import org.junit.jupiter.api.Test; @@ -55,6 +56,18 @@ class OtTracePropagatorTest { return context.with(Span.wrap(spanContext)); } + private static String capitalizeFirstLetter(String input, String delimiter) { + String[] words = input.split(delimiter); + + for (int i = 0; i < words.length; i++) { + String firstLetter = words[i].substring(0, 1).toUpperCase(Locale.ROOT); + String restOfWord = words[i].substring(1).toLowerCase(Locale.ROOT); + words[i] = firstLetter + restOfWord; + } + + return String.join(delimiter, words); + } + @Test void inject_invalidContext() { Map carrier = new LinkedHashMap<>(); @@ -313,6 +326,22 @@ class OtTracePropagatorTest { assertThat(Baggage.fromContext(context)).isEqualTo(expectedBaggage); } + @Test + void extract_Baggage_CapitalizedHeaders() { + String capitalizedBaggageHeader = + capitalizeFirstLetter(OtTracePropagator.PREFIX_BAGGAGE_HEADER + "some-key", "-"); + Map carrier = new LinkedHashMap<>(); + carrier.put(OtTracePropagator.TRACE_ID_HEADER, TRACE_ID); + carrier.put(OtTracePropagator.SPAN_ID_HEADER, SPAN_ID); + carrier.put(OtTracePropagator.SAMPLED_HEADER, Common.TRUE_INT); + carrier.put(capitalizedBaggageHeader, "value"); + + Context context = propagator.extract(Context.current(), carrier, getter); + + Baggage expectedBaggage = Baggage.builder().put("some-key", "value").build(); + assertThat(Baggage.fromContext(context)).isEqualTo(expectedBaggage); + } + @Test void extract_Baggage_InvalidContext() { Map carrier = new LinkedHashMap<>();