Spring Cloud Sleuth - 获取当前的 traceId?

Spring Cloud Sleuth- Get current traceId?

我正在使用 Sleuth,我想知道是否可以获取当前的 traceId? 我不需要添加任何响应或任何内容。我只想要在某些情况下提醒开发团队的电子邮件的 traceId。

注入Tracer bean并调用tracer.currentSpan()获取当前span。从那里您可以获得跟踪 ID。

请使用 Sleuth 的 API - 这样无论您使用哪个 Tracer 库(Brave / OTel),您的代码都将保持不变。

示例:

import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;

@Component
public class TraceService {

    private final Tracer tracer;

    public TraceService(Tracer tracer) {
        this.tracer = tracer;
    }

    public String traceId() {
        Span span = tracer.currentSpan();
        String traceId = span.context().traceId();
        System.out.println(traceId);
        return traceId;
    }

}

import brave.Span;
import brave.Tracer;

@Service
public class TraceService {

    Tracer tracer;

    public TraceService(Tracer tracer) {
        this.tracer = tracer;
    }

    public void printTraceId() {
        Span span = tracer.currentSpan();
        String traceId = span.context().traceIdString();
        System.out.println(traceId);
    }

}

如果没有正在进行的当前跟踪,tracer.currentSpan() 将 return null 因此 tracer.currentSpan().context() 将抛出 NPE。如果您不确定是否存在当前跟踪并希望在 none 确实存在的情况下创建一个,您应该使用

var span = tracer.startScopedSpan("fancyTitle");
try {
    var traceId = span.context().traceIdString();
    // use traceId ...
} finally {
    span.finish(); // clean up after yourself
}

请注意,这将在现有跟踪中创建一个新的跨度,即始终生成一个新的 spanId