diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceFilter.java index 0faec9184..1b7d97de3 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceFilter.java @@ -16,10 +16,10 @@ package org.springframework.cloud.sleuth.web; import static org.springframework.cloud.sleuth.Trace.SPAN_ID_NAME; +import static org.springframework.cloud.sleuth.Trace.TRACE_ID_NAME; import static org.springframework.util.StringUtils.hasText; import java.io.IOException; -import java.lang.invoke.MethodHandles; import java.util.Collections; import java.util.regex.Pattern; @@ -28,9 +28,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Trace; @@ -38,13 +35,11 @@ import org.springframework.cloud.sleuth.TraceScope; import org.springframework.web.filter.OncePerRequestFilter; /** - * Filter that takes the value of the {@link CorrelationIdHolder#CORRELATION_ID_HEADER} - * header from either request or response and sets it in the {@link CorrelationIdHolder}. - * It also provides that value in {@link MDC} logging related class so that logger prints - * the value of correlation id at each log. + * Filter that takes the value of the {@link Trace#SPAN_ID_NAME} and + * {@link Trace#TRACE_ID_NAME} header from either request or response and uses them to + * create a new span. * * @see Trace - * @see MDC * * @author Jakub Nabrdalik, 4financeIT * @author Tomasz Nurkiewicz, 4financeIT @@ -52,8 +47,7 @@ import org.springframework.web.filter.OncePerRequestFilter; * @author Spencer Gibb */ public class TraceFilter extends OncePerRequestFilter { - private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup() - .lookupClass()); + public static final Pattern DEFAULT_SKIP_PATTERN = Pattern .compile("/api-docs.*|/autoconfig|/configprops|/dump|/info|/metrics.*|/mappings|/trace|/swagger.*|.*\\.png|.*\\.css|.*\\.js|.*\\.html"); @@ -74,44 +68,51 @@ public class TraceFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String spanIdFromRequest = getSpanIdFrom(request); - String spanId = (hasText(spanIdFromRequest)) ? spanIdFromRequest - : getSpanIdFrom(response); + + String uri = hasText(request.getRequestURI()) ? request.getRequestURI() : ""; + boolean skip = skipPattern.matcher(uri).matches(); TraceScope traceScope = null; - if (spanId != null) { - addCorrelationIdToResponseIfNotPresent(response, spanId); + if (!skip) { + String spanId = getHeader(request, response, SPAN_ID_NAME); + String traceId = getHeader(request, response, TRACE_ID_NAME); + if (hasText(spanId) && hasText(traceId)) { - Span span = MilliSpan.builder().traceId("") // FIXME get traceId from request - .parents(Collections.singletonList(spanId)) - // TODO: use parent() when lombok plugin supports it - .build(); - traceScope = trace.startSpan("traceFilter", span); - } - else { - traceScope = trace.startSpan("traceFilter"); + Span span = MilliSpan.builder() + .traceId(traceId) + .parents(Collections.singletonList(spanId)) + // TODO: use parent() when lombok plugin supports it + .build(); + // Send new span id back + addToResponseIfNotPresent(response, SPAN_ID_NAME, span.getSpanId()); + + traceScope = trace.startSpan("traceFilter", span); + } + else { + traceScope = trace.startSpan("traceFilter"); + } } try { filterChain.doFilter(request, response); } finally { - traceScope.close(); + if (traceScope != null) { + traceScope.close(); + } } } - private String getSpanIdFrom(final HttpServletResponse response) { - return response.getHeader(SPAN_ID_NAME); + private String getHeader(HttpServletRequest request, HttpServletResponse response, + String name) { + String value = request.getHeader(name); + return hasText(value) ? value : response.getHeader(name); } - private String getSpanIdFrom(final HttpServletRequest request) { - return request.getHeader(SPAN_ID_NAME); - } - - private void addCorrelationIdToResponseIfNotPresent(HttpServletResponse response, - String spanId) { - if (!hasText(response.getHeader(SPAN_ID_NAME))) { - response.addHeader(SPAN_ID_NAME, spanId); + private void addToResponseIfNotPresent(HttpServletResponse response, String name, + String value) { + if (!hasText(response.getHeader(name))) { + response.addHeader(name, value); } }