0

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

我已将传播密钥和列入白名单的 mdc-keys 添加到我的 application.yml (与我的库)文件中,如下所示

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

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

4

3 回答 3

0

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

是的,你需要这样做

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

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

于 2020-02-19T07:27:01.093 回答
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();      
    }
于 2020-05-05T15:35:53.267 回答
0

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

当您在测试中也需要这些属性时的额外提示,然后您可以在这篇文章中找到答案:如何在 Spring 测试中注册 ApplicationEnvironmentPreparedEvent

于 2020-06-10T07:58:10.730 回答