update TraceFilter to get TraceId from request

This commit is contained in:
Spencer Gibb
2015-06-24 09:59:39 -06:00
parent 53feadd842
commit 956843fd01

View File

@@ -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);
}
}