diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ServletUtils.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ServletUtils.java index 5aa688695..0809e0704 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ServletUtils.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/ServletUtils.java @@ -20,7 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * Utility class to retrieve data from Servlet HTTP request and handle. + * Utility class to retrieve data from Servlet HTTP request and response. * * @author Marcin Grzejszczak * @since 1.0.0 diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpServerParser.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpServerParser.java index acaa50357..d283db9a6 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpServerParser.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpServerParser.java @@ -72,7 +72,7 @@ class SleuthHttpServerParser extends HttpServerParser { return; } if (httpStatus == HttpServletResponse.SC_OK && error != null) { - // Filter chain threw exception but the handle status may not have been set + // Filter chain threw exception but the response status may not have been set // yet, so we have to guess. customizer.tag(STATUS_CODE_KEY, String.valueOf(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java index b83bbec4a..fbdb26059 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.cloud.sleuth.instrument.web.client; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BiFunction; @@ -349,8 +350,8 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor { @Override public Mono apply(Mono mono, Bootstrap bootstrap) { - return mono.subscriberContext( - context -> context.put(Span.class, tracer().nextSpan())); + return mono.subscriberContext(context -> context.put(AtomicReference.class, + new AtomicReference<>(tracer().currentSpan()))); } private Tracer tracer() { @@ -378,17 +379,6 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor { return "HttpHeaders::add"; } }; - static final Propagation.Getter GETTER = new Propagation.Getter() { - @Override - public String get(HttpHeaders carrier, String key) { - return carrier.get(key); - } - - @Override - public String toString() { - return "HttpHeaders::get"; - } - }; private static final Logger log = LoggerFactory .getLogger(TracingDoOnRequest.class); @@ -414,12 +404,11 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor { @Override public void accept(HttpClientRequest req, Connection connection) { - Span span = req.currentContext().getOrDefault(Span.class, - this.tracer.nextSpan()); - if (log.isDebugEnabled()) { - log.debug("Wrapping do on request"); - } - this.handler.handleSend(this.injector, req.requestHeaders(), req, span); + AtomicReference reference = req.currentContext() + .getOrDefault(AtomicReference.class, new AtomicReference()); + Span span = this.handler.handleSend(this.injector, req.requestHeaders(), req, + (Span) reference.get()); + reference.set(span); } } @@ -491,12 +480,13 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor { protected void handle(HttpClientResponse httpClientResponse, Throwable throwable) { - Span span = httpClientResponse.currentContext().getOrDefault(Span.class, - null); - if (span == null) { + AtomicReference reference = httpClientResponse.currentContext() + .getOrDefault(AtomicReference.class, null); + if (reference == null || reference.get() == null) { return; } - this.handler.handleReceive(httpClientResponse, throwable, span); + this.handler.handleReceive(httpClientResponse, throwable, + (Span) reference.get()); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java index 225f31286..c117661ae 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java @@ -155,7 +155,7 @@ class TraceExchangeFilterFunction implements ExchangeFilterFunction { || clientResponse.statusCode() == null) { if (log.isDebugEnabled()) { log.debug( - "No handle was returned. Will close the span [" + "No response was returned. Will close the span [" + clientSpan + "]"); } handleReceive(clientSpan, ws, clientResponse, @@ -172,7 +172,7 @@ class TraceExchangeFilterFunction implements ExchangeFilterFunction { + clientSpan + "]"); } throwable = new RestClientException( - "Status code of the handle is [" + "Status code of the response is [" + clientResponse.statusCode().value() + "] and the reason is [" + clientResponse.statusCode() diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java index b2a697d0c..fc21624f9 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java @@ -281,7 +281,7 @@ class JmsTestTracingConfiguration { /** * When testing servers or asynchronous clients, spans are reported on a worker * thread. In order to read them on the main thread, we use a concurrent queue. As - * some implementations report after a handle is sent, we use a blocking queue to + * some implementations report after a response is sent, we use a blocking queue to * prevent race conditions in tests. */ BlockingQueue spans = new LinkedBlockingQueue<>(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceCustomFilterResponseInjectorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceCustomFilterResponseInjectorTests.java index 34127df9a..48bd3e9b3 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceCustomFilterResponseInjectorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceCustomFilterResponseInjectorTests.java @@ -80,7 +80,7 @@ public class TraceCustomFilterResponseInjectorTests { Map.class); then(responseEntity.getHeaders()).containsKeys(TRACE_ID_NAME, SPAN_ID_NAME) - .as("Trace headers must be present in handle headers"); + .as("Trace headers must be present in response headers"); } @Configuration diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/integration/WebClientTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/integration/WebClientTests.java index 351d9c748..79b2ca4b0 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/integration/WebClientTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/integration/WebClientTests.java @@ -293,11 +293,13 @@ public class WebClientTests { then(response).isNotNull(); } - then(this.tracer.currentSpan()).isNull(); - System.out.println("Collected span " + this.reporter.getSpans()); - then(this.reporter.getSpans()).isNotEmpty().extracting("traceId", String.class) - .containsOnly(span.context().traceIdString()); - then(this.reporter.getSpans()).extracting("kind.name").contains("CLIENT"); + Awaitility.await().untilAsserted(() -> { + then(this.tracer.currentSpan()).isNull(); + System.out.println("Collected span " + this.reporter.getSpans()); + then(this.reporter.getSpans()).isNotEmpty().extracting("traceId", String.class) + .containsOnly(span.context().traceIdString()); + then(this.reporter.getSpans()).extracting("kind.name").contains("CLIENT"); + }); } @Test diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java index 0cfaf2730..c358a1e64 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java @@ -68,7 +68,7 @@ public class RequestSendingRunnable implements Runnable { ResponseEntity responseEntity = this.restTemplate .exchange(requestWithTraceId(), String.class); then(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); - log.info(String.format("Received the following handle [%s]", responseEntity)); + log.info(String.format("Received the following response [%s]", responseEntity)); } private RequestEntity requestWithTraceId() {