@@ -70,6 +70,7 @@ public void should_instrument_web_filter() throws Exception {
70
70
.run ();
71
71
TestSpanHandler spans = context .getBean (TestSpanHandler .class );
72
72
AssertingWebFilter assertingWebFilter = context .getBean (AssertingWebFilter .class );
73
+ InnerAssertingWebFilter innerAssertingWebFilter = context .getBean (InnerAssertingWebFilter .class );
73
74
int port = context .getBean (Environment .class ).getProperty ("local.server.port" , Integer .class );
74
75
Controller2 controller2 = context .getBean (Controller2 .class );
75
76
clean (spans , controller2 );
@@ -78,6 +79,7 @@ public void should_instrument_web_filter() throws Exception {
78
79
ClientResponse response = whenRequestIsSent (port , "/api/c2/10" );
79
80
// then
80
81
thenSpanWasReportedWithTags (spans , response );
82
+ thenTraceWasAvailableInDoAfter (innerAssertingWebFilter , spans .spans ().get (0 ).id ());
81
83
// then #2002
82
84
then (response .headers ().header ("mytraceid" )).isNotEmpty ();
83
85
clean (spans , controller2 );
@@ -86,35 +88,41 @@ public void should_instrument_web_filter() throws Exception {
86
88
response = whenRequestIsSent (port , "/api/fn/20" );
87
89
// then
88
90
thenFunctionalSpanWasReportedWithTags (spans , response );
91
+ thenTraceWasAvailableInDoAfter (innerAssertingWebFilter , spans .spans ().get (0 ).id ());
89
92
spans .clear ();
90
93
91
94
// when
92
95
response = whenRequestIsSent (port , "/missing-endpoint" );
93
96
// then
94
97
thenSpanWith404StatusCodeWasReported (spans , response );
98
+ thenTraceWasAvailableInDoAfter (innerAssertingWebFilter , spans .spans ().get (0 ).id ());
95
99
spans .clear ();
96
100
97
101
// when
98
102
response = whenRequestIsSent (port , "/exception" );
99
103
// then
100
104
thenSpanWithExceptionWasReported (spans , response );
105
+ thenTraceWasAvailableInDoAfter (innerAssertingWebFilter , spans .spans ().get (0 ).id ());
101
106
spans .clear ();
102
107
103
108
// when
104
109
ClientResponse nonSampledResponse = whenNonSampledRequestIsSent (port );
105
110
// then
106
111
thenNoSpanWasReported (spans , nonSampledResponse , controller2 );
112
+ thenSomeTraceWasAvailableInDoAfter (innerAssertingWebFilter );
107
113
spans .clear ();
108
114
109
115
// when
110
116
ClientResponse skippedPatternResponse = whenRequestIsSentToSkippedPattern (port );
111
117
// then
112
118
thenNoSpanWasReported (spans , skippedPatternResponse , controller2 );
119
+ thenSomeTraceWasAvailableInDoAfter (innerAssertingWebFilter );
113
120
114
121
// when (issue #1683)
115
122
response = whenRequestWithXForwardedForIsSent (port , "/api/fn/20" );
116
123
// then
117
124
thenSpanWasReportedWithRemoteIpTags (spans , response );
125
+ thenTraceWasAvailableInDoAfter (innerAssertingWebFilter , spans .spans ().get (0 ).id ());
118
126
119
127
thenNoTraceWasLeaked (assertingWebFilter );
120
128
@@ -166,6 +174,17 @@ private void thenNoTraceWasLeaked(AssertingWebFilter assertingWebFilter) {
166
174
then (assertingWebFilter .getSpans ()).isEmpty ();
167
175
}
168
176
177
+
178
+ private void thenSomeTraceWasAvailableInDoAfter (InnerAssertingWebFilter assertingWebFilter ) {
179
+ then (assertingWebFilter .getSpans ()).hasSize (1 );
180
+ assertingWebFilter .getSpans ().clear ();
181
+ }
182
+
183
+ private void thenTraceWasAvailableInDoAfter (InnerAssertingWebFilter assertingWebFilter , String spanId ) {
184
+ then (assertingWebFilter .getSpans ()).hasSize (1 ).first ().matches (s -> s .context ().traceIdString ().equals (spanId ));
185
+ assertingWebFilter .getSpans ().clear ();
186
+ }
187
+
169
188
private void thenNoSpanWasReported (TestSpanHandler spans , ClientResponse response , Controller2 controller2 ) {
170
189
Awaitility .await ().untilAsserted (() -> {
171
190
then (response .statusCode ().value ()).isEqualTo (200 );
@@ -247,6 +266,38 @@ AssertingWebFilter traceIdInResponseLastFilter(Tracer tracer) {
247
266
return new AssertingWebFilter (tracer );
248
267
}
249
268
269
+
270
+ @ Bean
271
+ @ Order (Ordered .LOWEST_PRECEDENCE )
272
+ WebFilter innerFilterDoAfterTerminate (Tracer tracer ) {
273
+ return new InnerAssertingWebFilter (tracer );
274
+ }
275
+
276
+ }
277
+
278
+ static class InnerAssertingWebFilter implements WebFilter {
279
+ final Queue <Span > spans = new ConcurrentLinkedQueue <>();
280
+
281
+ private final Tracer tracer ;
282
+
283
+ InnerAssertingWebFilter (Tracer tracer ) {
284
+ this .tracer = tracer ;
285
+ }
286
+
287
+ @ Override
288
+ public Mono <Void > filter (ServerWebExchange exchange , WebFilterChain webFilterChain ) {
289
+ return webFilterChain .filter (exchange )
290
+ .doAfterTerminate (() -> {
291
+ Span currentSpan = tracer .currentSpan ();
292
+ if (currentSpan != null ) {
293
+ spans .add (currentSpan );
294
+ }
295
+ });
296
+ }
297
+
298
+ Queue <Span > getSpans () {
299
+ return spans ;
300
+ }
250
301
}
251
302
252
303
static class AssertingWebFilter implements WebFilter {
0 commit comments