在我的MDC日志中获取两个traceId和spanId

问题描述 投票:0回答:1

我正在使用 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 的创建方式。

java trace open-telemetry mdc
1个回答
0
投票

使用后务必清除 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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.