From 0ca55bf0a6d27e16a5abda6d84776cfd2e1b7e60 Mon Sep 17 00:00:00 2001 From: adispezo <80221409+adispezo@users.noreply.github.com> Date: Sat, 16 Sep 2023 10:11:19 +0200 Subject: [PATCH 1/2] Add local and tagged correlation fields Local fields only work in Brave and not with OpenTelemetry. Tagged fields work both with Brave and with OpenTelemetry. See gh-37435 --- .../tracing/BaggageTagSpanHandler.java | 43 +++++++++++++++++++ .../BravePropagationConfigurations.java | 25 ++++++++++- .../OpenTelemetryAutoConfiguration.java | 14 ++++-- ...penTelemetryPropagationConfigurations.java | 4 +- .../tracing/TracingProperties.java | 29 ++++++++++++- .../BaggagePropagationIntegrationTests.java | 10 +++++ .../tracing/BraveAutoConfigurationTests.java | 17 ++++++++ .../OpenTelemetryAutoConfigurationTests.java | 19 +++++++- 8 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java new file mode 100644 index 0000000000..4a551215f6 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.tracing; + +import java.util.Collection; + +import brave.Tags; +import brave.baggage.BaggageField; +import brave.handler.MutableSpan; +import brave.handler.SpanHandler; +import brave.propagation.TraceContext; + +class BaggageTagSpanHandler extends SpanHandler { + + private final Collection fieldsToTag; + + BaggageTagSpanHandler(Collection fieldsToTag) { + this.fieldsToTag = fieldsToTag; + } + + @Override + public boolean end(TraceContext context, MutableSpan span, Cause cause) { + for (BaggageField field : this.fieldsToTag) { + Tags.BAGGAGE_FIELD.tag(field, context, span); + } + return true; + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java index 17bc930219..203f8fb15d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; import brave.baggage.CorrelationScopeCustomizer; import brave.baggage.CorrelationScopeDecorator; import brave.context.slf4j.MDCScopeDecorator; +import brave.handler.SpanHandler; import brave.propagation.CurrentTraceContext.ScopeDecorator; import brave.propagation.Propagation; import brave.propagation.Propagation.Factory; @@ -40,6 +41,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; +import org.springframework.util.CollectionUtils; /** * Brave propagation configurations. They are imported by {@link BraveAutoConfiguration}. @@ -120,6 +122,27 @@ class BravePropagationConfigurations { }; } + @Bean + @Order(1) + BaggagePropagationCustomizer localFieldsBaggagePropagationCustomizer() { + return (builder) -> { + List localFields = this.tracingProperties.getBaggage().getLocalFields(); + for (String localFieldName : localFields) { + builder.add(BaggagePropagationConfig.SingleBaggageField.local(BaggageField.create(localFieldName))); + } + }; + } + + @Bean + @Order(2) + SpanHandler baggageTagSpanHandler() { + List tagFields = this.tracingProperties.getBaggage().getTagFields(); + if (CollectionUtils.isEmpty(tagFields)) { + return SpanHandler.NOOP; + } + return new BaggageTagSpanHandler(tagFields.stream().map(BaggageField::create).toList()); + } + @Bean @ConditionalOnMissingBean @ConditionalOnEnabledTracing 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 6e5de4b51c..8322ff0209 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 @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.tracing; -import java.util.Collections; import java.util.List; import io.micrometer.tracing.SpanCustomizer; @@ -47,6 +46,8 @@ import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.SpringBootVersion; @@ -57,6 +58,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; +import org.springframework.util.CollectionUtils; /** * {@link EnableAutoConfiguration Auto-configuration} for OpenTelemetry tracing. @@ -75,10 +77,15 @@ import org.springframework.context.annotation.Import; OpenTelemetryPropagationConfigurations.NoPropagation.class }) public class OpenTelemetryAutoConfiguration { + private static final Log logger = LogFactory.getLog(OpenTelemetryAutoConfiguration.class); + private final TracingProperties tracingProperties; OpenTelemetryAutoConfiguration(TracingProperties tracingProperties) { this.tracingProperties = tracingProperties; + if (!CollectionUtils.isEmpty(this.tracingProperties.getBaggage().getLocalFields())) { + logger.warn("Local fields are not supported when using OpenTelemetry!"); + } } @Bean @@ -137,9 +144,10 @@ public class OpenTelemetryAutoConfiguration { @ConditionalOnMissingBean(io.micrometer.tracing.Tracer.class) OtelTracer micrometerOtelTracer(Tracer tracer, EventPublisher eventPublisher, OtelCurrentTraceContext otelCurrentTraceContext) { + List remoteFields = this.tracingProperties.getBaggage().getRemoteFields(); + List tagFields = this.tracingProperties.getBaggage().getTagFields(); return new OtelTracer(tracer, otelCurrentTraceContext, eventPublisher, - new OtelBaggageManager(otelCurrentTraceContext, this.tracingProperties.getBaggage().getRemoteFields(), - Collections.emptyList())); + new OtelBaggageManager(otelCurrentTraceContext, remoteFields, tagFields)); } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryPropagationConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryPropagationConfigurations.java index 4b9fcad166..4cc44a85de 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryPropagationConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/OpenTelemetryPropagationConfigurations.java @@ -16,7 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.tracing; -import java.util.Collections; import java.util.List; import io.micrometer.tracing.otel.bridge.OtelBaggageManager; @@ -73,8 +72,9 @@ class OpenTelemetryPropagationConfigurations { @ConditionalOnEnabledTracing TextMapPropagator textMapPropagatorWithBaggage(OtelCurrentTraceContext otelCurrentTraceContext) { List remoteFields = this.tracingProperties.getBaggage().getRemoteFields(); + List tagFields = this.tracingProperties.getBaggage().getTagFields(); BaggageTextMapPropagator baggagePropagator = new BaggageTextMapPropagator(remoteFields, - new OtelBaggageManager(otelCurrentTraceContext, remoteFields, Collections.emptyList())); + new OtelBaggageManager(otelCurrentTraceContext, remoteFields, tagFields)); return CompositeTextMapPropagator.create(this.tracingProperties.getPropagation(), baggagePropagator); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/TracingProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/TracingProperties.java index 6f598cc41b..6155abb2f7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/TracingProperties.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/TracingProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -103,6 +103,17 @@ public class TracingProperties { */ private List remoteFields = new ArrayList<>(); + /** + * List of fields that should be accessible within the JVM process but not + * propagated over the wire. Local fields are not supported with OpenTelemetry. + */ + private List localFields = new ArrayList<>(); + + /** + * List of fields that should automatically become tags. + */ + private List tagFields = new ArrayList<>(); + public boolean isEnabled() { return this.enabled; } @@ -123,10 +134,26 @@ public class TracingProperties { return this.remoteFields; } + public List getLocalFields() { + return this.localFields; + } + + public List getTagFields() { + return this.tagFields; + } + public void setRemoteFields(List remoteFields) { this.remoteFields = remoteFields; } + public void setLocalFields(List localFields) { + this.localFields = localFields; + } + + public void setTagFields(List tagFields) { + this.tagFields = tagFields; + } + public static class Correlation { /** diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java index 77c997cd19..de32f48b4a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggagePropagationIntegrationTests.java @@ -227,6 +227,16 @@ class BaggagePropagationIntegrationTests { "management.tracing.baggage.remote-fields=x-vcap-request-id,country-code,bp", "management.tracing.baggage.correlation.fields=country-code,bp"); } + }, + + BRAVE_LOCAL_FIELDS { + @Override + public ApplicationContextRunner get() { + return new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class)) + .withPropertyValues("management.tracing.baggage.local-fields=country-code,bp", + "management.tracing.baggage.correlation.fields=country-code,bp"); + } } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java index ee476a85b6..b6b5d356aa 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java @@ -26,6 +26,7 @@ import brave.Span; import brave.SpanCustomizer; import brave.Tracer; import brave.Tracing; +import brave.baggage.BaggageField; import brave.baggage.BaggagePropagation; import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; import brave.handler.SpanHandler; @@ -344,6 +345,22 @@ class BraveAutoConfigurationTests { }); } + @Test + void shouldCreateTagHandler() { + this.contextRunner.withPropertyValues("management.tracing.baggage.tag-fields=country-code,bp") + .run((context) -> assertThat(context.getBean(BaggageTagSpanHandler.class)).extracting("fieldsToTag") + .asInstanceOf(InstanceOfAssertFactories.list(BaggageField.class)) + .extracting(BaggageField::name) + .containsExactlyInAnyOrder("country-code", "bp")); + } + + @Test + void noopOnNoTagFields() { + this.contextRunner.withPropertyValues("management.tracing.baggage.tag-fields=") + .run((context) -> assertThat(context.getBean("baggageTagSpanHandler", SpanHandler.class)) + .isSameAs(SpanHandler.NOOP)); + } + @Test void shouldDisablePropagationIfTracingIsDisabled() { this.contextRunner.withPropertyValues("management.tracing.enabled=false").run((context) -> { 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 0d7d8b171b..1e332bedaa 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,6 +51,7 @@ import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.semconv.ResourceAttributes; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -272,6 +273,22 @@ class OpenTelemetryAutoConfigurationTests { }); } + @Test + void shouldConfigureRemoteAndTaggedFields() { + this.contextRunner + .withPropertyValues("management.tracing.baggage.remote-fields=r1", + "management.tracing.baggage.tag-fields=t1") + .run((context) -> { + CompositeTextMapPropagator propagator = context.getBean(CompositeTextMapPropagator.class); + assertThat(propagator).extracting("baggagePropagator.baggageManager.remoteFields") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("r1"); + assertThat(propagator).extracting("baggagePropagator.baggageManager.tagFields") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("t1"); + }); + } + @Test void shouldCustomizeSdkTracerProvider() { this.contextRunner.withUserConfiguration(SdkTracerProviderCustomizationConfiguration.class).run((context) -> { From 7120dc07aef2d2382b56f140edfc264bf6f624e3 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 9 Jan 2024 11:37:15 +0100 Subject: [PATCH 2/2] Adapt to changes in Brave tagged fields handling See gh-38724 See gh-37435 --- .../tracing/BaggageTagSpanHandler.java | 43 ------------------- .../tracing/BraveAutoConfiguration.java | 39 +++++++++-------- .../BravePropagationConfigurations.java | 24 ++--------- .../tracing/BraveAutoConfigurationTests.java | 27 +++++------- 4 files changed, 35 insertions(+), 98 deletions(-) delete mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java deleted file mode 100644 index 4a551215f6..0000000000 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BaggageTagSpanHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.actuate.autoconfigure.tracing; - -import java.util.Collection; - -import brave.Tags; -import brave.baggage.BaggageField; -import brave.handler.MutableSpan; -import brave.handler.SpanHandler; -import brave.propagation.TraceContext; - -class BaggageTagSpanHandler extends SpanHandler { - - private final Collection fieldsToTag; - - BaggageTagSpanHandler(Collection fieldsToTag) { - this.fieldsToTag = fieldsToTag; - } - - @Override - public boolean end(TraceContext context, MutableSpan span, Cause cause) { - for (BaggageField field : this.fieldsToTag) { - Tags.BAGGAGE_FIELD.tag(field, context, span); - } - return true; - } - -} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java index b1fbb798c6..eaa754c5e1 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,13 +70,17 @@ import org.springframework.core.env.Environment; BravePropagationConfigurations.NoPropagation.class }) public class BraveAutoConfiguration { - static final BraveBaggageManager BRAVE_BAGGAGE_MANAGER = new BraveBaggageManager(); - /** * Default value for application name if {@code spring.application.name} is not set. */ private static final String DEFAULT_APPLICATION_NAME = "application"; + private final TracingProperties tracingProperties; + + BraveAutoConfiguration(TracingProperties tracingProperties) { + this.tracingProperties = tracingProperties; + } + @Bean @ConditionalOnMissingBean @Order(Ordered.HIGHEST_PRECEDENCE) @@ -88,22 +92,22 @@ public class BraveAutoConfiguration { @Bean @ConditionalOnMissingBean - public Tracing braveTracing(Environment environment, TracingProperties properties, List spanHandlers, + Tracing braveTracing(Environment environment, List spanHandlers, List tracingCustomizers, CurrentTraceContext currentTraceContext, Factory propagationFactory, Sampler sampler) { - if (properties.getBrave().isSpanJoiningSupported()) { - if (properties.getPropagation().getType() != null - && properties.getPropagation().getType().contains(PropagationType.W3C)) { + if (this.tracingProperties.getBrave().isSpanJoiningSupported()) { + if (this.tracingProperties.getPropagation().getType() != null + && this.tracingProperties.getPropagation().getType().contains(PropagationType.W3C)) { throw new IncompatibleConfigurationException("management.tracing.propagation.type", "management.tracing.brave.span-joining-supported"); } - if (properties.getPropagation().getType() == null - && properties.getPropagation().getProduce().contains(PropagationType.W3C)) { + if (this.tracingProperties.getPropagation().getType() == null + && this.tracingProperties.getPropagation().getProduce().contains(PropagationType.W3C)) { throw new IncompatibleConfigurationException("management.tracing.propagation.produce", "management.tracing.brave.span-joining-supported"); } - if (properties.getPropagation().getType() == null - && properties.getPropagation().getConsume().contains(PropagationType.W3C)) { + if (this.tracingProperties.getPropagation().getType() == null + && this.tracingProperties.getPropagation().getConsume().contains(PropagationType.W3C)) { throw new IncompatibleConfigurationException("management.tracing.propagation.consume", "management.tracing.brave.span-joining-supported"); } @@ -112,7 +116,7 @@ public class BraveAutoConfiguration { Builder builder = Tracing.newBuilder() .currentTraceContext(currentTraceContext) .traceId128Bit(true) - .supportsJoin(properties.getBrave().isSpanJoiningSupported()) + .supportsJoin(this.tracingProperties.getBrave().isSpanJoiningSupported()) .propagationFactory(propagationFactory) .sampler(sampler) .localServiceName(applicationName); @@ -125,13 +129,13 @@ public class BraveAutoConfiguration { @Bean @ConditionalOnMissingBean - public brave.Tracer braveTracer(Tracing tracing) { + brave.Tracer braveTracer(Tracing tracing) { return tracing.tracer(); } @Bean @ConditionalOnMissingBean - public CurrentTraceContext braveCurrentTraceContext(List scopeDecorators, + CurrentTraceContext braveCurrentTraceContext(List scopeDecorators, List currentTraceContextCustomizers) { ThreadLocalCurrentTraceContext.Builder builder = ThreadLocalCurrentTraceContext.newBuilder(); scopeDecorators.forEach(builder::addScopeDecorator); @@ -143,14 +147,15 @@ public class BraveAutoConfiguration { @Bean @ConditionalOnMissingBean - public Sampler braveSampler(TracingProperties properties) { - return Sampler.create(properties.getSampling().getProbability()); + Sampler braveSampler() { + return Sampler.create(this.tracingProperties.getSampling().getProbability()); } @Bean @ConditionalOnMissingBean(io.micrometer.tracing.Tracer.class) BraveTracer braveTracerBridge(brave.Tracer tracer, CurrentTraceContext currentTraceContext) { - return new BraveTracer(tracer, new BraveCurrentTraceContext(currentTraceContext), BRAVE_BAGGAGE_MANAGER); + return new BraveTracer(tracer, new BraveCurrentTraceContext(currentTraceContext), + new BraveBaggageManager(this.tracingProperties.getBaggage().getTagFields())); } @Bean diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java index 203f8fb15d..31de139c7d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/BravePropagationConfigurations.java @@ -27,11 +27,11 @@ import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; import brave.baggage.CorrelationScopeCustomizer; import brave.baggage.CorrelationScopeDecorator; import brave.context.slf4j.MDCScopeDecorator; -import brave.handler.SpanHandler; import brave.propagation.CurrentTraceContext.ScopeDecorator; import brave.propagation.Propagation; import brave.propagation.Propagation.Factory; import brave.propagation.Propagation.KeyFactory; +import io.micrometer.tracing.brave.bridge.BraveBaggageManager; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.actuate.autoconfigure.tracing.TracingProperties.Baggage.Correlation; @@ -41,7 +41,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -import org.springframework.util.CollectionUtils; /** * Brave propagation configurations. They are imported by {@link BraveAutoConfiguration}. @@ -92,7 +91,8 @@ class BravePropagationConfigurations { baggagePropagationCustomizers.orderedStream() .forEach((customizer) -> customizer.customize(throwAwayBuilder)); CompositePropagationFactory propagationFactory = CompositePropagationFactory.create( - this.tracingProperties.getPropagation(), BraveAutoConfiguration.BRAVE_BAGGAGE_MANAGER, + this.tracingProperties.getPropagation(), + new BraveBaggageManager(this.tracingProperties.getBaggage().getTagFields()), LocalBaggageFields.extractFrom(throwAwayBuilder)); FactoryBuilder builder = BaggagePropagation.newFactoryBuilder(propagationFactory); throwAwayBuilder.configs().forEach(builder::add); @@ -112,20 +112,12 @@ class BravePropagationConfigurations { } @Bean - @Order(0) BaggagePropagationCustomizer remoteFieldsBaggagePropagationCustomizer() { return (builder) -> { List remoteFields = this.tracingProperties.getBaggage().getRemoteFields(); for (String fieldName : remoteFields) { builder.add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(fieldName))); } - }; - } - - @Bean - @Order(1) - BaggagePropagationCustomizer localFieldsBaggagePropagationCustomizer() { - return (builder) -> { List localFields = this.tracingProperties.getBaggage().getLocalFields(); for (String localFieldName : localFields) { builder.add(BaggagePropagationConfig.SingleBaggageField.local(BaggageField.create(localFieldName))); @@ -133,16 +125,6 @@ class BravePropagationConfigurations { }; } - @Bean - @Order(2) - SpanHandler baggageTagSpanHandler() { - List tagFields = this.tracingProperties.getBaggage().getTagFields(); - if (CollectionUtils.isEmpty(tagFields)) { - return SpanHandler.NOOP; - } - return new BaggageTagSpanHandler(tagFields.stream().map(BaggageField::create).toList()); - } - @Bean @ConditionalOnMissingBean @ConditionalOnEnabledTracing diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java index b6b5d356aa..f09abe2316 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/BraveAutoConfigurationTests.java @@ -26,7 +26,6 @@ import brave.Span; import brave.SpanCustomizer; import brave.Tracer; import brave.Tracing; -import brave.baggage.BaggageField; import brave.baggage.BaggagePropagation; import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; import brave.handler.SpanHandler; @@ -345,22 +344,6 @@ class BraveAutoConfigurationTests { }); } - @Test - void shouldCreateTagHandler() { - this.contextRunner.withPropertyValues("management.tracing.baggage.tag-fields=country-code,bp") - .run((context) -> assertThat(context.getBean(BaggageTagSpanHandler.class)).extracting("fieldsToTag") - .asInstanceOf(InstanceOfAssertFactories.list(BaggageField.class)) - .extracting(BaggageField::name) - .containsExactlyInAnyOrder("country-code", "bp")); - } - - @Test - void noopOnNoTagFields() { - this.contextRunner.withPropertyValues("management.tracing.baggage.tag-fields=") - .run((context) -> assertThat(context.getBean("baggageTagSpanHandler", SpanHandler.class)) - .isSameAs(SpanHandler.NOOP)); - } - @Test void shouldDisablePropagationIfTracingIsDisabled() { this.contextRunner.withPropertyValues("management.tracing.enabled=false").run((context) -> { @@ -371,6 +354,16 @@ class BraveAutoConfigurationTests { }); } + @Test + void shouldConfigureTaggedFields() { + this.contextRunner.withPropertyValues("management.tracing.baggage.tag-fields=t1").run((context) -> { + BraveTracer braveTracer = context.getBean(BraveTracer.class); + assertThat(braveTracer).extracting("braveBaggageManager.tagFields") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("t1"); + }); + } + private void injectToMap(Map map, String key, String value) { map.put(key, value); }