Skip to content

Commit b3c78c1

Browse files
Fixed closing of Zuul span, added local component span for zuul
fixes #242
1 parent 441bd08 commit b3c78c1

File tree

5 files changed

+76
-15
lines changed

5 files changed

+76
-15
lines changed

spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilter.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.springframework.cloud.sleuth.instrument.zuul;
1818

1919
import org.springframework.cloud.sleuth.Span;
20-
import org.springframework.cloud.sleuth.SpanAccessor;
20+
import org.springframework.cloud.sleuth.Tracer;
2121

2222
import com.netflix.zuul.ZuulFilter;
2323

@@ -29,10 +29,10 @@
2929
*/
3030
public class TracePostZuulFilter extends ZuulFilter {
3131

32-
private final SpanAccessor spanAccessor;
32+
private final Tracer tracer;
3333

34-
public TracePostZuulFilter(SpanAccessor spanAccessor) {
35-
this.spanAccessor = spanAccessor;
34+
public TracePostZuulFilter(Tracer tracer) {
35+
this.tracer = tracer;
3636
}
3737

3838
@Override
@@ -44,6 +44,7 @@ public boolean shouldFilter() {
4444
public Object run() {
4545
// TODO: the client sent event should come from the client not the filter!
4646
getCurrentSpan().logEvent(Span.CLIENT_RECV);
47+
this.tracer.close(getCurrentSpan());
4748
return null;
4849
}
4950

@@ -58,6 +59,6 @@ public int filterOrder() {
5859
}
5960

6061
private Span getCurrentSpan() {
61-
return this.spanAccessor.getCurrentSpan();
62+
return this.tracer.getCurrentSpan();
6263
}
6364
}

spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import org.springframework.cloud.sleuth.SpanInjector;
2121
import org.springframework.cloud.sleuth.Tracer;
2222

23+
import com.netflix.zuul.ExecutionStatus;
2324
import com.netflix.zuul.ZuulFilter;
25+
import com.netflix.zuul.ZuulFilterResult;
2426
import com.netflix.zuul.context.RequestContext;
2527

2628
/**
@@ -32,6 +34,8 @@
3234
*/
3335
public class TracePreZuulFilter extends ZuulFilter {
3436

37+
private static final String ZUUL_COMPONENT = "zuul";
38+
3539
private final Tracer tracer;
3640
private final SpanInjector<RequestContext> spanInjector;
3741

@@ -47,12 +51,22 @@ public boolean shouldFilter() {
4751

4852
@Override
4953
public Object run() {
54+
getCurrentSpan().logEvent(Span.CLIENT_SEND);
55+
return null;
56+
}
57+
58+
@Override
59+
public ZuulFilterResult runFilter() {
5060
RequestContext ctx = RequestContext.getCurrentContext();
5161
Span span = getCurrentSpan();
52-
this.spanInjector.inject(span, ctx);
53-
// TODO: the client sent event should come from the client not the filter!
54-
span.logEvent(Span.CLIENT_SEND);
55-
return null;
62+
Span newSpan = this.tracer.createSpan(span.getName(), span);
63+
newSpan.tag(Span.SPAN_LOCAL_COMPONENT_TAG_NAME, ZUUL_COMPONENT);
64+
this.spanInjector.inject(newSpan, ctx);
65+
ZuulFilterResult result = super.runFilter();
66+
if (ExecutionStatus.SUCCESS != result.getStatus()) {
67+
this.tracer.close(newSpan);
68+
}
69+
return result;
5670
}
5771

5872
private Span getCurrentSpan() {

spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceZuulAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
2424
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
25-
import org.springframework.cloud.sleuth.SpanAccessor;
2625
import org.springframework.cloud.sleuth.SpanInjector;
2726
import org.springframework.cloud.sleuth.Tracer;
2827
import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
@@ -63,8 +62,8 @@ public TraceRestClientRibbonCommandFactory traceRestClientRibbonCommandFactory(S
6362

6463
@Bean
6564
@ConditionalOnMissingBean
66-
public TracePostZuulFilter tracePostZuulFilter(SpanAccessor accessor) {
67-
return new TracePostZuulFilter(accessor);
65+
public TracePostZuulFilter tracePostZuulFilter(Tracer tracer) {
66+
return new TracePostZuulFilter(tracer);
6867
}
6968

7069
@Bean

spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilterTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ public void clean() {
5252
}
5353

5454
@Test
55-
public void filterPublishesEvent() throws Exception {
55+
public void filterPublishesEventAndClosesSpan() throws Exception {
5656
Span span = this.tracer.createSpan("http:start");
5757
this.filter.run();
5858

5959
then(span).hasLoggedAnEvent(Span.CLIENT_RECV);
60+
then(this.tracer.getCurrentSpan()).isNull();
6061
}
6162
}

spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilterTests.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.cloud.sleuth.instrument.zuul;
1818

1919
import java.util.Random;
20+
import java.util.concurrent.atomic.AtomicReference;
2021

2122
import org.junit.After;
2223
import org.junit.Before;
@@ -31,6 +32,7 @@
3132
import org.springframework.cloud.sleuth.trace.TestSpanContextHolder;
3233

3334
import com.netflix.zuul.context.RequestContext;
35+
import com.netflix.zuul.monitoring.MonitoringHelper;
3436

3537
import static org.assertj.core.api.BDDAssertions.then;
3638

@@ -45,6 +47,11 @@ public class TracePreZuulFilterTests {
4547

4648
private TracePreZuulFilter filter = new TracePreZuulFilter(this.tracer, new RequestContextInjector());
4749

50+
@Before
51+
public void setup() {
52+
MonitoringHelper.initMocks();
53+
}
54+
4855
@After
4956
@Before
5057
public void clean() {
@@ -56,7 +63,7 @@ public void clean() {
5663
public void filterAddsHeaders() throws Exception {
5764
this.tracer.createSpan("http:start");
5865

59-
this.filter.run();
66+
this.filter.runFilter();
6067

6168
RequestContext ctx = RequestContext.getCurrentContext();
6269
then(ctx.getZuulRequestHeaders().get(Span.TRACE_ID_NAME))
@@ -69,7 +76,7 @@ public void filterAddsHeaders() throws Exception {
6976
public void notSampledIfNotExportable() throws Exception {
7077
this.tracer.createSpan("http:start", NeverSampler.INSTANCE);
7178

72-
this.filter.run();
79+
this.filter.runFilter();
7380

7481
RequestContext ctx = RequestContext.getCurrentContext();
7582
then(ctx.getZuulRequestHeaders().get(Span.TRACE_ID_NAME))
@@ -78,4 +85,43 @@ public void notSampledIfNotExportable() throws Exception {
7885
.isEqualTo(Span.SPAN_NOT_SAMPLED);
7986
}
8087

88+
89+
@Test
90+
public void shouldCloseSpanWhenExceptionIsThrown() throws Exception {
91+
Span startedSpan = this.tracer.createSpan("http:start", NeverSampler.INSTANCE);
92+
final AtomicReference<Span> span = new AtomicReference<>();
93+
94+
new TracePreZuulFilter(this.tracer, new RequestContextInjector()) {
95+
@Override
96+
public Object run() {
97+
super.run();
98+
span.set(TracePreZuulFilterTests.this.tracer.getCurrentSpan());
99+
throw new RuntimeException();
100+
}
101+
}.runFilter();
102+
103+
then(startedSpan).isNotEqualTo(span.get());
104+
then(span.get().logs()).extracting("event").contains(Span.CLIENT_SEND);
105+
then(this.tracer.getCurrentSpan()).isEqualTo(startedSpan);
106+
}
107+
108+
@Test
109+
public void shouldNotCloseSpanWhenNoExceptionIsThrown() throws Exception {
110+
Span startedSpan = this.tracer.createSpan("http:start", NeverSampler.INSTANCE);
111+
final AtomicReference<Span> span = new AtomicReference<>();
112+
113+
new TracePreZuulFilter(this.tracer, new RequestContextInjector()) {
114+
@Override
115+
public Object run() {
116+
span.set(TracePreZuulFilterTests.this.tracer.getCurrentSpan());
117+
return super.run();
118+
}
119+
}.runFilter();
120+
121+
then(startedSpan).isNotEqualTo(span.get());
122+
then(span.get().logs()).extracting("event").contains(Span.CLIENT_SEND);
123+
then(span.get().tags()).containsKey(Span.SPAN_LOCAL_COMPONENT_TAG_NAME);
124+
then(this.tracer.getCurrentSpan()).isEqualTo(span.get());
125+
}
126+
81127
}

0 commit comments

Comments
 (0)