我已经在Spring Boot 2.7中这样做了。但是在Spring Boot 3中有一点不同。
如果没有相关的HTTP报头,我添加了以下内容来初始化行李字段
public class FAPIAutoConfiguration {
private static final BaggageField FIELD = BaggageField.create("x-fapi-interaction-id");
@Bean
TracingCustomizer fapiTracingCustomizer(UniqueIdGenerator generator) {
return builder -> builder
.alwaysSampleLocal()
.addSpanHandler(new SpanHandler() {
@Override
public boolean begin(TraceContext context, MutableSpan span, TraceContext parent) {
var value = FIELD.getValue(context);
if (value == null || value.trim().isEmpty()) {
FIELD.updateValue(context, generator.next());
}
return super.begin(context, span, parent);
}
});
}
@Bean
BaggagePropagationCustomizer fapiBaggagePropagationCustomizer() {
return builder -> builder.add(BaggagePropagationConfig.SingleBaggageField.remote(FIELD));
}
}
问题是,我不知道这是否是最好的解决方案,或者.alwaysSampleLocal()
是否会对性能产生负面影响。如果没有.alwaysSampleLocal()
,初始化只会不时发生。
如果你的服务只处理http请求,我相信它可以通过使用spring过滤器来实现
@Component
public class BaggageFieldFilter extends OncePerRequestFilter {
private Tracer tracer;
private static final String field = "baggage";
BaggageFieldFilter(Tracer tracer) {
this.tracer = tracer;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if(tracer.getBaggage(field) == null) {
tracer.createBaggage(field, "value");
}
filterChain.doFilter(request, response);
}
}
如果你正在使用Webflux,可以使用WebFilter开发类似的代码。这个解决方案将不包括行李字段不存在,应用程序正在监听事件(kafka, rabbitmq)或应用程序运行调度程序的情况。在这种情况下,需要更多的开发。