首页 > 解决方案 > Spring cloud sleuth ExtraFieldPropagation在Spring cloud Gateway Filter中失败

问题描述

我们有三个Gateway使用spring-cloud-gateway,Service1和的模块Service2。网关呼叫service1service1呼叫service2Service1并且Service2正在使用 spring web Flux Gateway 有 3 个过滤器。全局过滤器、前置过滤器和后置过滤器。

spring:
  cloud:
    gateway:
      default-filters:
        - name: GlobalFilter
      routes:
        id: service1
        uri: http://localhost:9091/
        predicates:
          - Path=/service1/**
        filters:
          - name: PreFilter
          - name: PostFilter

在全局过滤器中,我们从设置为新行李键的请求正文设置中读取值。

ExtraFieldPropagation.set(tracer.currentSpan().context() ,X-CUST_TRAN_ID, transactionID);

我们还设置了如下所示的 Slueth 属性,以便将其打印在日志中并转发到下一个服务(service1service2

    sleuth: 
      baggage-keys: 
        - X-CUST_TRAN_ID
      log:
        slf4j:
          whitelisted-mdc-keys:
           - X-CUST_TRAN_ID

我们面临的问题是

X-CUST_TRAN_ID值通过请求和响应发送并打印在service1andservice2的日志中,但Gateway本身不打印。

它不会在GlobalFilter's 的日志或PreFilter日志语句中打印,而是在PostFilters日志语句中打印。由于CUST_TRAN_ID设置在GlobalFilter's 过滤器中,它应该在设置为上下文后打印在日志语句中。

请帮助以更好的方式设置传播字段以及在日志语句中打印。

标签: javaspring-bootspring-cloud-sleuthspring-cloud-gatewaydistributed-tracing

解决方案


Sleuth 使用它自己的具有默认顺序的过滤器初始化它的上下文。您可以尝试使用以下属性为 sleuth 过滤器提供最高优先级:

spring:
  sleuth:
    web:
      filter-order: -2147483648

推荐阅读