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 8891edb19..61c31b697 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 @@ -138,6 +138,7 @@ public class TraceFilter extends OncePerRequestFilter { Span parent = spanFromRequest.getSavedSpan(); if (parent.isRemote()) { parent.logEvent(Span.SERVER_SEND); + parent.stop(); this.spanReporter.report(parent); } } else { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index c8e52135e..57d4ec127 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -184,6 +184,20 @@ public class TraceFilterTests { assertNull(TestSpanContextHolder.getCurrentSpan()); } + @Test + public void ensuresThatParentSpanIsStoppedWhenReported() throws Exception { + this.request = builder().header(Span.SPAN_ID_NAME, 10L) + .header(Span.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); + TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys, spanIsStoppedVeryfingReporter(), + this.spanExtractor, this.spanInjector); + + filter.doFilter(this.request, this.response, this.filterChain); + } + + SpanReporter spanIsStoppedVeryfingReporter() { + return (span) -> assertThat(span.getEnd()).as("Span has to be stopped before reporting").isNotZero(); + } + @Test public void additionalMultiValuedHeader() throws Exception { this.request = builder().header(Span.SPAN_ID_NAME, 10L)