如何在 Spring Cloud Gateway GlobalFilter 中获取当前跟踪 ID

问题描述

类似于 Spring Cloud Sleuth- Get current traceId? 但在 Spring Cloud Gateway GlobalFilter 的上下文中

我尝试注入 Tracing 并获取 currentTracingContext 但当我获取当前跟踪上下文时它返回 null

    @Autowired
    private Tracing tracing;

    @Override
    public Mono<Void> filter(final ServerWebExchange exchange,GatewayFilterChain chain) {

        final long startNanos = System.nanoTime();
        System.out.println(tracing.currentTraceContext().get()); // NULL
        return chain
            .filter(exchange)
            .then(
                Mono.fromrunnable(() -> {
                    System.out.println(tracing.currentTraceContext().get()); // NULL
                   ...

我怀疑这是一个 order 问题,我的过滤器没有指定任何 @Order。但是,我尝试了 HIGHEST_PRECEDENCE 和 LOWEST_PRECEDENCE,仍然返回 null。

解决方法

您应该调用 WebFluxSpanOperators 并从 ServerWebExchange - https://github.com/spring-cloud/spring-cloud-sleuth/blob/v3.0.1/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java#L166 检索范围。您应该使用该类中的其他方法来处理网关中的上下文传播。