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

SpringBoot项目中如何用OpenTelemetry Java Agent获取TraceId并返回给用户?

在SpringBoot全局异常处理器中获取OpenTelemetry TraceId

完全可以在全局异常处理器中获取TraceId,下面是具体实现步骤:

1. 添加OpenTelemetry API依赖

因为你使用的是Java Agent,项目中只需引入API依赖(Agent会提供具体实现),确保版本和Agent一致:

<!-- Maven -->
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-api</artifactId>
    <version>1.32.0</version> <!-- 替换为你的Agent版本 -->
    <scope>provided</scope>
</dependency>
// Gradle
implementation 'io.opentelemetry:opentelemetry-api:1.32.0'

2. 全局异常处理器中获取TraceId

通过OpenTelemetry的上下文API,直接从当前请求上下文提取TraceId:

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ErrorResponse handleAllExceptions(Exception ex) {
        // 获取当前请求绑定的Span
        Span currentSpan = Span.fromContext(Context.current());
        SpanContext spanContext = currentSpan.getSpanContext();
        
        // 提取TraceId,无效时返回默认值
        String traceId = spanContext.isValid() ? spanContext.getTraceId() : "N/A";
        
        return new ErrorResponse(ex.getMessage(), traceId);
    }

    // 自定义错误响应DTO
    static class ErrorResponse {
        private String message;
        private String traceId;

        public ErrorResponse(String message, String traceId) {
            this.message = message;
            this.traceId = traceId;
        }

        // Getter和Setter方法
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        public String getTraceId() { return traceId; }
        public void setTraceId(String traceId) { this.traceId = traceId; }
    }
}

关键说明

  • Context.current()会自动获取当前请求的上下文,OpenTelemetry Agent在请求入口(如Controller)已经创建Span并绑定到上下文,无需手动传递。
  • 若请求未被追踪(如配置了忽略路径),spanContext.isValid()会返回false,此时可以返回自定义默认值。
  • 确保Agent已正确启动(通过JVM参数-javaagent:/path/to/opentelemetry-javaagent.jar加载),否则无法获取到TraceId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:44:59