diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java index f81d44510..8e0a09786 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java @@ -38,6 +38,8 @@ public class TraceWebFilter implements WebFilter, Ordered { protected static final String TRACE_REQUEST_ATTR = TraceWebFilter.class.getName() + ".TRACE"; + private static final String TRACE_SPAN_WITHOUT_PARENT = TraceWebFilter.class.getName() + + ".SPAN_WITH_NO_PARENT"; private static final String HTTP_COMPONENT = "http";/** * If you register your filter before the {@link TraceWebFilter} then you will not @@ -89,10 +91,19 @@ public class TraceWebFilter implements WebFilter, Ordered { HandlerMethod handlerMethod = exchange.getAttribute(HandlerMapping.BEST_MATCHING_HANDLER_ATTRIBUTE); addClassMethodTag(handlerMethod, span); addClassNameTag(handlerMethod, span); + addResponseTagsForSpanWithoutParent(exchange, response); detachOrCloseSpans(span); })); } + private void addResponseTagsForSpanWithoutParent(ServerWebExchange exchange, + ServerHttpResponse response) { + if (spanWithoutParent(exchange) && response.getStatusCode() != null) { + tracer().addTag(traceKeys().getHttp().getStatusCode(), + String.valueOf(response.getStatusCode().value())); + } + } + private void addClassMethodTag(Object handler, Span span) { if (handler instanceof HandlerMethod) { String methodName = ((HandlerMethod) handler).getMethod().getName(); @@ -166,9 +177,11 @@ public class TraceWebFilter implements WebFilter, Ordered { } else { spanFromRequest = tracer().createSpan(name); } + addRequestTags(spanFromRequest, request); } spanFromRequest.logEvent(Span.SERVER_RECV); exchange.getAttributes().put(TRACE_REQUEST_ATTR, spanFromRequest); + exchange.getAttributes().put(TRACE_SPAN_WITHOUT_PARENT, spanFromRequest); if (log.isDebugEnabled()) { log.debug("No parent span present - creating a new span"); } @@ -226,6 +239,10 @@ public class TraceWebFilter implements WebFilter, Ordered { return exchange.getAttribute(TRACE_REQUEST_ATTR); } + private boolean spanWithoutParent(ServerWebExchange exchange) { + return exchange.getAttribute(TRACE_SPAN_WITHOUT_PARENT) != null; + } + private void detachOrCloseSpans(Span spanFromRequest) { Span span = spanFromRequest; if (span != null) {