我有一个过滤器(OncePerRequestFilter),它基本上拦截传入的请求并记录traceId,spanId等,效果很好,这个过滤器位于一个公共模块中,该模块包含在其他项目中,以避免在我的所有微服务中包含spring sleuth依赖,我将它创建为库的原因是因为对库的任何更改对所有模块都是通用的。现在我要添加一个新的传播密钥,该密钥需要通过诸如 trace 和 spanId 之类的 http 标头传播到所有服务,因为我已经从 HttpTracing 中提取了当前跨度并向其添加了行李密钥(如下所示)
Span span = httpTracing.tracing().tracer().currentSpan();
String corelationId =
StringUtils.isEmpty(request.getHeader(CORELATION_ID))
? "n/a"
: request.getHeader(CORELATION_ID);
ExtraFieldPropagation.set(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);
span.annotate("baggage_set");
span.tag(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);
我已将传播密钥和列入白名单的 mdc-keys 添加到我的 application.yml (与我的库)文件中,如下所示
spring:
sleuth:
propagation-keys:
- x-corelationId
log:
slf4j:
whitelisted-mdc-keys:
- x-corelationId
在过滤器中进行此更改后,当我对具有相同应用程序的另一个服务进行 http 调用时,corelationId 不可用,基本上密钥不会被传播。