我正在使用 opentelemetry 进行分布式日志记录。我有一个 TracingFilter,我将其中的 traceId 和 spanId 放入 MDC 中,以便稍后可以将其用于某些跟踪目的。
TracingFilter.java
public class TracingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
Tracer tracer = OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder().build()).build()
.getTracer("oTelTracer");
Span restSpan = tracer.spanBuilder("restSpan").setParent(Context.root()).startSpan();
MDC.put("traceId", restSpan.getSpanContext().getTraceId());
MDC.put("spanId", restSpan.getSpanContext().getSpanId());
chain.doFilter(request, response);
}
}
当我查看日志时,我可以看到两个traceId,如下所示
[traceId=24bfdd47cbca0307, spanId=Vd7kdIYE4jIkv91Hy8oDByS/3UfLygMHAAAAAAAAAAA=, corrId=65a48a13-93cb-497b-a1d3-025b95351b40, trace_id=74f80fbcdcf3ecda30f0d62956c3d67a, trace_flags=01, span_id=a95f524c0383f822]
我的日志中只需要一个traceId。我在这里缺少什么?
我尝试更改 Tracer 的创建方式。
使用后务必清除 MDC。 MDC 绑定到一个线程,但线程池可以使其对后续请求可见。
public class TracingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
Tracer tracer = OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder().build()).build()
.getTracer("oTelTracer");
Span restSpan = tracer.spanBuilder("restSpan").setParent(Context.root()).startSpan();
MDC.put("traceId", restSpan.getSpanContext().getTraceId());
MDC.put("spanId", restSpan.getSpanContext().getSpanId());
try {
chain.doFilter(request, response);
} catch(Exception e) {
MDC.clear();
throw e;
}
}
}