diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilter.java index 08ce2eb41..3ad574f14 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilter.java @@ -18,14 +18,15 @@ package org.springframework.cloud.sleuth.instrument.zuul; import java.lang.invoke.MethodHandles; +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.TraceKeys; import org.springframework.cloud.sleuth.Tracer; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; +import org.springframework.http.HttpStatus; /**8 * A post request {@link ZuulFilter} that publishes an event upon start of the filtering @@ -57,12 +58,27 @@ public class TracePostZuulFilter extends ZuulFilter { if (log.isDebugEnabled()) { log.debug("Closing current client span " + getCurrentSpan() + ""); } - this.tracer.addTag(this.traceKeys.getHttp().getStatusCode(), - String.valueOf(RequestContext.getCurrentContext().getResponse().getStatus())); + int httpStatus = RequestContext.getCurrentContext().getResponse().getStatus(); + if (httpStatus > 0) { + this.tracer.addTag(this.traceKeys.getHttp().getStatusCode(), + String.valueOf(httpStatus)); + } this.tracer.close(getCurrentSpan()); + closeParentSpanIfResponseIsNotSuccess(httpStatus); return null; } + private void closeParentSpanIfResponseIsNotSuccess(int httpStatus) { + if (httpStatus > 0 && httpStatusIsNotSuccess(httpStatus)) { + this.tracer.close(getCurrentSpan()); + } + } + + private boolean httpStatusIsNotSuccess(int httpStatus) { + return HttpStatus.valueOf(httpStatus).is4xxClientError() || + HttpStatus.valueOf(httpStatus).is5xxServerError(); + } + @Override public String filterType() { return "post";