You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Micrometer Tracing未在MDC中生成parentId/parentSpanId问题求助

解决Spring Micrometer Tracing(Brave实现)MDC缺失parentSpanId的问题

问题根源

  1. Brave默认仅将traceId和spanId同步到MDC,不会自动注入parentSpanId
  2. 你配置的management.tracing.baggage.correlation.fields针对的是自定义 baggage 字段,而非Trace上下文原生的parentSpanId,因此无法生效
  3. 采样概率设为0.0可能导致Trace上下文初始化不完整(即使不需要上报追踪数据,建议先调为1.0验证,后续再按需调整)

解决方案

1. 调整基础配置

修改application.properties,确保Trace上下文能正常初始化:

management.tracing.sampling.probability=1.0

2. 自定义MDC Scope装饰器

通过配置类手动将parentSpanId注入MDC,适配Brave的Trace上下文逻辑:

import brave.Tracing;
import brave.context.slf4j.MDCScopeDecorator;
import brave.propagation.CurrentTraceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TracingMdcConfig {

    // 自定义MDC装饰器,添加parentSpanId字段
    @Bean
    public CurrentTraceContext.ScopeDecorator mdcScopeDecorator() {
        return MDCScopeDecorator.newBuilder()
                .addField("parentSpanId", (traceContext, fieldName) -> 
                    traceContext != null && traceContext.parentId() != null 
                        ? traceContext.parentId().toString() 
                        : null)
                .build();
    }

    // 将自定义装饰器绑定到Brave的Tracing实例
    @Bean
    public Tracing braveTracing(CurrentTraceContext currentTraceContext) {
        return Tracing.newBuilder()
                .currentTraceContext(currentTraceContext)
                .build();
    }
}

3. 验证场景效果

  • 内部创建nextSpan场景:当通过Tracer.nextSpan()创建子Span时,父Span的spanId会自动作为parentSpanId注入MDC
  • 外部服务调用场景:当请求头携带X-B3-ParentSpanId(B3协议规范)时,该值会被解析为当前Span的parentId,并同步到MDC的parentSpanId字段

4. 可选:协议格式适配

你当前配置的management.tracing.propagation.type=B3_MULTI已兼容多头发送的X-B3字段,无需额外调整;若使用B3单头格式,可改为B3。


内容的提问来源于stack exchange,提问作者Arun Gowda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:35:02