Allow configuring Micrometer Tracing MDC keys

See gh-50595

Signed-off-by: Phil Clay <philsttr@users.noreply.github.com>
This commit is contained in:
Phil Clay
2026-08-25 13:51:28 +02:00
committed by Moritz Halbritter
parent 7780b5fe86
commit dc2274e5b6
6 changed files with 150 additions and 2 deletions
@@ -19,6 +19,7 @@ package org.springframework.boot.micrometer.tracing.brave.autoconfigure;
import java.util.List;
import brave.baggage.BaggageField;
import brave.baggage.BaggageFields;
import brave.baggage.BaggagePropagation;
import brave.baggage.BaggagePropagation.FactoryBuilder;
import brave.baggage.BaggagePropagationConfig;
@@ -40,6 +41,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.micrometer.tracing.autoconfigure.ConditionalOnEnabledTracingExport;
import org.springframework.boot.micrometer.tracing.autoconfigure.TracingProperties;
import org.springframework.boot.micrometer.tracing.autoconfigure.TracingProperties.Baggage.Correlation;
import org.springframework.boot.micrometer.tracing.autoconfigure.TracingProperties.Mdc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
@@ -138,7 +140,15 @@ class BravePropagationConfigurations {
@ConditionalOnMissingBean
CorrelationScopeDecorator.Builder mdcCorrelationScopeDecoratorBuilder(
ObjectProvider<CorrelationScopeCustomizer> correlationScopeCustomizers) {
CorrelationScopeDecorator.Builder builder = MDCScopeDecorator.newBuilder();
Mdc mdc = this.tracingProperties.getMdc();
CorrelationScopeDecorator.Builder builder = MDCScopeDecorator.newBuilder()
// Clear existing traceId/spanId backage field mappings
// so the MDC key names can be customized below.
// BravePropagationConfigurationsTests validates the assumption that
// the builder only configures the trace/span id by default.
.clear()
.add(SingleCorrelationField.newBuilder(BaggageFields.TRACE_ID).name(mdc.getTraceIdKey()).build())
.add(SingleCorrelationField.newBuilder(BaggageFields.SPAN_ID).name(mdc.getSpanIdKey()).build());
correlationScopeCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
return builder;
}
@@ -258,6 +258,31 @@ class BraveAutoConfigurationTests {
.run((context) -> assertThat(context).hasBean("mdcCorrelationScopeDecoratorBuilder"));
}
@Test
void correlationScopeDecoratorUsesDefaultMdcKeys() {
this.contextRunner.run((context) -> {
ScopeDecorator scopeDecorator = context.getBean(ScopeDecorator.class);
assertThat(scopeDecorator)
.extracting("fields", InstanceOfAssertFactories.array(SingleCorrelationField[].class))
.extracting(SingleCorrelationField::name)
.containsExactly("traceId", "spanId");
});
}
@Test
void correlationScopeDecoratorUsesCustomMdcKeys() {
this.contextRunner
.withPropertyValues("management.tracing.mdc.trace-id-key=customTraceId",
"management.tracing.mdc.span-id-key=customSpanId")
.run((context) -> {
ScopeDecorator scopeDecorator = context.getBean(ScopeDecorator.class);
assertThat(scopeDecorator)
.extracting("fields", InstanceOfAssertFactories.array(SingleCorrelationField[].class))
.extracting(SingleCorrelationField::name)
.containsExactly("customTraceId", "customSpanId");
});
}
@Test
void shouldHave128BitTraceId() {
this.contextRunner.run((context) -> {
@@ -0,0 +1,48 @@
/*
* Copyright 2012-present 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.micrometer.tracing.brave.autoconfigure;
import brave.baggage.BaggageFields;
import brave.baggage.CorrelationScopeConfig.SingleCorrelationField;
import brave.baggage.CorrelationScopeDecorator;
import brave.context.slf4j.MDCScopeDecorator;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link BravePropagationConfigurations}.
*/
class BravePropagationConfigurationsTests {
/**
* Validates the assumption that {@link MDCScopeDecorator#newBuilder()} only
* configures traceId and spanId by default. The
* {@link BravePropagationConfigurations.PropagationWithBaggage#mdcCorrelationScopeDecoratorBuilder}
* method clears the builder's defaults and re-adds only these two fields so their MDC
* key names can be customized. If Brave adds new default fields in the future, the
* {@code .clear()} call in that method would silently drop them, and this test will
* catch that.
*/
@Test
void mdcScopeDecoratorBuilderShouldOnlyHaveTraceIdAndSpanIdByDefault() {
CorrelationScopeDecorator.Builder builder = MDCScopeDecorator.newBuilder();
assertThat(builder.configs()).extracting((config) -> ((SingleCorrelationField) config).name())
.containsExactlyInAnyOrder(BaggageFields.TRACE_ID.name(), BaggageFields.SPAN_ID.name());
}
}