From e316e8bc3d853213aadbb4dd4ca9b2f2c7294c09 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 10 Apr 2017 16:48:50 +0200 Subject: [PATCH] Stopped producing warnings if the current span is null fixes #552 --- .../cloud/sleuth/trace/DefaultTracer.java | 16 +++++++++++----- .../cloud/sleuth/trace/DefaultTracerTests.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java index b5728856a..40c2f104b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java @@ -16,9 +16,12 @@ package org.springframework.cloud.sleuth.trace; +import java.lang.invoke.MethodHandles; import java.util.Random; import java.util.concurrent.Callable; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanNamer; @@ -38,6 +41,8 @@ import org.springframework.cloud.sleuth.util.SpanNameUtil; */ public class DefaultTracer implements Tracer { + private static final Log log = LogFactory.getLog(MethodHandles.lookup().lookupClass()); + private static final int MAX_CHARS_IN_SPAN_NAME = 50; private final Sampler defaultSampler; @@ -102,17 +107,18 @@ public class DefaultTracer implements Tracer { return continueSpan(span); } - private String shortenNameIfNecessary(String name) { - int maxLength = name.length() > MAX_CHARS_IN_SPAN_NAME ? MAX_CHARS_IN_SPAN_NAME : name.length(); - return name.substring(0, maxLength); - } - @Override public Span detach(Span span) { if (span == null) { return null; } Span cur = SpanContextHolder.getCurrentSpan(); + if (cur == null) { + if (log.isTraceEnabled()) { + log.trace("Span in the context is null so something has already detached the span. Won't do anything about it"); + } + return null; + } if (!span.equals(cur)) { ExceptionUtils.warn("Tried to detach trace span but " + "it is not the current span: " + span + ". You may have forgotten to close or detach " + cur); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java index 8bcd56b0f..eb19e9115 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java @@ -22,9 +22,11 @@ import java.util.Random; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.sleuth.DefaultSpanNamer; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanNamer; @@ -54,6 +56,7 @@ public class DefaultTracerTests { private SpanNamer spanNamer = new DefaultSpanNamer(); private SpanLogger spanLogger = Mockito.mock(SpanLogger.class); private SpanReporter spanReporter = Mockito.mock(SpanReporter.class); + @Rule public OutputCapture capture = new OutputCapture(); @Before public void setup() { @@ -206,6 +209,18 @@ public class DefaultTracerTests { then(child.getName().length()).isEqualTo(50); } + @Test + public void shouldNotProduceAWarningMessageWhenThereIsNoSpanInContextAndWeDetachASpan() { + DefaultTracer tracer = new DefaultTracer(new AlwaysSampler(), new Random(), + this.spanNamer, this.spanLogger, this.spanReporter); + Span span = Span.builder().name("foo").traceId(1L).spanId(1L).build(); + + Span child = tracer.detach(span); + + then(child).isNull(); + then(this.capture.toString()).doesNotContain("Tried to detach trace span"); + } + private String bigName() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 60; i++) {