From 2bd669cb2cbfcb8aad2e0d2be46bad471b652463 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 20 Jan 2018 16:58:03 +0100 Subject: [PATCH] Should detach span from trace filter for async; fixes #728 --- .../cloud/sleuth/instrument/web/TraceFilter.java | 4 ++-- .../instrument/web/TraceHandlerInterceptor.java | 1 + .../cloud/sleuth/zipkin/ZipkinSpanListenerTests.java | 12 ++---------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java index fa7af77e7..5c0385039 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java @@ -172,9 +172,9 @@ public class TraceFilter extends GenericFilterBean { } finally { if (isAsyncStarted(request) || request.isAsyncStarted()) { if (log.isDebugEnabled()) { - log.debug("The span " + spanFromRequest + " will get detached by a HandleInterceptor"); + log.debug("The span " + this.tracer.getCurrentSpan() + " will get detached"); } - // TODO: how to deal with response annotations and async? + this.tracer.detach(this.tracer.getCurrentSpan()); return; } detachOrCloseSpans(request, response, spanFromRequest, exception); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java index b24515067..eae2285bb 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java @@ -68,6 +68,7 @@ public class TraceHandlerInterceptor extends HandlerInterceptorAdapter { String spanName = spanName(handler); boolean continueSpan = getRootSpanFromAttribute(request) != null; Span span = continueSpan ? getRootSpanFromAttribute(request) : getTracer().createSpan(spanName); + getTracer().continueSpan(span); if (log.isDebugEnabled()) { log.debug("Handling span " + span); } diff --git a/spring-cloud-sleuth-zipkin-legacy/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java b/spring-cloud-sleuth-zipkin-legacy/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java index 14fbf4ab7..7be3ec235 100644 --- a/spring-cloud-sleuth-zipkin-legacy/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java +++ b/spring-cloud-sleuth-zipkin-legacy/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java @@ -16,20 +16,12 @@ package org.springframework.cloud.sleuth.zipkin; -import org.assertj.core.api.Condition; -import org.junit.Ignore; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import zipkin.Constants; - -import java.net.URI; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.Map; import javax.annotation.PostConstruct; +import org.assertj.core.api.Condition; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -42,12 +34,12 @@ import org.springframework.cloud.sleuth.SpanReporter; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.zipkin.ZipkinSpanListenerTests.TestConfiguration; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.mock.env.MockEnvironment; import org.springframework.test.context.junit4.SpringRunner; +import zipkin.Constants; import zipkin.Endpoint; import static org.assertj.core.api.Assertions.assertThat;