Spring 侦探行李密钥未传播

Spring sleuth Baggage key not getting propagated

我有一个过滤器 (OncePerRequestFilter),它基本上拦截传入的请求并记录 traceId、spanId 等,效果很好, 这个过滤器位于一个公共模块中,该模块包含在其他项目中以避免在我的所有 micro-services 中包含 spring sleuth 依赖项,这是我将其创建为库的原因,因为对库的任何更改都会对所有模块通用。 现在我必须添加一个新的传播密钥,它需要通过 http headers 像 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);

我已将 propagation-keys 和 whitelisted-mdc-keys 添加到我的 application.yml(与我的图书馆)文件中,如下所示

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

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

I've gone through documentation and seems like I need to add spring.sleuth.propagation-keys and whitelist them by using spring.sleuth.log.slf4j.whitelisted-mdc-keys

是的,您需要这样做

is there another way to add these properties in common module so that I do not need to include them in each and every micro services.

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

在你的库中,你可以实现 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();      
    }

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

当您在测试中也需要这些属性时的额外提示,然后您可以在此 post 中找到答案: