Spring Boot 3.0.0:如何用Micrometer Observation API实现全端点自动traceId/spanId追踪
Spring Boot 3 实现全端点默认TraceId/SpanId追踪(替代Spring Sleuth)
核心方案:依赖自动配置+日志模板
Spring Boot 3 用 Micrometer Tracing 替代了Spring Sleuth,且提供开箱即用的自动配置,完全不需要在每个端点手动编写Observation冗余代码。
1. 添加必要依赖
以Maven为例,引入WebFlux、Micrometer Tracing及Brave桥接(适配Zipkin等追踪系统):
<dependencies> <!-- WebFlux 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- Micrometer Tracing 核心 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <!-- Brave桥接(用于对接Zipkin等主流追踪系统) --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <!-- 可选:Actuator 用于暴露追踪相关端点 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
2. 配置日志自动打印TraceId/SpanId
在application.yml中配置日志格式,让日志自动携带TraceId和SpanId:
logging: pattern: console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %X{traceId:-} %X{spanId:-} - %msg%n"
%X{traceId:-}:从MDC中获取traceId,不存在则显示空%X{spanId:-}:同理获取spanId
3. 恢复原有端点代码(无需修改)
直接使用你在Spring 2.7.x中的原始代码即可,自动配置会帮你完成所有追踪逻辑:
/* List all beers in database */ public Mono<ServerResponse> listBeer() { return beerService.listBeers(null, null, PageRequest.ofSize(50), true) .flatMap(beerDto -> ServerResponse.ok().bodyValue(beerDto)) .switchIfEmpty(ServerResponse.notFound().build()); }
原理说明
Spring Boot 3 自动配置了WebFluxObservationAutoConfiguration,会对所有HTTP请求自动创建Observation(对应Trace/Span):
- 自动管理Span的启动、结束
- 将TraceId/SpanId注入到Reactor Context及MDC中,确保日志能自动获取
- 支持跨服务调用的Trace传递(和Sleuth行为一致)
自定义扩展(可选)
如果需要统一修改所有端点的Span名称、添加自定义标签,无需逐个端点修改,只需实现ObservationFilter:
@Component public class BeerApiObservationFilter implements ObservationFilter { @Override public Observation.Context map(Observation.Context context) { if (context instanceof ServerRequestObservationContext serverContext) { // 自定义Span名称,比如加上前缀 String path = serverContext.getExchange().getRequest().getPath().value(); context.setName("beer-api:" + path); // 添加自定义标签 context.addLowCardinalityKeyValue("api.module", "beer-management"); } return context; } }
对接Zipkin(可选)
如果需要将Trace数据上传到Zipkin可视化,只需在配置中添加:
spring: zipkin: base-url: http://your-zipkin-server:9411 sleuth: sampler: probability: 1.0 # 采样率,生产环境可调整
内容的提问来源于stack exchange,提问作者Levijatanu
相关产品推荐
相关产品推荐

