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

SpringBoot应用使用OpenTelemetry Java Agent,响应头中无法查看Trace ID

解决SpringBoot响应中添加OpenTelemetry Trace ID的方法

方法一:通过OpenTelemetry Agent配置自动注入响应头

直接修改Java Agent的启动参数,添加配置让Agent自动把追踪信息注入到HTTP响应头:

-javaagent:path/to/opentelemetry-javaagent.jar \
-Dotel.traces.exporter=jaeger \
-Dotel.resource.attributes=service.name=your-service-name \
-Dotel.instrumentation.servlet.response.headers=traceparent,trace-id,span-id

otel.instrumentation.servlet.response.headers用于指定要注入的响应头字段,traceparent包含符合W3C规范的完整追踪上下文,也可单独指定trace-id和span-id。

方法二:手动拦截HTTP响应添加Trace ID

若自动配置不生效,可通过自定义拦截器实现:

  1. 创建Spring MVC拦截器:
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class TraceIdInterceptor implements HandlerInterceptor {

    private final Tracer tracer;

    public TraceIdInterceptor(Tracer tracer) {
        this.tracer = tracer;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        Span currentSpan = tracer.getCurrentSpan();
        if (currentSpan != null && currentSpan.getSpanContext().isValid()) {
            response.addHeader("X-Trace-Id", currentSpan.getSpanContext().getTraceId());
            response.addHeader("X-Span-Id", currentSpan.getSpanContext().getSpanId());
        }
    }
}
  1. 注册拦截器:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final TraceIdInterceptor traceIdInterceptor;

    public WebConfig(TraceIdInterceptor traceIdInterceptor) {
        this.traceIdInterceptor = traceIdInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(traceIdInterceptor).addPathPatterns("/**");
    }
}

配置完成后,所有HTTP响应都会带上X-Trace-Id和X-Span-Id头,直接用该Trace ID即可在Jaeger中查询链路。

方法三:日志中输出Trace ID(辅助调试)

如果需要在日志中同步查看Trace ID,以logback为例,修改日志格式配置,添加%X{traceId}:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg - traceId: %X{traceId}%n</pattern>
    </encoder>
</appender>

OpenTelemetry Agent会自动将Trace ID放入MDC(映射诊断上下文),无需额外代码开发。


内容的提问来源于stack exchange,提问作者addepalli saiprasad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:42:40