春季侦探行李钥匙未传播

时间:2020-02-19 06:31:36

标签: spring-boot spring-cloud-sleuth distributed-tracing brave

我有一个过滤器(OncePerRequestFilter),它基本上拦截了传入的请求并记录了traceId,spanId等,效果很好, 该过滤器位于其他项目中包含的通用模块中,以避免在我的所有微服务中都包含spring sleuth依赖关系,这是我将其创建为库的原因,因为对库的任何更改对于所有模块都是通用的。 现在,我需要添加一个新的传播密钥,该密钥需要通过http头(例如trace和spanId)传播到所有服务,因为我已经从HttpTracing中提取了当前跨度并为其添加了行李键(如下所示)

 Span span = httpTracing.tracing().tracer().currentSpan();
    String corelationId =
        StringUtils.isEmpty(request.getHeader(CORELATION_ID))
            ? "n/a"
            : request.getHeader(CORELATION_ID);
    ExtraFieldPropagation.set(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);
    span.annotate("baggage_set");
    span.tag(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);

我已经向我的application.yml文件中添加了传播密钥和列入白名单的mdc密钥(与我的库一起),如下所示

spring:
  sleuth:
    propagation-keys:
      - x-corelationId
    log:
      slf4j:
        whitelisted-mdc-keys:
          - x-corelationId

在过滤器中进行此更改后,当我对具有相同应用程序的另一个服务进行http调用时,corelationId不可用,基本上不会传播密钥。

3 个答案:

答案 0 :(得分:0)

我已经阅读了文档,似乎需要添加spring.sleuth.propagation-keys并通过使用spring.sleuth.log.slf4j.whitelisted-mdc-keys将它们列入白名单

是的,您需要这样做

还有另一种方法可以在公共模块中添加这些属性,这样我就不必在每个微服务中都包含它们。

是的,您可以使用Spring Cloud Config服务器和名为application.yml / application.properties的属性文件,该文件将为所有微服务设置这些属性

答案 1 :(得分:0)

在您的库中,您可以实现ApplicationEnvironmentPreparedEvent侦听器并在其中添加所需的配置 例如:

@Component
public class CustomApplicationListener implements ApplicationListener<ApplicationEvent> {

    private static final Logger log = LoggerFactory.getLogger(LagortaApplicationListener.class);

    public void onApplicationEvent(ApplicationEvent event) {

        if (event instanceof ApplicationEnvironmentPreparedEvent) {
            log.debug("Custom ApplicationEnvironmentPreparedEvent Listener");
            ApplicationEnvironmentPreparedEvent envEvent = (ApplicationEnvironmentPreparedEvent) event;
            ConfigurableEnvironment env = envEvent.getEnvironment();
            Properties props = new Properties();
            props.put("spring.sleuth.propagation-keys", "x-corelationId");
            props.put("log.slf4j.whitelisted-mdc-keys:", "x-corelationId");

            env.getPropertySources().addFirst(new PropertiesPropertySource("custom", props));
        }
    }

}

然后在您的微服务中,您将注册此自定义侦听器

public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(MyApplication.class)
                .listeners(new CustomApplicationListener()).run();      
    }

答案 2 :(得分:0)

当您要以编程方式注册whitelisted-mdc-keys时,Mahmoud的答案非常有用。

在测试中同时需要这些属性时的另一条提示,然后您可以在本文中找到答案:How to register a ApplicationEnvironmentPreparedEvent in Spring Test