Merge branch 'master' into 2.0.x

This commit is contained in:
Marcin Grzejszczak
2017-08-17 17:52:01 +02:00
2 changed files with 49 additions and 8 deletions

View File

@@ -90,6 +90,9 @@ public class TraceFilter extends GenericFilterBean {
protected static final String TRACE_CLOSE_SPAN_REQUEST_ATTR = TraceFilter.class.getName()
+ ".CLOSE_SPAN";
private static final String TRACE_SPAN_WITHOUT_PARENT = TraceFilter.class.getName()
+ ".SPAN_WITH_NO_PARENT";
private Tracer tracer;
private TraceKeys traceKeys;
private final Pattern skipPattern;
@@ -216,6 +219,7 @@ public class TraceFilter extends GenericFilterBean {
Span span = spanFromRequest;
if (span != null) {
addResponseTags(response, exception);
addResponseTagsForSpanWithoutParent(request, response);
if (span.hasSavedSpan() && requestHasAlreadyBeenHandled(request)) {
recordParentSpan(span.getSavedSpan());
} else if (!requestHasAlreadyBeenHandled(request)) {
@@ -252,6 +256,18 @@ public class TraceFilter extends GenericFilterBean {
}
}
private void addResponseTagsForSpanWithoutParent(HttpServletRequest request,
HttpServletResponse response) {
if (spanWithoutParent(request) && response.getStatus() >= 100) {
tracer().addTag(traceKeys().getHttp().getStatusCode(),
String.valueOf(response.getStatus()));
}
}
private boolean spanWithoutParent(HttpServletRequest request) {
return request.getAttribute(TRACE_SPAN_WITHOUT_PARENT) != null;
}
private boolean stillTracingCurrentSapn(Span span) {
return tracer().getCurrentSpan().equals(span);
}
@@ -351,6 +367,8 @@ public class TraceFilter extends GenericFilterBean {
} else {
spanFromRequest = tracer().createSpan(name);
}
addRequestTags(spanFromRequest, request);
request.setAttribute(TRACE_SPAN_WITHOUT_PARENT, spanFromRequest);
}
spanFromRequest.logEvent(Span.SERVER_RECV);
request.setAttribute(TRACE_REQUEST_ATTR, spanFromRequest);

View File

@@ -16,6 +16,11 @@
package org.springframework.cloud.sleuth.instrument.web;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Random;
import java.util.regex.Pattern;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -48,11 +53,6 @@ import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Random;
import java.util.regex.Pattern;
import static org.junit.Assert.assertEquals;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.springframework.cloud.sleuth.assertions.SleuthAssertions.assertThat;
@@ -132,7 +132,7 @@ public class TraceFilterTests {
TraceFilter filter = new TraceFilter(beanFactory());
filter.doFilter(this.request, this.response, this.filterChain);
verifyCurrentSpanStatusCode(HttpStatus.OK);
assertThat(this.span.tags()).containsEntry("http.status_code", HttpStatus.OK.toString());
then(TestSpanContextHolder.getCurrentSpan()).isNull();
}
@@ -448,6 +448,29 @@ public class TraceFilterTests {
then(ExceptionUtils.getLastException()).isNull();
}
// #668
@Test
public void shouldSetTraceKeysForAnUntracedRequest() throws Exception {
this.request = builder()
.param("foo", "bar")
.buildRequest(new MockServletContext());
this.response.setStatus(295);
TraceFilter filter = new TraceFilter(beanFactory());
filter.doFilter(this.request, this.response, this.filterChain);
then(new ListOfSpans(this.spanReporter.getSpans()))
.hasASpanWithName("http:/")
.hasASpanWithTagEqualTo("http.url", "http://localhost/?foo=bar")
.hasASpanWithTagEqualTo("http.host", "localhost")
.hasASpanWithTagEqualTo("http.path", "/")
.hasASpanWithTagEqualTo("http.method", "GET")
.hasASpanWithTagEqualTo("http.status_code", "295")
.allSpansAreExportable();
then(TestSpanContextHolder.getCurrentSpan()).isNull();
then(ExceptionUtils.getLastException()).isNull();
}
public void verifyParentSpanHttpTags() {
verifyParentSpanHttpTags(HttpStatus.OK);
}
@@ -460,11 +483,11 @@ public class TraceFilterTests {
assertThat(parentSpan().tags()).contains(entry("http.host", "localhost"),
entry("http.url", "http://localhost/?foo=bar"), entry("http.path", "/"),
entry("http.method", "GET"));
verifyCurrentSpanStatusCode(status);
verifyCurrentSpanStatusCodeForAContinuedSpan(status);
}
private void verifyCurrentSpanStatusCode(HttpStatus status) {
private void verifyCurrentSpanStatusCodeForAContinuedSpan(HttpStatus status) {
// Status is only interesting in non-success case. Omitting it saves at least
// 20bytes per span.
if (status.is2xxSuccessful()) {