Я хотел бы знать, как Spring Cloud Sleuth распространяет контекст MD C между потоками, делая каждый из них доступным для параметров MD C.
Я читал эту статью https://simonbasle.github.io/2018/02/contextual-logging-with-reactor-context-and-mdc/, который предлагает использовать контекст подписчика для распространения состояния MD C между потоками.
Мне нужно сделать что-то похожее с другими параметрами из некоторых заголовков запросов, поэтому я создал, чтобы поместить его в MD C для текущего потока и сохраняет его в контексте подписчика. Однако следующий поток, который возобновляет выполнение, не имеет его в наличии. Каким-то образом я должен снова вызвать MD C в новом потоке, используя значение из контекста, но как?
@Slf4j
@RequiredArgsConstructor
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ReactiveRequestCorrelationFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
String principal = exchange.getRequest().getHeaders().getFirst("principal-header");
MDC.put("principal", principal);
return chain.filter(exchange)
.subscriberContext(Context.of("principal", principal))
.doOnTerminate(MDC::clear);
}
}
Посмотрите на это отображение контроллера:
@GetMapping(value = "/v1/departments", produces = MediaType.APPLICATION_JSON_VALUE)
public Flux<Department> getDepartments() {
log.info("getDepartaments");
return webClient.get().uri("http://someService:8080/api/v1/departamentosFoo").retrieve().bodyToFlux(Departments.class)
.doOnNext(dep -> log.info("found department {}", dep));
}
Это создает этот журнал:
logging.pattern.console="%magenta([%thread]) [%X{traceId}] [%X{spanId}] [%X{principal}] - %m%n"
[boundedElastic-2] [d0a916db8be0cbf7] [d0a916db8be0cbf7] [] - getDepartments
[boundedElastic-2] [d0a916db8be0cbf7] [fb2367685db70201] [] - found department Department(id=1, nombre=dep, fechaAlta=Fri Apr 24 14:16:20 CEST 2020, staff=1, tag=, empresa=true)
[reactor-http-nio-3] [d0a916db8be0cbf7] [d0a916db8be0cbf7] [] - found department Department(id=1, nombre=dep, fechaAlta=Fri Apr 24 14:16:20 CEST 2020, staff=1, tag=, empresa=true)
Запрос начался в потоке реактора-http-nio, а затем переключился на boundedElasti c -2. Как видите, отображаются значения traceId и spanId, но не те, которые я добавил в свой фильтр. Как Sleuth удалось распространить свой контекст (traceId spanId) в другие потоки?