From b75317080736578aeeaace3b4c96f8b29239f0bc Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 27 Oct 2022 00:32:41 +0200 Subject: [PATCH] Add missing BaggageTextMapPropagator for OTel W3C Without this change we're missing the BaggageTextMapPropagator for OTel. This means that we're not propagating remote-fields (only baggage via the 'baggage' field). With this change we're adding the missing propagator as THE LAST entry in the composite TextMapPropagator. It has to be last cause with the latest Snapshots of Micrometer Tracing it will append the remote field baggage to existing baggage in the context extracted via the W3CBaggagePropagator. See gh-32898 --- .../tracing/OpenTelemetryAutoConfiguration.java | 6 ++++-- .../tracing/OpenTelemetryAutoConfigurationTests.java | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java index d1a6d125f7..7bf0a4fa93 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfiguration.java @@ -195,9 +195,11 @@ public class OpenTelemetryAutoConfiguration { @Bean @ConditionalOnProperty(prefix = "management.tracing.propagation", name = "type", havingValue = "W3C", matchIfMissing = true) - TextMapPropagator w3cTextMapPropagatorWithBaggage() { + TextMapPropagator w3cTextMapPropagatorWithBaggage(OtelCurrentTraceContext otelCurrentTraceContext) { + List remoteFields = this.tracingProperties.getBaggage().getRemoteFields(); return TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), - W3CBaggagePropagator.getInstance()); + W3CBaggagePropagator.getInstance(), new BaggageTextMapPropagator(remoteFields, + new OtelBaggageManager(otelCurrentTraceContext, remoteFields, Collections.emptyList()))); } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java index 01cf07b6bd..b08312eeed 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryAutoConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.tracing; +import java.util.Collection; import java.util.List; import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext; @@ -182,7 +183,12 @@ class OpenTelemetryAutoConfigurationTests { @Test void shouldSupplyW3CPropagationWithBaggageByDefault() { - this.contextRunner.run((context) -> assertThat(context).hasBean("w3cTextMapPropagatorWithBaggage")); + this.contextRunner.withPropertyValues("management.tracing.baggage.remote-fields=foo").run((context) -> { + assertThat(context).hasBean("w3cTextMapPropagatorWithBaggage"); + Collection allFields = context.getBean("w3cTextMapPropagatorWithBaggage", TextMapPropagator.class) + .fields(); + assertThat(allFields).containsExactly("traceparent", "tracestate", "baggage", "foo"); + }); } @Test