我有一个过滤器(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不可用,基本上不会传播密钥。
答案 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