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
相关产品推荐
相关产品推荐

