Инициализация WebClient
Код для вызова серверной части и инициализации, как показано ниже. В примере кода используется версия Spring-Cloud Hoxton.SR4, org.springframework.boot, версия 2.3.1.RELEASE. Полный образец в https://github.com/malika15/sleuth-resttemplate-webclient-comparison
@EnableAutoConfiguration
@RestController
public class FrontendUsingWebClient {
@Autowired
WebClient webClient;
private Logger log = LoggerFactory.getLogger("FrontendUsingWebClient");
public static void main(String[] args) {
SpringApplication.run(FrontendUsingWebClient.class,
"--spring.application.name=FrontendUsingWebClient",
"--server.port=8081");
}
@Bean
WebClient webClient() {
return WebClient.builder().exchangeStrategies(ExchangeStrategies.builder().codecs(c ->
c.defaultCodecs().enableLoggingRequestDetails(true)).build()
).baseUrl("http://localhost:9000").build();
}
@RequestMapping("/")
public Mono<String> callBackend() {
log.info("Frontend WebClient::Begin");
Mono<String> response = webClient.get().uri("/api").retrieve().bodyToMono(String.class)
.doFirst(() -> log.info("Frontend WebClient ::doFirst"))
.doOnSubscribe(subscription -> log.info("Frontend WebClient::doOnSubscribe"))
.doOnRequest(value -> log.info("Frontend WebClient::doOnRequest"))
.doOnSuccess(s -> log.info("Frontend WebClient::doOnSuccess"))
.doOnEach(stringSignal -> log.info("Frontend WebClient::doOnEach"))
.doOnNext(s -> log.info("Frontend WebClient::doOnNext"))
.doAfterTerminate(() -> log.info("Frontend::doAfterTerminate"))
.doFinally(signalType -> log.info("Frontend WebClient::doFinally"))
.doOnCancel(() -> log.info("Frontend WebClient::doOnCancel"));
log.info("Frontend WebClient::End");
return response;
}
}
Webclient - новый идентификатор диапазона в заголовках HTTP, но не в MD C
Примечание в ниже, в HTTP-заголовке указано X-B3-SpanId:"e8c842b87aa2c176"
, а в MD C - d6737613f8c125f7,d6737613f8c125f7
. Sleuth запускает новый диапазон для вызова веб-клиента и устанавливает его по запросу заголовков X-B3, но не может установить его в TraceContext (MD C)
2020-06-19 13:55:29.516 TRACE [FrontendUsingWebClient,d6737613f8c125f7,d6737613f8c125f7,false] 14008 --- [ctor-http-nio-3] o.s.w.r.f.client.ExchangeFunctions : [418bc045] HTTP GET http://localhost:9000/api, headers=[X-B3-TraceId:"d6737613f8c125f7", X-B3-SpanId:"e8c842b87aa2c176", X-B3-ParentSpanId:"d6737613f8c125f7", X-B3-Sampled:"0"]
RestTemplate - новый идентификатор диапазона в HTTP заголовки и в MD C
Обратите внимание, что в выводе журнала ниже новый диапазон создается Starting scope for span: 2d795955f8643a11/79ec6c794e86cd58
и устанавливается на MD C 2d795955f8643a11,79ec6c794e86cd58
. Sleuth запускает новый диапазон для вызова RestTemplate и закрывается после получения ответа. Установка его на MD C соответствующим образом
2020-06-19 13:52:15.520 DEBUG [FrontendUsingRestTemplate,2d795955f8643a11,2d795955f8643a11,false] 12564 --- [ctor-http-nio-3] o.s.web.client.RestTemplate : HTTP GET http://localhost:9000/api
2020-06-19 13:52:15.524 DEBUG [FrontendUsingRestTemplate,2d795955f8643a11,2d795955f8643a11,false] 12564 --- [ctor-http-nio-3] o.s.web.client.RestTemplate : Accept=[text/plain, application/json, application/*+json, */*]
2020-06-19 13:52:15.525 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,2d795955f8643a11,false] 12564 --- [ctor-http-nio-3] o.s.b.f.s.DefaultListableBeanFactory : Returning cached instance of singleton bean 'tracingClientHttpRequestInterceptor'
2020-06-19 13:52:15.526 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] o.s.c.sleuth.log.Slf4jScopeDecorator : Starting scope for span: 2d795955f8643a11/79ec6c794e86cd58
2020-06-19 13:52:15.526 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] o.s.c.sleuth.log.Slf4jScopeDecorator : With parent: 3276748429663156753
2020-06-19 13:52:15.526 INFO [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] FrontendUsingRestTemplate : Frontend RestTemplate::Sending request to Backend http://localhost:9000/api
2020-06-19 13:52:15.533 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] s.n.www.protocol.http.HttpURLConnection : ProxySelector Request for http://localhost:9000/api
2020-06-19 13:52:15.535 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] s.n.www.protocol.http.HttpURLConnection : Proxy used: DIRECT
2020-06-19 13:52:15.536 DEBUG [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] s.n.www.protocol.http.HttpURLConnection : sun.net.www.MessageHeader@161711d99 pairs: {GET /api HTTP/1.1: null}{Accept: text/plain, application/json, application/*+json, */*}{X-B3-TraceId: 2d795955f8643a11}{X-B3-SpanId: 79ec6c794e86cd58}{X-B3-ParentSpanId: 2d795955f8643a11}{X-B3-Sampled: 0}{User-Agent: Java/11.0.2}{Host: localhost:9000}{Connection: keep-alive}
2020-06-19 13:52:15.766 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] s.n.www.protocol.http.HttpURLConnection : KeepAlive stream used: http://localhost:9000/api
2020-06-19 13:52:15.768 DEBUG [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] s.n.www.protocol.http.HttpURLConnection : sun.net.www.MessageHeader@1c1638c03 pairs: {null: HTTP/1.1 200 OK}{Content-Type: text/plain;charset=UTF-8}{Content-Length: 39}
2020-06-19 13:52:15.769 TRACE [FrontendUsingRestTemplate,2d795955f8643a11,79ec6c794e86cd58,false] 12564 --- [ctor-http-nio-3] o.s.c.sleuth.log.Slf4jScopeDecorator : Closing scope for span: 2d795955f8643a11/79ec6c794e86cd58
2020-06-19 13:52:15.771 DEBUG [FrontendUsingRestTemplate,2d795955f8643a11,2d795955f8643a11,false] 12564 --- [ctor-http-nio-3] o.s.web.client.RestTemplate : Response 200 OK
Ищу идеи о том, как получить диапазон, сгенерированный для вызовов Webclient в MD C, чтобы он отображался в журналах для запроса и ответа