Spring boot Spring sleuth行李密钥未被传播
我有一个过滤器(OncePerRequestFilter),它基本上拦截传入的请求并记录traceId、spanId等,效果很好, 此过滤器位于一个公共模块中,该模块包含在其他项目中,以避免在我的所有微服务中包含spring sleuth依赖项,这也是我将其创建为库的原因,因为对库的任何更改都将是所有模块的公共更改。 现在,我必须添加一个新的传播密钥,该密钥需要通过http头(如trace和spanId)传播到所有服务,为此,我从HttpTracing中提取了当前的span,并向其添加了一个baggage密钥(如下所示)Spring boot Spring sleuth行李密钥未被传播,spring-boot,spring-cloud-sleuth,distributed-tracing,brave,Spring Boot,Spring Cloud Sleuth,Distributed Tracing,Brave,我有一个过滤器(OncePerRequestFilter),它基本上拦截传入的请求并记录traceId、spanId等,效果很好, 此过滤器位于一个公共模块中,该模块包含在其他项目中,以避免在我的所有微服务中包含spring sleuth依赖项,这也是我将其创建为库的原因,因为对库的任何更改都将是所有模块的公共更改。 现在,我必须添加一个新的传播密钥,该密钥需要通过http头(如trace和spanId)传播到所有服务,为此,我从HttpTracing中提取了当前的span,并向其添加了一个ba
我已经向application.yml(带有我的库)文件添加了传播密钥和白名单mdc密钥,如下所示
spring:
sleuth:
propagation-keys:
- x-corelationId
log:
slf4j:
whitelisted-mdc-keys:
- x-corelationId
在过滤器中进行此更改后,当我使用相同的应用程序对另一个服务进行http调用时,corelationId不可用,基本上密钥不会传播
我已经阅读了文档,似乎需要添加spring.sleuth.propagation-keys,并使用spring.sleuth.log.slf4j.whitelisted-mdc-keys将它们列入白名单
是的,你需要这样做
有没有其他方法可以在公共模块中添加这些属性,这样我就不需要在每个微服务中都包含它们
是的,您可以使用Spring Cloud Config server和名为
application.yml
/application.properties
的属性文件来设置库中所有微服务的属性。您可以实现ApplicationEnvironment PrepareEvent listener并在其中添加所需的配置
例:
当您希望以编程方式注册列入白名单的mdc密钥时,Mahmoud的答案非常有用
当您在测试中也需要这些属性时,提供额外提示,然后你可以在这篇文章中找到答案:我已经向application.yml添加了传播密钥和白名单中的mdc密钥,但它仍然没有被传播,也不确定为什么我需要添加Sping Cloud Config服务器依赖项。请查看此提交和此应用程序以获得工作示例。至于config server,您询问了一种方法,即所有应用程序都可以设置配置,而不需要为每个应用程序单独设置配置。谢谢@Marcin,但是添加spring cloud config server依赖项和application.yml没有帮助。您不应该只添加依赖项,也不应该在应用程序端实际执行此操作。您熟悉Spring云配置的想法吗?我告诉过您如何利用SpringCloud配置,以便不需要为每个应用程序设置这些属性。请检查提供的提交和代码以了解更多信息。通过一个工作示例,您已经获得了所有必要的详细信息。谢谢,在添加spring cloud config并将我的服务指向它以获取属性之后,它就可以工作了。
spring:
sleuth:
propagation-keys:
- x-corelationId
log:
slf4j:
whitelisted-mdc-keys:
- x-corelationId
@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();
}