【发布时间】:2021-01-02 08:08:09
【问题描述】:
我正在尝试向 HTTP 服务器上的现有跨度添加额外的 Baggage,我想向跨度添加一个路径变量,以便从日志 MDC 访问并通过线路传播到我调用的下一个服务器http 或 kafka。
我的设置:spring cloud sleuth Hoxton.SR5 和 spring boot 2.2.5
我尝试添加以下设置和配置:
spring:
sleuth:
propagation-keys: context-id, context-type
log:
slf4j:
whitelisted-mdc-keys: context-id, context-type
并添加了 http 拦截器:
public class HttpContextInterceptor implements HandlerInterceptor {
private final Tracer tracer;
private final HttpContextSupplier httpContextSupplier;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (httpContextSupplier != null) {
addContext(request, handler);
}
return true;
}
private void addContext(HttpServletRequest request, Object handler) {
final Context context = httpContextSupplier.getContext(request);
if (!StringUtils.isEmpty(context.getContextId())) {
ExtraFieldPropagation.set(tracer.currentSpan().context(), TracingHeadersConsts.HEADER_CONTEXT_ID, context.getContextId());
}
if (!StringUtils.isEmpty(context.getContextType())) {
ExtraFieldPropagation.set(tracer.currentSpan().context(), TracingHeadersConsts.HEADER_CONTEXT_TYPE, context.getContextType());
}
}
}
和http过滤器影响当前跨度(根据spring docs)
public class TracingFilter extends OncePerRequestFilter {
private final Tracer tracer;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try (Tracer.SpanInScope ws = tracer.withSpanInScope(tracer.currentSpan())){
filterChain.doFilter(request, response);
}
}
}
问题是日志不包含我的自定义上下文 ID、上下文类型,尽管在跨度上下文中看到它。
我错过了什么?
【问题讨论】: