Spring Boot 3与Micrometer Baggage管理异常:为何无法正常生效?
问题诊断与修复
1. 键名不匹配
配置文件中management.tracing.baggage.remote-fields指定的是my-token,但代码中创建Baggage时使用的键是my_token,两者名称严格不匹配,导致Tracer无法识别该Baggage。需统一键名:
- 要么将配置中的
my-token改为my_token - 要么将代码中获取Header和创建Baggage的键改为
my-token
2. 未注册自定义Baggage字段
仅配置remote-fields不足以让Tracer追踪自定义Baggage,需显式声明允许的Baggage字段。修改配置文件,添加fields节点:
management: tracing: enabled: true baggage: enabled: true fields: - my-token # 与统一后的键名保持一致 remote-fields: - my-token
fields用于注册所有可在追踪上下文中使用的Baggage字段,remote-fields则控制哪些字段需要在跨服务调用中传递。
3. Baggage作用域提前终止
代码中try-with-resources创建的BaggageInScope会在try块结束后自动关闭,但filterChain.doFilter()被放在了try块外部,导致后续Controller逻辑执行时,Baggage已不在当前作用域内。需将doFilter()调用移至try块内部:
@RequiredArgsConstructor @Slf4j @Component public class TokenFilter implements Filter { private final Tracer tracer; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { final String myTokenValue = ((HttpServletRequest) servletRequest).getHeader("my-token"); log.info("Token value is '{}'", myTokenValue); try (BaggageInScope myToken = tracer.createBaggageInScope("my-token", myTokenValue)) { log.info("Baggage content is {}", myToken.get()); log.info("All baggages are {}", tracer.getAllBaggage()); // 确保请求后续流程处于Baggage作用域内 filterChain.doFilter(servletRequest, servletResponse); } catch (Exception exc) { log.error(exc.getMessage()); } } }
4. 过滤器顺序问题(可选)
若自定义过滤器在Micrometer Tracing过滤器之后执行,可能导致Baggage无法关联到当前Span。可通过@Order注解指定优先级,确保自定义过滤器先执行:
@Order(Ordered.HIGHEST_PRECEDENCE) @Component public class TokenFilter implements Filter { // 代码逻辑不变 }
完成以上修复后,Controller即可正常获取到Baggage数据。
内容的提问来源于stack exchange,提问作者fredege
相关产品推荐
相关产品推荐

