update TraceFilter to get TraceId from request
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user