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 中找到答案:
我有一个过滤器 (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 中找到答案: