From 7c7660a84facb94aa2b1b65994248978da74e48e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 30 Dec 2016 11:35:55 +0100 Subject: [PATCH] Added checks to close / detach only if tracing without this change during asynchronous communication some components are trying to detach or close spans that were aready detached. This leads to exceptions utils warnings and spans were not closed. with this change we're adding additional checks to ensure that we're tracing fixes #447 --- .../org/springframework/cloud/sleuth/TraceRunnable.java | 9 ++++++++- .../instrument/messaging/TraceChannelInterceptor.java | 5 ++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceRunnable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceRunnable.java index cbf838713..688269354 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceRunnable.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceRunnable.java @@ -74,6 +74,10 @@ public class TraceRunnable implements Runnable { } protected void close(Span span) { + // race conditions - check #447 + if (!this.tracer.isTracing()) { + this.tracer.continueSpan(span); + } this.tracer.close(span); } @@ -82,7 +86,10 @@ public class TraceRunnable implements Runnable { } protected Span detachSpan(Span span) { - return this.tracer.detach(span); + if (this.tracer.isTracing()) { + return this.tracer.detach(span); + } + return span; } public Tracer getTracer() { diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceChannelInterceptor.java index e61ef7b5b..9da6a0cc2 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceChannelInterceptor.java @@ -116,7 +116,10 @@ public class TraceChannelInterceptor extends AbstractTraceChannelInterceptor { spanFromHeader.logEvent(Span.SERVER_SEND); addErrorTag(ex); } - getTracer().detach(spanFromHeader); + // related to #447 + if (getTracer().isTracing()) { + getTracer().detach(spanFromHeader); + } } private void addErrorTag(Exception ex) {