From 797ca4f50c09f7adb0654532836485358b43b068 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 19 Jan 2016 12:38:04 +0100 Subject: [PATCH 1/3] Removed Trace --- .../cloud/sleuth/MilliSpan.java | 27 +++++++ .../springframework/cloud/sleuth/Span.java | 22 ++++++ .../springframework/cloud/sleuth/Trace.java | 71 ------------------- .../springframework/cloud/sleuth/Tracer.java | 12 ++-- ...raceBootstrapEnvironmentPostProcessor.java | 8 +-- .../sleuth/instrument/TraceCallable.java | 4 +- .../sleuth/instrument/TraceDelegate.java | 16 ++--- .../sleuth/instrument/TraceRunnable.java | 4 +- .../instrument/hystrix/TraceCommand.java | 7 +- ...eContextPropagationChannelInterceptor.java | 17 +++-- .../scheduling/TraceSchedulingAspect.java | 4 +- .../sleuth/instrument/web/TraceFilter.java | 51 +++++++------ .../web/TraceHandlerInterceptor.java | 16 ++--- .../TraceFeignClientAutoConfiguration.java | 21 +++--- .../client/TraceRestTemplateInterceptor.java | 13 ++-- .../instrument/zuul/TracePreZuulFilter.java | 13 ++-- .../TraceRestClientRibbonCommandFactory.java | 13 ++-- .../cloud/sleuth/log/Slf4jSpanListener.java | 23 +++--- .../sleuth/sampler/IsTracingSampler.java | 4 +- .../cloud/sleuth/template/TraceCallback.java | 4 +- .../cloud/sleuth/trace/DefaultTracer.java | 67 +++++++++-------- ...textHolder.java => SpanContextHolder.java} | 32 ++++----- .../sleuth/DefaultTraceManagerTests.java | 12 ++-- .../sleuth/instrument/TraceCallableTests.java | 42 +++++------ ...HystrixViaAnnotationsIntegrationTests.java | 8 +-- .../instrument/hystrix/TraceCommandTests.java | 44 ++++++------ .../TraceChannelInterceptorTests.java | 45 ++++++------ ...extPropagationChannelInterceptorTests.java | 13 ++-- ...ceStompMessageChannelInterceptorTests.java | 18 ++--- ...extPropagationChannelInterceptorTests.java | 6 +- .../scheduling/TracingOnScheduledTests.java | 4 +- ...stTemplateTraceAspectIntegrationTests.java | 4 +- .../web/TraceAsyncIntegrationTests.java | 8 +-- .../web/TraceFilterIntegrationTests.java | 7 +- .../TraceFilterMockChainIntegrationTests.java | 25 ++++--- .../instrument/web/TraceFilterTests.java | 58 ++++++++------- .../sleuth/template/TraceTemplateTests.java | 28 ++++---- .../main/java/sample/SampleController.java | 3 +- .../java/tools/RequestSendingRunnable.java | 3 +- .../main/java/sample/SampleController.java | 3 +- .../main/java/sample/SampleController.java | 3 +- .../stream/SleuthStreamAutoConfiguration.java | 4 +- .../stream/StreamSpanListenerTests.java | 17 +++-- .../zipkin/ZipkinSpanListenerTests.java | 13 ++-- 44 files changed, 382 insertions(+), 435 deletions(-) delete mode 100644 spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Trace.java rename spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/{TraceContextHolder.java => SpanContextHolder.java} (63%) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java index 95a2ba02d..b648dce4a 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java @@ -45,12 +45,32 @@ public class MilliSpan implements Span { private final String processId; @Singular private final List logs = new ArrayList<>(); + private final Span savedSpan; public static MilliSpan.MilliSpanBuilder builder() { return new MilliSpan().toBuilder(); } + public MilliSpan(Span current, Span savedSpan) { + this.begin = current.getBegin(); + this.end = current.getEnd(); + this.name = current.getName(); + this.traceId = current.getTraceId(); + this.parents = current.getParents(); + this.spanId = current.getSpanId(); + this.remote = current.isRemote(); + this.exportable = current.isExportable(); + this.processId = current.getProcessId(); + this.tags.putAll(current.tags()); + this.logs.addAll(current.logs()); + this.savedSpan = savedSpan; + } + public MilliSpan(long begin, long end, String name, long traceId, List parents, long spanId, boolean remote, boolean exportable, String processId) { + this(begin, end, name, traceId, parents, spanId, remote, exportable, processId, null); + } + + public MilliSpan(long begin, long end, String name, long traceId, List parents, long spanId, boolean remote, boolean exportable, String processId, Span savedSpan) { this.begin = begin<=0 ? System.currentTimeMillis() : begin; this.end = end; this.name = name; @@ -60,6 +80,7 @@ public class MilliSpan implements Span { this.remote = remote; this.exportable = exportable; this.processId = processId; + this.savedSpan = savedSpan; } //for serialization @@ -70,6 +91,7 @@ public class MilliSpan implements Span { this.spanId = 0; this.processId = null; this.parents = new ArrayList<>(); + this.savedSpan = null; } @Override @@ -120,4 +142,9 @@ public class MilliSpan implements Span { return Collections.unmodifiableList(this.logs); } + @Override + public boolean hasSavedSpan() { + return savedSpan != null; + } + } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java index 42aefcbb3..f24b23dd1 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java @@ -19,6 +19,7 @@ package org.springframework.cloud.sleuth; import org.springframework.util.Assert; import java.math.BigInteger; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -31,6 +32,16 @@ import java.util.Map; */ public interface Span { + String NOT_SAMPLED_NAME = "X-Not-Sampled"; + String PROCESS_ID_NAME = "X-Process-Id"; + String PARENT_ID_NAME = "X-Parent-Id"; + String TRACE_ID_NAME = "X-Trace-Id"; + String SPAN_NAME_NAME = "X-Span-Name"; + String SPAN_ID_NAME = "X-Span-Id"; + List HEADERS = Arrays.asList(SPAN_ID_NAME, TRACE_ID_NAME, + SPAN_NAME_NAME, PARENT_ID_NAME, PROCESS_ID_NAME, NOT_SAMPLED_NAME); + String SPAN_EXPORT_NAME = "X-Span-Export"; + /** * A human-readable name assigned to this span instance. *

@@ -152,4 +163,15 @@ public interface Span { return new BigInteger(hexString, 16).longValue(); } } + + /** + * The span that was "current" before this span was entered + */ + Span getSavedSpan(); + + /** + * + * @return true if there was a "current" span before this span was entered + */ + boolean hasSavedSpan(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Trace.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Trace.java deleted file mode 100644 index 7d7eaa24f..000000000 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Trace.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2013-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.sleuth; - -import java.util.Arrays; -import java.util.List; - -import lombok.Value; -import lombok.experimental.NonFinal; - -/** - * A wrapper around the current span with context for a possible hierarchy or stack of - * spans being monitored. - * - * @author Spencer Gibb - */ -@Value -@NonFinal -public class Trace { - - public static final String NOT_SAMPLED_NAME = "X-Not-Sampled"; - - public static final String PROCESS_ID_NAME = "X-Process-Id"; - - public static final String PARENT_ID_NAME = "X-Parent-Id"; - - public static final String TRACE_ID_NAME = "X-Trace-Id"; - - public static final String SPAN_NAME_NAME = "X-Span-Name"; - - public static final String SPAN_ID_NAME = "X-Span-Id"; - - public static final String SPAN_EXPORT_NAME = "X-Span-Export"; - - public static final List HEADERS = Arrays.asList(SPAN_ID_NAME, TRACE_ID_NAME, - SPAN_NAME_NAME, PARENT_ID_NAME, PROCESS_ID_NAME, NOT_SAMPLED_NAME); - - /** - * the span for this trace - */ - private final Span span; - - /** - * the trace that was "current" before this trace was entered - */ - private final Trace saved; - - public Trace(Trace saved, Span span) { - this.saved = saved; - this.span = span; - } - - public Trace(Span span) { - this(null, span); - } - -} diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java index 7e353b316..bee98b49f 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java @@ -61,7 +61,7 @@ public interface Tracer extends TraceAccessor { * * @param name The name field for the new span to create. */ - Trace startTrace(String name); + Span startTrace(String name); /** * Creates a new trace scope with a specific parent. The parent might be in another @@ -73,7 +73,7 @@ public interface Tracer extends TraceAccessor { * * @param name The name field for the new span to create. */ - Trace joinTrace(String name, Span parent); + Span joinTrace(String name, Span parent); /** * Start a new span if the sampler allows it or if we are already tracing in this @@ -81,12 +81,12 @@ public interface Tracer extends TraceAccessor { * @param name the name of the span * @param sampler a sampler to decide whether to create the span or not */ - Trace startTrace(String name, Sampler sampler); + Span startTrace(String name, Sampler sampler); /** * Pick up an existing span from another thread. */ - Trace continueSpan(Span s); + Span continueSpan(Span s); /** * Adds a tag to the current span if tracing is currently on. @@ -100,7 +100,7 @@ public interface Tracer extends TraceAccessor { * * @return the saved trace if there was one before the trace started (null otherwise) */ - Trace detach(Trace trace); + Span detach(Span trace); /** * Remove this span from the current thread, stop it and send it for collection. @@ -108,7 +108,7 @@ public interface Tracer extends TraceAccessor { * @param trace the trace to close * @return the saved trace if there was one before the trace started (null otherwise) */ - Trace close(Trace trace); + Span close(Span trace); Callable wrap(Callable callable); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java index d1dedea3b..86243ba02 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java @@ -21,7 +21,7 @@ import java.util.Map; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; @@ -35,9 +35,9 @@ import org.springframework.util.ClassUtils; public class TraceBootstrapEnvironmentPostProcessor implements EnvironmentPostProcessor { private static final String PROPERTY_SOURCE_NAME = "defaultProperties"; - private static String[] headers = new String[] { Trace.SPAN_ID_NAME, - Trace.TRACE_ID_NAME, Trace.PARENT_ID_NAME, Trace.PROCESS_ID_NAME, - Trace.NOT_SAMPLED_NAME, Trace.SPAN_NAME_NAME }; + private static String[] headers = new String[] { Span.SPAN_ID_NAME, + Span.TRACE_ID_NAME, Span.PARENT_ID_NAME, Span.PROCESS_ID_NAME, + Span.NOT_SAMPLED_NAME, Span.SPAN_NAME_NAME }; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java index 1b31abb37..5a9b028bf 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.instrument; import java.util.concurrent.Callable; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import lombok.EqualsAndHashCode; @@ -43,7 +43,7 @@ public class TraceCallable extends TraceDelegate> implements Call @Override public V call() throws Exception { ensureThatThreadIsNotPollutedByPreviousTraces(); - Trace trace = startSpan(); + Span trace = startSpan(); try { return this.getDelegate().call(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java index 4c9bc2faf..28a1548c9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java @@ -16,12 +16,10 @@ package org.springframework.cloud.sleuth.instrument; -import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; -import org.springframework.cloud.sleuth.Tracer; - import lombok.Getter; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; /** * @author Spencer Gibb @@ -45,18 +43,18 @@ public abstract class TraceDelegate { this.parent = tracer.getCurrentSpan(); } - protected void close(Trace trace) { + protected void close(Span trace) { this.tracer.close(trace); } - protected void closeAll(Trace trace) { + protected void closeAll(Span trace) { trace = this.tracer.close(trace); while (trace != null) { trace = this.tracer.detach(trace); } } - protected Trace startSpan() { + protected Span startSpan() { return this.tracer.joinTrace(getSpanName(), this.parent); } @@ -65,6 +63,6 @@ public abstract class TraceDelegate { } protected void ensureThatThreadIsNotPollutedByPreviousTraces() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java index 982491494..0baf6c843 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java @@ -16,7 +16,7 @@ package org.springframework.cloud.sleuth.instrument; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import lombok.EqualsAndHashCode; @@ -40,7 +40,7 @@ public class TraceRunnable extends TraceDelegate implements Runnable { @Override public void run() { ensureThatThreadIsNotPollutedByPreviousTraces(); - Trace trace = startSpan(); + Span trace = startSpan(); try { this.getDelegate().run(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java index 455ade803..b520d584a 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java @@ -20,9 +20,8 @@ import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.HystrixCommandGroupKey; import com.netflix.hystrix.HystrixThreadPoolKey; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; /** * Abstraction over {@code HystrixCommand} that wraps command execution with Trace setting @@ -72,7 +71,7 @@ public abstract class TraceCommand extends HystrixCommand { @Override protected R run() throws Exception { enforceThatHystrixThreadIsNotPollutedByPreviousTraces(); - Trace trace = this.tracer.joinTrace(getCommandKey().name(), parentSpan); + Span trace = this.tracer.joinTrace(getCommandKey().name(), parentSpan); try { return doRun(); } finally { @@ -82,7 +81,7 @@ public abstract class TraceCommand extends HystrixCommand { // TODO: Do more analysis why this is not removed properly private void enforceThatHystrixThreadIsNotPollutedByPreviousTraces() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } public abstract R doRun() throws Exception; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java index d96e6509d..3a51492e8 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java @@ -18,7 +18,6 @@ package org.springframework.cloud.sleuth.instrument.integration; import org.springframework.aop.support.AopUtils; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.integration.channel.DirectChannel; import org.springframework.messaging.Message; @@ -50,7 +49,7 @@ public class TraceContextPropagationChannelInterceptor extends ChannelIntercepto private final Tracer tracer; - private final static ThreadLocal ORIGINAL_CONTEXT = new ThreadLocal<>(); + private final static ThreadLocal ORIGINAL_CONTEXT = new ThreadLocal<>(); public TraceContextPropagationChannelInterceptor(Tracer tracer) { this.tracer = tracer; @@ -101,12 +100,12 @@ public class TraceContextPropagationChannelInterceptor extends ChannelIntercepto protected void populatePropagatedContext(Span span, Message message, MessageChannel channel) { if (span != null) { - ORIGINAL_CONTEXT.set(this.tracer.continueSpan(span).getSaved()); + ORIGINAL_CONTEXT.set(this.tracer.continueSpan(span).getSavedSpan()); } } protected void resetPropagatedContext() { - Trace originalContext = ORIGINAL_CONTEXT.get(); + Span originalContext = ORIGINAL_CONTEXT.get(); this.tracer.detach(originalContext); ORIGINAL_CONTEXT.remove(); } @@ -128,16 +127,16 @@ public class TraceContextPropagationChannelInterceptor extends ChannelIntercepto Map headers = new HashMap<>(); headers.putAll(message.getHeaders()); - setHeader(headers, Trace.SPAN_ID_NAME, this.span.getSpanId()); - setHeader(headers, Trace.TRACE_ID_NAME, this.span.getTraceId()); - setHeader(headers, Trace.SPAN_NAME_NAME, this.span.getName()); + setHeader(headers, Span.SPAN_ID_NAME, this.span.getSpanId()); + setHeader(headers, Span.TRACE_ID_NAME, this.span.getTraceId()); + setHeader(headers, Span.SPAN_NAME_NAME, this.span.getName()); Long parentId = getParentId(span); if (parentId != null) { - setHeader(headers, Trace.PARENT_ID_NAME, parentId); + setHeader(headers, Span.PARENT_ID_NAME, parentId); } String processId = span.getProcessId(); if (StringUtils.hasText(processId)) { - setHeader(headers, Trace.PROCESS_ID_NAME, processId); + setHeader(headers, Span.PROCESS_ID_NAME, processId); } this.messageHeaders = new MessageHeaders(headers); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java index ec51cfd4d..0f2707558 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java @@ -19,7 +19,7 @@ package org.springframework.cloud.sleuth.instrument.scheduling; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.scheduling.annotation.Scheduled; @@ -46,7 +46,7 @@ public class TraceSchedulingAspect { @Around("execution (@org.springframework.scheduling.annotation.Scheduled * *.*(..))") public Object traceBackgroundThread(final ProceedingJoinPoint pjp) throws Throwable { - Trace trace = this.tracer.startTrace(pjp.toShortString()); + Span trace = this.tracer.startTrace(pjp.toShortString()); try { return pjp.proceed(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java index f33a6930c..a98865d3b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java @@ -32,13 +32,12 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.MilliSpan.MilliSpanBuilder; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.ServerReceivedEvent; import org.springframework.cloud.sleuth.event.ServerSentEvent; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.cloud.sleuth.sampler.IsTracingSampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -49,15 +48,15 @@ import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.UrlPathHelper; /** - * 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 + * Filter that takes the value of the {@link Span#SPAN_ID_NAME} and + * {@link Span#TRACE_ID_NAME} header from either request or response and uses them to * create a new span. * *

In order to keep the size of spans manageable, this only add tags defined in {@link TraceKeys}. * If you need to add additional tags, such as headers subtype this and override * {@link #addRequestTags} or {@link #addResponseTags}. * - * @see TraceManager + * @see Tracer * @see TraceKeys * @see TraceWebAutoConfiguration#traceWebFilter(TraceFilter) * @@ -106,32 +105,32 @@ public class TraceFilter extends OncePerRequestFilter protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); String uri = this.urlPathHelper.getPathWithinApplication(request); boolean skip = this.skipPattern.matcher(uri).matches() - || getHeader(request, response, Trace.NOT_SAMPLED_NAME) != null; + || getHeader(request, response, Span.NOT_SAMPLED_NAME) != null; - Trace trace = (Trace) request.getAttribute(TRACE_REQUEST_ATTR); + Span trace = (Span) request.getAttribute(TRACE_REQUEST_ATTR); if (trace != null) { - this.tracer.continueSpan(trace.getSpan()); + this.tracer.continueSpan(trace); } else if (skip) { - addToResponseIfNotPresent(response, Trace.NOT_SAMPLED_NAME, ""); + addToResponseIfNotPresent(response, Span.NOT_SAMPLED_NAME, ""); } String name = "http" + uri; - if (hasHeader(request, response, Trace.TRACE_ID_NAME)) { - long traceId = Span.IdConverter.fromHex(getHeader(request, response, Trace.TRACE_ID_NAME)); - long spanId = hasHeader(request, response, Trace.SPAN_ID_NAME) ? - Span.IdConverter.fromHex(getHeader(request, response, Trace.SPAN_ID_NAME)) : this.random.nextLong(); + if (hasHeader(request, response, Span.TRACE_ID_NAME)) { + long traceId = Span.IdConverter.fromHex(getHeader(request, response, Span.TRACE_ID_NAME)); + long spanId = hasHeader(request, response, Span.SPAN_ID_NAME) ? + Span.IdConverter.fromHex(getHeader(request, response, Span.SPAN_ID_NAME)) : this.random.nextLong(); MilliSpanBuilder span = MilliSpan.builder().traceId(traceId).spanId(spanId); if (skip) { span.exportable(false); } - String processId = getHeader(request, response, Trace.PROCESS_ID_NAME); - String parentName = getHeader(request, response, Trace.SPAN_NAME_NAME); + String processId = getHeader(request, response, Span.PROCESS_ID_NAME); + String parentName = getHeader(request, response, Span.SPAN_NAME_NAME); if (StringUtils.hasText(parentName)) { span.name(parentName); } else { @@ -140,14 +139,14 @@ public class TraceFilter extends OncePerRequestFilter if (StringUtils.hasText(processId)) { span.processId(processId); } - if (hasHeader(request, response, Trace.PARENT_ID_NAME)) { - span.parent(Span.IdConverter.fromHex(getHeader(request, response, Trace.PARENT_ID_NAME))); + if (hasHeader(request, response, Span.PARENT_ID_NAME)) { + span.parent(Span.IdConverter.fromHex(getHeader(request, response, Span.PARENT_ID_NAME))); } span.remote(true); Span parent = span.build(); trace = this.tracer.joinTrace(name, parent); - publish(new ServerReceivedEvent(this, parent, trace.getSpan())); + publish(new ServerReceivedEvent(this, parent, trace)); request.setAttribute(TRACE_REQUEST_ATTR, trace); } @@ -179,14 +178,14 @@ public class TraceFilter extends OncePerRequestFilter return; } if (skip) { - addToResponseIfNotPresent(response, Trace.NOT_SAMPLED_NAME, ""); + addToResponseIfNotPresent(response, Span.NOT_SAMPLED_NAME, ""); } if (trace != null) { addResponseTags(response, exception); - addResponseHeaders(response, trace.getSpan()); - if (trace.getSaved() != null) { - publish(new ServerSentEvent(this, trace.getSaved().getSpan(), - trace.getSpan())); + addResponseHeaders(response, trace); + if (trace.hasSavedSpan()) { + publish(new ServerSentEvent(this, trace.getSavedSpan(), + trace)); } // Double close to clean up the parent (remote span as well) this.tracer.close(this.tracer.close(trace)); @@ -196,8 +195,8 @@ public class TraceFilter extends OncePerRequestFilter private void addResponseHeaders(HttpServletResponse response, Span span) { if (span != null) { - response.addHeader(Trace.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); - response.addHeader(Trace.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + response.addHeader(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); + response.addHeader(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java index ae17295b6..9f807c784 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHandlerInterceptor.java @@ -16,14 +16,14 @@ package org.springframework.cloud.sleuth.instrument.web; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + /** * @author Spencer Gibb */ @@ -42,8 +42,8 @@ public class TraceHandlerInterceptor implements HandlerInterceptor { Object handler) throws Exception { // TODO: get trace data from request? // TODO: what is the description? - Trace trace = this.tracer.startTrace("traceHandlerInterceptor"); - request.setAttribute(ATTR_NAME, trace); + Span span = this.tracer.startTrace("traceHandlerInterceptor"); + request.setAttribute(ATTR_NAME, span); return true; } @@ -56,7 +56,7 @@ public class TraceHandlerInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - Trace trace = Trace.class.cast(request.getAttribute(ATTR_NAME)); - this.tracer.close(trace); + Span span = Span.class.cast(request.getAttribute(ATTR_NAME)); + this.tracer.close(span); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java index 8a1dbfff2..cbcae4f76 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java @@ -36,7 +36,6 @@ import org.springframework.cloud.netflix.feign.FeignAutoConfiguration; import org.springframework.cloud.netflix.feign.support.ResponseEntityDecoder; import org.springframework.cloud.netflix.feign.support.SpringDecoder; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.ClientReceivedEvent; @@ -123,14 +122,14 @@ public class TraceFeignClientAutoConfiguration { public void apply(RequestTemplate template) { Span span = getCurrentSpan(); if (span == null) { - setHeader(template, Trace.NOT_SAMPLED_NAME, ""); + setHeader(template, Span.NOT_SAMPLED_NAME, ""); return; } - template.header(Trace.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); - setHeader(template, Trace.SPAN_NAME_NAME, span.getName()); - setHeader(template, Trace.SPAN_ID_NAME, span.getSpanId()); - setHeader(template, Trace.PARENT_ID_NAME, getParentId(span)); - setHeader(template, Trace.PROCESS_ID_NAME, span.getProcessId()); + template.header(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + setHeader(template, Span.SPAN_NAME_NAME, span.getName()); + setHeader(template, Span.SPAN_ID_NAME, span.getSpanId()); + setHeader(template, Span.PARENT_ID_NAME, getParentId(span)); + setHeader(template, Span.PROCESS_ID_NAME, span.getProcessId()); publish(new ClientSentEvent(this, span)); } }; @@ -166,12 +165,12 @@ public class TraceFeignClientAutoConfiguration { newHeaders.putAll(headers); Span span = getCurrentSpan(); if (span == null) { - setHeader(newHeaders, Trace.NOT_SAMPLED_NAME, ""); + setHeader(newHeaders, Span.NOT_SAMPLED_NAME, ""); return newHeaders; } - setHeader(newHeaders, Trace.TRACE_ID_NAME, span.getTraceId()); - setHeader(newHeaders, Trace.SPAN_ID_NAME, span.getSpanId()); - setHeader(newHeaders, Trace.PARENT_ID_NAME, getParentId(span)); + setHeader(newHeaders, Span.TRACE_ID_NAME, span.getTraceId()); + setHeader(newHeaders, Span.SPAN_ID_NAME, span.getSpanId()); + setHeader(newHeaders, Span.PARENT_ID_NAME, getParentId(span)); return newHeaders; } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java index e036cd1af..750839e93 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java @@ -16,7 +16,6 @@ package org.springframework.cloud.sleuth.instrument.web.client; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.event.ClientReceivedEvent; import org.springframework.cloud.sleuth.event.ClientSentEvent; @@ -62,14 +61,14 @@ ApplicationEventPublisherAware { ClientHttpRequestExecution execution) throws IOException { Span span = getCurrentSpan(); if (span == null) { - setHeader(request, Trace.NOT_SAMPLED_NAME, ""); + setHeader(request, Span.NOT_SAMPLED_NAME, ""); return execution.execute(request, body); } - setHeader(request, Trace.TRACE_ID_NAME, span.getTraceId()); - setHeader(request, Trace.SPAN_ID_NAME, span.getSpanId()); - setHeader(request, Trace.SPAN_NAME_NAME, span.getName()); - setHeader(request, Trace.PARENT_ID_NAME, getParentId(span)); - setHeader(request, Trace.PROCESS_ID_NAME, span.getProcessId()); + setHeader(request, Span.TRACE_ID_NAME, span.getTraceId()); + setHeader(request, Span.SPAN_ID_NAME, span.getSpanId()); + setHeader(request, Span.SPAN_NAME_NAME, span.getName()); + setHeader(request, Span.PARENT_ID_NAME, getParentId(span)); + setHeader(request, Span.PROCESS_ID_NAME, span.getProcessId()); publish(new ClientSentEvent(this, span)); return new TraceHttpResponse(this, execution.execute(request, body)); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java index b0b3ca4ea..35bf98f8d 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java @@ -19,7 +19,6 @@ package org.springframework.cloud.sleuth.instrument.zuul; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.event.ClientSentEvent; import org.springframework.context.ApplicationEvent; @@ -61,15 +60,15 @@ ApplicationEventPublisherAware { // N.B. this will only work with the simple host filter (not ribbon) unless you set hystrix.execution.isolation.strategy=SEMAPHORE Span span = getCurrentSpan(); if (span == null) { - setHeader(response, Trace.NOT_SAMPLED_NAME, ""); + setHeader(response, Span.NOT_SAMPLED_NAME, ""); return null; } try { - setHeader(response, Trace.SPAN_ID_NAME, span.getSpanId()); - setHeader(response, Trace.TRACE_ID_NAME, span.getTraceId()); - setHeader(response, Trace.SPAN_NAME_NAME, span.getName()); - setHeader(response, Trace.PARENT_ID_NAME, getParentId(span)); - setHeader(response, Trace.PROCESS_ID_NAME, span.getProcessId()); + setHeader(response, Span.SPAN_ID_NAME, span.getSpanId()); + setHeader(response, Span.TRACE_ID_NAME, span.getTraceId()); + setHeader(response, Span.SPAN_NAME_NAME, span.getName()); + setHeader(response, Span.PARENT_ID_NAME, getParentId(span)); + setHeader(response, Span.PROCESS_ID_NAME, span.getProcessId()); // TODO: the client sent event should come from the client not the filter! publish(new ClientSentEvent(this, span)); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java index c08f0bfb1..5a4a39f46 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java @@ -24,7 +24,6 @@ import org.springframework.cloud.netflix.zuul.filters.route.RestClientRibbonComm import org.springframework.cloud.netflix.zuul.filters.route.RestClientRibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandContext; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.event.ClientSentEvent; import org.springframework.context.ApplicationEvent; @@ -91,15 +90,15 @@ public class TraceRestClientRibbonCommandFactory extends RestClientRibbonCommand protected void customizeRequest(HttpRequest.Builder requestBuilder) { Span span = getCurrentSpan(); if (span == null) { - setHeader(requestBuilder, Trace.NOT_SAMPLED_NAME, ""); + setHeader(requestBuilder, Span.NOT_SAMPLED_NAME, ""); return; } - setHeader(requestBuilder, Trace.TRACE_ID_NAME, span.getTraceId()); - setHeader(requestBuilder, Trace.SPAN_ID_NAME, span.getSpanId()); - setHeader(requestBuilder, Trace.SPAN_NAME_NAME, span.getName()); - setHeader(requestBuilder, Trace.PARENT_ID_NAME, + setHeader(requestBuilder, Span.TRACE_ID_NAME, span.getTraceId()); + setHeader(requestBuilder, Span.SPAN_ID_NAME, span.getSpanId()); + setHeader(requestBuilder, Span.SPAN_NAME_NAME, span.getName()); + setHeader(requestBuilder, Span.PARENT_ID_NAME, getParentId(span)); - setHeader(requestBuilder, Trace.PROCESS_ID_NAME, + setHeader(requestBuilder, Span.PROCESS_ID_NAME, span.getProcessId()); publish(new ClientSentEvent(this, span)); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java index 3cc9b4dbe..8b38512f4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java @@ -18,7 +18,6 @@ package org.springframework.cloud.sleuth.log; import org.slf4j.MDC; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.event.SpanAcquiredEvent; import org.springframework.cloud.sleuth.event.SpanContinuedEvent; import org.springframework.cloud.sleuth.event.SpanReleasedEvent; @@ -38,9 +37,9 @@ public class Slf4jSpanListener { @Order(Ordered.LOWEST_PRECEDENCE) public void start(SpanAcquiredEvent event) { Span span = event.getSpan(); - MDC.put(Trace.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); - MDC.put(Trace.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); - MDC.put(Trace.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); + MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); + MDC.put(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); log.trace("Starting span: {}", span); if (event.getParent() != null) { log.trace("With parent: {}", event.getParent()); @@ -51,9 +50,9 @@ public class Slf4jSpanListener { @Order(Ordered.LOWEST_PRECEDENCE) public void continued(SpanContinuedEvent event) { Span span = event.getSpan(); - MDC.put(Trace.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); - MDC.put(Trace.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); - MDC.put(Trace.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); + MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); + MDC.put(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); log.trace("Continued span: {}", event.getSpan()); } @@ -63,13 +62,13 @@ public class Slf4jSpanListener { log.trace("Stopped span: {}", event.getSpan()); if (event.getParent() != null) { log.trace("With parent: {}", event.getParent()); - MDC.put(Trace.SPAN_ID_NAME, Span.IdConverter.toHex(event.getParent().getSpanId())); - MDC.put(Trace.SPAN_EXPORT_NAME, String.valueOf(event.getParent().isExportable())); + MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(event.getParent().getSpanId())); + MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(event.getParent().isExportable())); } else { - MDC.remove(Trace.SPAN_ID_NAME); - MDC.remove(Trace.SPAN_EXPORT_NAME); - MDC.remove(Trace.TRACE_ID_NAME); + MDC.remove(Span.SPAN_ID_NAME); + MDC.remove(Span.SPAN_EXPORT_NAME); + MDC.remove(Span.TRACE_ID_NAME); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java index ac0cecbca..a28c937a6 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java @@ -17,7 +17,7 @@ package org.springframework.cloud.sleuth.sampler; import org.springframework.cloud.sleuth.Sampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; /** * @author Spencer Gibb @@ -28,6 +28,6 @@ public class IsTracingSampler implements Sampler { @Override public boolean next() { - return TraceContextHolder.isTracing(); + return SpanContextHolder.isTracing(); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java index e097577d8..4dca2f73f 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java @@ -16,8 +16,8 @@ package org.springframework.cloud.sleuth.template; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; public interface TraceCallback { - T doInTrace(Trace trace); + T doInTrace(Span trace); } \ No newline at end of file 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 3bd0c4681..7cd0de715 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 @@ -24,7 +24,6 @@ import java.util.concurrent.Callable; import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.SpanAcquiredEvent; import org.springframework.cloud.sleuth.event.SpanContinuedEvent; @@ -53,7 +52,7 @@ public class DefaultTracer implements Tracer { } @Override - public Trace joinTrace(String name, Span parent) { + public Span joinTrace(String name, Span parent) { if (parent == null) { return startTrace(name); } @@ -67,12 +66,12 @@ public class DefaultTracer implements Tracer { } @Override - public Trace startTrace(String name) { + public Span startTrace(String name) { return this.startTrace(name, this.defaultSampler); } @Override - public Trace startTrace(String name, Sampler s) { + public Span startTrace(String name, Sampler s) { Span span = null; if (isTracing() || s.next()) { span = createChild(getCurrentSpan(), name); @@ -88,12 +87,11 @@ public class DefaultTracer implements Tracer { } @Override - public Trace detach(Trace trace) { - if (trace == null) { + public Span detach(Span span) { + if (span == null) { return null; } - Span cur = TraceContextHolder.getCurrentSpan(); - Span span = trace.getSpan(); + Span cur = SpanContextHolder.getCurrentSpan(); if (cur != span) { ExceptionUtils.warn("Tried to detach trace span but " + "it is not the current span for the '" @@ -101,24 +99,23 @@ public class DefaultTracer implements Tracer { + ". You have " + "probably forgotten to close or detach " + cur); } else { - if (trace.getSaved() != null) { - TraceContextHolder.setCurrentTrace(trace.getSaved()); + if (span.hasSavedSpan()) { + SpanContextHolder.setCurrentSpan(span.getSavedSpan()); } else { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } } - return trace.getSaved(); + return span.getSavedSpan(); } @Override - public Trace close(Trace trace) { - if (trace == null) { + public Span close(Span span) { + if (span == null) { return null; } - Span cur = TraceContextHolder.getCurrentSpan(); - Span span = trace.getSpan(); - Trace savedTrace = trace.getSaved(); + Span cur = SpanContextHolder.getCurrentSpan(); + Span savedSpan = span.getSavedSpan(); if (cur != span) { ExceptionUtils.warn("Tried to close trace span but " + "it is not the current span for the '" @@ -128,24 +125,24 @@ public class DefaultTracer implements Tracer { else { if (span != null) { span.stop(); - if (savedTrace != null - && span.getParents().contains(savedTrace.getSpan().getSpanId())) { + if (savedSpan != null + && span.getParents().contains(savedSpan.getSpanId())) { this.publisher.publishEvent( - new SpanReleasedEvent(this, savedTrace.getSpan(), span)); - TraceContextHolder.setCurrentTrace(savedTrace); + new SpanReleasedEvent(this, savedSpan, span)); + SpanContextHolder.setCurrentSpan(savedSpan); } else { if (!span.isRemote()) { this.publisher.publishEvent(new SpanReleasedEvent(this, span)); } - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } } else { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } } - return savedTrace; + return savedSpan; } protected Span createChild(Span parent, String name) { @@ -157,9 +154,9 @@ public class DefaultTracer implements Tracer { return span; } else { - if (TraceContextHolder.getCurrentTrace() == null) { - Trace trace = createTrace(null, parent); - TraceContextHolder.setCurrentTrace(trace); + if (SpanContextHolder.getCurrentSpan() == null) { + Span span = createSpan(null, parent); + SpanContextHolder.setCurrentSpan(span); } MilliSpan span = MilliSpan.builder().begin(System.currentTimeMillis()) .name(name).traceId(parent.getTraceId()).parent(parent.getSpanId()) @@ -174,27 +171,27 @@ public class DefaultTracer implements Tracer { } @Override - public Trace continueSpan(Span span) { + public Span continueSpan(Span span) { if (span != null) { this.publisher.publishEvent(new SpanContinuedEvent(this, span)); } - Trace trace = createTrace(TraceContextHolder.getCurrentTrace(), span); - TraceContextHolder.setCurrentTrace(trace); - return trace; + Span newSpan = createSpan(SpanContextHolder.getCurrentSpan(), span); + SpanContextHolder.setCurrentSpan(newSpan); + return newSpan; } - protected Trace createTrace(Trace trace, Span span) { - return new Trace(trace, span); + protected Span createSpan(Span saved, Span span) { + return new MilliSpan(span, saved); } @Override public Span getCurrentSpan() { - return TraceContextHolder.getCurrentSpan(); + return SpanContextHolder.getCurrentSpan(); } @Override public boolean isTracing() { - return TraceContextHolder.isTracing(); + return SpanContextHolder.isTracing(); } @Override diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/TraceContextHolder.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/SpanContextHolder.java similarity index 63% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/TraceContextHolder.java rename to spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/SpanContextHolder.java index e1ab25ec3..3a6d0b14b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/TraceContextHolder.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/SpanContextHolder.java @@ -16,45 +16,39 @@ package org.springframework.cloud.sleuth.trace; -import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; -import org.springframework.core.NamedThreadLocal; - import lombok.extern.apachecommons.CommonsLog; +import org.springframework.cloud.sleuth.Span; +import org.springframework.core.NamedThreadLocal; /** * @author Spencer Gibb */ @CommonsLog -public class TraceContextHolder { +public class SpanContextHolder { - private static final ThreadLocal currentTrace = new NamedThreadLocal<>("Trace Context"); - - public static Trace getCurrentTrace() { - return currentTrace.get(); - } + private static final ThreadLocal CURRENT_SPAN = new NamedThreadLocal<>("Trace Context"); public static Span getCurrentSpan() { - return isTracing() ? currentTrace.get().getSpan() : null; + return isTracing() ? CURRENT_SPAN.get() : null; } - public static void setCurrentTrace(Trace trace) { + public static void setCurrentSpan(Span span) { // backwards compatibility - if (trace == null) { - currentTrace.remove(); + if (span == null) { + CURRENT_SPAN.remove(); return; } if (log.isTraceEnabled()) { - log.trace("Setting current trace " + trace); + log.trace("Setting current span " + span); } - currentTrace.set(trace); + CURRENT_SPAN.set(span); } - public static void removeCurrentTrace() { - currentTrace.remove(); + public static void removeCurrentSpan() { + CURRENT_SPAN.remove(); } public static boolean isTracing() { - return currentTrace.get() != null; + return CURRENT_SPAN.get() != null; } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java index dac21a1a8..f3f4d537a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java @@ -25,7 +25,7 @@ import org.springframework.cloud.sleuth.event.SpanReleasedEvent; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.sampler.IsTracingSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; @@ -53,12 +53,12 @@ public class DefaultTraceManagerTests { @Before public void setup() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @After public void clean() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test @@ -67,7 +67,7 @@ public class DefaultTraceManagerTests { DefaultTracer traceManager = new DefaultTracer(new IsTracingSampler(), new Random(), publisher); - Trace trace = traceManager.startTrace(CREATE_SIMPLE_TRACE, new AlwaysSampler()); + Span trace = traceManager.startTrace(CREATE_SIMPLE_TRACE, new AlwaysSampler()); try { importantWork1(traceManager); } @@ -122,7 +122,7 @@ public class DefaultTraceManagerTests { } private void importantWork1(Tracer tracer) { - Trace cur = tracer.startTrace(IMPORTANT_WORK_1); + Span cur = tracer.startTrace(IMPORTANT_WORK_1); try { Thread.sleep((long) (50 * Math.random())); importantWork2(tracer); @@ -136,7 +136,7 @@ public class DefaultTraceManagerTests { } private void importantWork2(Tracer tracer) { - Trace cur = tracer.startTrace(IMPORTANT_WORK_2); + Span cur = tracer.startTrace(IMPORTANT_WORK_2); try { Thread.sleep((long) (50 * Math.random())); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java index 69db7c008..5966d88cc 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java @@ -5,11 +5,11 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEventPublisher; import java.util.Random; @@ -28,21 +28,21 @@ public class TraceCallableTests { @After public void clean() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test public void should_not_see_same_trace_id_in_successive_tasks() throws Exception { - Trace firstTrace = givenCallableGetsSubmitted( + Span firstTrace = givenCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - Trace secondTrace = whenCallableGetsSubmitted( + Span secondTrace = whenCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - then(secondTrace.getSpan().getTraceId()) - .isNotEqualTo(firstTrace.getSpan().getTraceId()); - then(secondTrace.getSaved()).isNull(); + then(secondTrace.getTraceId()) + .isNotEqualTo(firstTrace.getTraceId()); + then(secondTrace.getSavedSpan()).isNull(); } @Test @@ -50,7 +50,7 @@ public class TraceCallableTests { throws Exception { givenCallableGetsSubmitted(thatRetrievesTraceFromThreadLocal()); - Trace secondTrace = whenNonTraceableCallableGetsSubmitted( + Span secondTrace = whenNonTraceableCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); then(secondTrace).isNull(); @@ -59,42 +59,42 @@ public class TraceCallableTests { @Test public void should_remove_parent_span_from_thread_local_after_finishing_work() throws Exception { - Trace parent = givenSpanIsAlreadyActive(); - Trace child = givenCallableGetsSubmitted(thatRetrievesTraceFromThreadLocal()); + Span parent = givenSpanIsAlreadyActive(); + Span child = givenCallableGetsSubmitted(thatRetrievesTraceFromThreadLocal()); then(parent).as("parent").isNotNull(); - then(child.getSaved()).isEqualTo(parent); + then(child.getSavedSpan()).isEqualTo(parent); - Trace secondTrace = whenNonTraceableCallableGetsSubmitted( + Span secondTrace = whenNonTraceableCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); then(secondTrace).isNull(); } - private Trace givenSpanIsAlreadyActive() { + private Span givenSpanIsAlreadyActive() { return this.tracer.startTrace("parent"); } - private Callable thatRetrievesTraceFromThreadLocal() { - return new Callable() { + private Callable thatRetrievesTraceFromThreadLocal() { + return new Callable() { @Override - public Trace call() throws Exception { - return TraceContextHolder.getCurrentTrace(); + public Span call() throws Exception { + return SpanContextHolder.getCurrentSpan(); } }; } - private Trace givenCallableGetsSubmitted(Callable callable) + private Span givenCallableGetsSubmitted(Callable callable) throws InterruptedException, java.util.concurrent.ExecutionException { return whenCallableGetsSubmitted(callable); } - private Trace whenCallableGetsSubmitted(Callable callable) + private Span whenCallableGetsSubmitted(Callable callable) throws InterruptedException, java.util.concurrent.ExecutionException { return this.executor.submit(new TraceCallable<>(this.tracer, callable)) .get(); } - private Trace whenNonTraceableCallableGetsSubmitted(Callable callable) + private Span whenNonTraceableCallableGetsSubmitted(Callable callable) throws InterruptedException, java.util.concurrent.ExecutionException { return this.executor.submit(callable).get(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SpanPassingForHystrixViaAnnotationsIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SpanPassingForHystrixViaAnnotationsIntegrationTests.java index 90639b814..b64ec3bb6 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SpanPassingForHystrixViaAnnotationsIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SpanPassingForHystrixViaAnnotationsIntegrationTests.java @@ -11,7 +11,7 @@ import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.DefaultTestAutoConfiguration; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -39,7 +39,7 @@ public class SpanPassingForHystrixViaAnnotationsIntegrationTests { } private Span givenASpanInCurrentThread() { - Span span = tracer.startTrace("existing").getSpan(); + Span span = tracer.startTrace("existing"); tracer.continueSpan(span); return span; } @@ -61,7 +61,7 @@ public class SpanPassingForHystrixViaAnnotationsIntegrationTests { @After public void cleanTrace() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @DefaultTestAutoConfiguration @@ -81,7 +81,7 @@ public class SpanPassingForHystrixViaAnnotationsIntegrationTests { @HystrixCommand public void invokeLogicWrappedInHystrixCommand() { - spanCaughtFromHystrixThread = new AtomicReference<>(TraceContextHolder.getCurrentSpan()); + spanCaughtFromHystrixThread = new AtomicReference<>(SpanContextHolder.getCurrentSpan()); } public Long getTraceId() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java index 95972166e..6b3f4b6a3 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java @@ -7,11 +7,11 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.cloud.sleuth.MilliSpan; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEventPublisher; import java.util.Random; @@ -28,64 +28,64 @@ public class TraceCommandTests { @Before public void setup() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @After public void cleanup() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test public void should_remove_span_from_thread_local_after_finishing_work() throws Exception { - TraceContextHolder.removeCurrentTrace(); - Trace firstTraceFromHystrix = givenACommandWasExecuted(traceReturningCommand()); + SpanContextHolder.removeCurrentSpan(); + Span firstTraceFromHystrix = givenACommandWasExecuted(traceReturningCommand()); - Trace secondTraceFromHystrix = whenCommandIsExecuted(traceReturningCommand()); + Span secondTraceFromHystrix = whenCommandIsExecuted(traceReturningCommand()); - then(secondTraceFromHystrix.getSpan().getTraceId()).as("second trace id") - .isNotEqualTo(firstTraceFromHystrix.getSpan().getTraceId()).as("first trace id"); - then(secondTraceFromHystrix.getSaved()).as("saved trace as remnant of first trace") + then(secondTraceFromHystrix.getTraceId()).as("second trace id") + .isNotEqualTo(firstTraceFromHystrix.getTraceId()).as("first trace id"); + then(secondTraceFromHystrix.getSavedSpan()).as("saved trace as remnant of first trace") .isNull(); } @Test public void should_run_Hystrix_command_with_span_passed_from_parent_thread() { givenATraceIsPresentInTheCurrentThread(); - TraceCommand command = traceReturningCommand(); + TraceCommand command = traceReturningCommand(); - Trace traceFromCommand = whenCommandIsExecuted(command); + Span traceFromCommand = whenCommandIsExecuted(command); - then(traceFromCommand).as("Trace from the Hystrix Thread").isNotNull(); - then(traceFromCommand.getSpan().getTraceId()).isEqualTo(EXPECTED_TRACE_ID); + then(traceFromCommand).as("Span from the Hystrix Thread").isNotNull(); + then(traceFromCommand.getTraceId()).isEqualTo(EXPECTED_TRACE_ID); } @After public void cleanUpTrace() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } - private Trace givenATraceIsPresentInTheCurrentThread() { + private Span givenATraceIsPresentInTheCurrentThread() { return this.tracer.joinTrace("test", MilliSpan.builder().traceId(EXPECTED_TRACE_ID).build()); } - private TraceCommand traceReturningCommand() { - return new TraceCommand(this.tracer, withGroupKey(asKey("")) + private TraceCommand traceReturningCommand() { + return new TraceCommand(this.tracer, withGroupKey(asKey("")) .andCommandKey(HystrixCommandKey.Factory.asKey("")).andThreadPoolPropertiesDefaults( HystrixThreadPoolProperties.Setter().withMaxQueueSize(1).withCoreSize(1))) { @Override - public Trace doRun() throws Exception { - return TraceContextHolder.getCurrentTrace(); + public Span doRun() throws Exception { + return SpanContextHolder.getCurrentSpan(); } }; } - private Trace whenCommandIsExecuted(TraceCommand command) { + private Span whenCommandIsExecuted(TraceCommand command) { return command.execute(); } - private Trace givenACommandWasExecuted(TraceCommand command) { + private Span givenACommandWasExecuted(TraceCommand command) { return whenCommandIsExecuted(command); } } \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java index 8abd6e3be..4b078f428 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java @@ -26,12 +26,11 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.SpanReleasedEvent; import org.springframework.cloud.sleuth.instrument.integration.TraceChannelInterceptorTests.App; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; @@ -79,7 +78,7 @@ public class TraceChannelInterceptorTests implements MessageHandler { @Override public void handleMessage(Message message) throws MessagingException { this.message = message; - this.span = TraceContextHolder.getCurrentSpan(); + this.span = SpanContextHolder.getCurrentSpan(); } @Before @@ -89,35 +88,35 @@ public class TraceChannelInterceptorTests implements MessageHandler { @After public void close() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); this.channel.unsubscribe(this); } @Test public void nonExportableSpanCreation() { - this.channel.send(MessageBuilder.withPayload("hi").setHeader(Trace.NOT_SAMPLED_NAME, "") + this.channel.send(MessageBuilder.withPayload("hi").setHeader(Span.NOT_SAMPLED_NAME, "") .build()); assertNotNull("message was null", this.message); - String spanId = this.message.getHeaders().get(Trace.SPAN_ID_NAME, String.class); + String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); assertFalse(this.span.isExportable()); } @Test public void parentSpanIncluded() { - this.channel.send(MessageBuilder.withPayload("hi").setHeader(Trace.TRACE_ID_NAME, 10L) - .setHeader(Trace.SPAN_ID_NAME, 20L) + this.channel.send(MessageBuilder.withPayload("hi").setHeader(Span.TRACE_ID_NAME, 10L) + .setHeader(Span.SPAN_ID_NAME, 20L) .build()); assertNotNull("message was null", this.message); - String spanId = this.message.getHeaders().get(Trace.SPAN_ID_NAME, String.class); + String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - long traceId = Span.IdConverter.fromHex(this.message.getHeaders().get(Trace.TRACE_ID_NAME, String.class)); + long traceId = Span.IdConverter.fromHex(this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); then(traceId).isEqualTo(10L); then(spanId).isNotEqualTo(20L); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); assertEquals(1, this.app.events.size()); } @@ -126,45 +125,45 @@ public class TraceChannelInterceptorTests implements MessageHandler { this.channel.send(MessageBuilder.withPayload("hi").build()); assertNotNull("message was null", this.message); - String spanId = this.message.getHeaders().get(Trace.SPAN_ID_NAME, String.class); + String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - String traceId = this.message.getHeaders().get(Trace.TRACE_ID_NAME, String.class); + String traceId = this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class); assertNotNull("traceId was null", traceId); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void headerCreation() { - Trace trace = this.tracer.startTrace("testSendMessage", + Span trace = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.channel.send(MessageBuilder.withPayload("hi").build()); this.tracer.close(trace); assertNotNull("message was null", this.message); - String spanId = this.message.getHeaders().get(Trace.SPAN_ID_NAME, String.class); + String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - String traceId = this.message.getHeaders().get(Trace.TRACE_ID_NAME, String.class); + String traceId = this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class); assertNotNull("traceId was null", traceId); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } // TODO: Refactor to parametrized test together with sending messages via channel @Test public void headerCreationViaMessagingTemplate() { - Trace trace = this.tracer.startTrace("testSendMessage", + Span trace = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.messagingTemplate.send(MessageBuilder.withPayload("hi").build()); this.tracer.close(trace); assertNotNull("message was null", this.message); - String spanId = this.message.getHeaders().get(Trace.SPAN_ID_NAME, String.class); + String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - String traceId = this.message.getHeaders().get(Trace.TRACE_ID_NAME, String.class); + String traceId = this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class); assertNotNull("traceId was null", traceId); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Configuration diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java index ec1116391..631a1a621 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java @@ -25,11 +25,10 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.integration.TraceContextPropagationChannelInterceptorTests.App; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.channel.QueueChannel; @@ -60,25 +59,25 @@ public class TraceContextPropagationChannelInterceptorTests { @After public void close() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test public void testSpanPropagation() { - Trace trace = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); + Span trace = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.channel.send(MessageBuilder.withPayload("hi").build()); - Long expectedSpanId = trace.getSpan().getSpanId(); + Long expectedSpanId = trace.getSpanId(); this.tracer.close(trace); Message message = this.channel.receive(0); assertNotNull("message was null", message); - Long spanId = Span.IdConverter.fromHex(message.getHeaders().get(Trace.SPAN_ID_NAME, String.class)); + Long spanId = Span.IdConverter.fromHex(message.getHeaders().get(Span.SPAN_ID_NAME, String.class)); assertEquals("spanId was wrong", expectedSpanId, spanId); - long traceId = Span.IdConverter.fromHex(message.getHeaders().get(Trace.TRACE_ID_NAME, String.class)); + long traceId = Span.IdConverter.fromHex(message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); assertNotNull("traceId was null", traceId); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java index f5913c554..1383347b9 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java @@ -6,10 +6,10 @@ import org.junit.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.instrument.integration.TraceStompMessageChannelInterceptorTests.TestApplication; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.Message; @@ -44,12 +44,12 @@ public class TraceStompMessageChannelInterceptorTests extends AbstractTraceStomp thenSpanIdFromHeadersIsNotEmpty(); thenTraceIdFromHeadersIsNotEmpty(); - then(TraceContextHolder.getCurrentTrace()).isNull(); + then(SpanContextHolder.getCurrentSpan()).isNull(); } @Test public void should_propagate_headers_when_message_was_sent_during_local_span_starting() { - Trace trace = givenALocallyStartedSpan(); + Span trace = givenALocallyStartedSpan(); Message message = givenMessageToBeSampled(); whenTheMessageWasSent(message); @@ -57,17 +57,17 @@ public class TraceStompMessageChannelInterceptorTests extends AbstractTraceStomp Long spanId = thenSpanIdFromHeadersIsNotEmpty(); long traceId = thenTraceIdFromHeadersIsNotEmpty(); - then(traceId).isEqualTo(trace.getSpan().getTraceId()); - then(spanId).isEqualTo(trace.getSpan().getSpanId()); - then(TraceContextHolder.getCurrentTrace()).isNull(); + then(traceId).isEqualTo(trace.getTraceId()); + then(spanId).isEqualTo(trace.getSpanId()); + then(SpanContextHolder.getCurrentSpan()).isNull(); } private Message givenMessageNotToBeSampled() { - return StompMessageBuilder.fromMessage(new GenericMessage<>("Message2")).setHeader(Trace.NOT_SAMPLED_NAME, "").build(); + return StompMessageBuilder.fromMessage(new GenericMessage<>("Message2")).setHeader(Span.NOT_SAMPLED_NAME, "").build(); } private String thenSpanIdFromHeadersIsEmpty() { - String header = getValueFromHeaders(Trace.SPAN_ID_NAME, String.class); + String header = getValueFromHeaders(Span.SPAN_ID_NAME, String.class); then(header).as("Span id should be empty").isNullOrEmpty(); return header; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java index 1d771dafb..01e7f395f 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java @@ -7,7 +7,7 @@ import org.junit.runner.RunWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.instrument.integration.TraceStompMessageContextPropagationChannelInterceptorTests.TestApplication; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.context.annotation.Bean; @@ -28,11 +28,11 @@ public class TraceStompMessageContextPropagationChannelInterceptorTests extends @Test public void should_propagate_span_information() { - Trace trace = givenALocallyStartedSpan(); + Span trace = givenALocallyStartedSpan(); Message m = givenMessageToBeSampled(); whenTheMessageWasSent(m); - Long expectedTraceId = trace.getSpan().getTraceId(); + Long expectedTraceId = trace.getTraceId(); this.tracer.close(trace); thenReceivedMessageIsNotNull(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java index f9838eff5..c89cae849 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TracingOnScheduledTests.java @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.instrument.DefaultTestAutoConfiguration; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; @@ -70,7 +70,7 @@ class TestBeanWithScheduledMethod { @Scheduled(fixedDelay = 1L) public void scheduledMethod() { - this.span = TraceContextHolder.getCurrentSpan(); + this.span = SpanContextHolder.getCurrentSpan(); } public Span getSpan() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/RestTemplateTraceAspectIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/RestTemplateTraceAspectIntegrationTests.java index 40198c4be..230fad6b2 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/RestTemplateTraceAspectIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/RestTemplateTraceAspectIntegrationTests.java @@ -9,7 +9,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.instrument.DefaultTestAutoConfiguration; import org.springframework.cloud.sleuth.instrument.web.common.HttpMockServer; import org.springframework.cloud.sleuth.instrument.web.common.AbstractMvcWiremockIntegrationTest; @@ -71,7 +71,7 @@ public class RestTemplateTraceAspectIntegrationTests extends AbstractMvcWiremock } private void thenTraceIdHasBeenSetOnARequestHeader() { - this.wireMock.verifyThat(getRequestedFor(urlMatching(".*")).withHeader(Trace.TRACE_ID_NAME, matching("^(?!\\s*$).+"))); + this.wireMock.verifyThat(getRequestedFor(urlMatching(".*")).withHeader(Span.TRACE_ID_NAME, matching("^(?!\\s*$).+"))); } private void whenARequestIsSentToAnAsyncEndpoint(String url) throws Exception { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceAsyncIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceAsyncIntegrationTests.java index 8109731b7..584b431f4 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceAsyncIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceAsyncIntegrationTests.java @@ -10,7 +10,7 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.DefaultTestAutoConfiguration; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Async; @@ -40,7 +40,7 @@ public class TraceAsyncIntegrationTests { } private Span givenASpanInCurrentThread() { - Span span = tracer.startTrace("existing").getSpan(); + Span span = tracer.startTrace("existing"); tracer.continueSpan(span); return span; } @@ -62,7 +62,7 @@ public class TraceAsyncIntegrationTests { @After public void cleanTrace() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @DefaultTestAutoConfiguration @@ -83,7 +83,7 @@ public class TraceAsyncIntegrationTests { @Async public void invokeAsynchronousLogic() { - span.set(TraceContextHolder.getCurrentSpan()); + span.set(SpanContextHolder.getCurrentSpan()); } public Long getTraceId() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java index ec72a1a5d..0069c4843 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java @@ -9,7 +9,6 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.DefaultTestAutoConfiguration; import org.springframework.cloud.sleuth.instrument.TraceKeys; @@ -60,7 +59,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { private MvcResult whenSentPingWithTraceId(Long passedTraceId) throws Exception { - return sendPingWithTraceId(Trace.TRACE_ID_NAME, passedTraceId); + return sendPingWithTraceId(Span.TRACE_ID_NAME, passedTraceId); } private MvcResult sendPingWithTraceId(String headerName, Long passedCorrelationId) @@ -68,11 +67,11 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { return this.mockMvc .perform(MockMvcRequestBuilders.get("/ping").accept(MediaType.TEXT_PLAIN) .header(headerName, Span.IdConverter.toHex(passedCorrelationId)) - .header(Trace.SPAN_ID_NAME, Span.IdConverter.toHex(new Random().nextLong()))) + .header(Span.SPAN_ID_NAME, Span.IdConverter.toHex(new Random().nextLong()))) .andReturn(); } private Long tracingHeaderFrom(MvcResult mvcResult) { - return Span.IdConverter.fromHex(mvcResult.getResponse().getHeader(Trace.TRACE_ID_NAME)); + return Span.IdConverter.fromHex(mvcResult.getResponse().getHeader(Span.TRACE_ID_NAME)); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterMockChainIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterMockChainIntegrationTests.java index e87d44998..6c8cd4522 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterMockChainIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterMockChainIntegrationTests.java @@ -16,19 +16,15 @@ package org.springframework.cloud.sleuth.instrument.web; -import static org.junit.Assert.assertNull; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; - -import java.util.Random; - +import lombok.SneakyThrows; import org.junit.Before; import org.junit.Test; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.support.StaticApplicationContext; import org.springframework.http.MediaType; import org.springframework.mock.web.MockFilterChain; @@ -37,7 +33,10 @@ import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import lombok.SneakyThrows; +import java.util.Random; + +import static org.junit.Assert.assertNull; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; /** * @author Spencer Gibb @@ -58,7 +57,7 @@ public class TraceFilterMockChainIntegrationTests { @Before @SneakyThrows public void init() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); this.context.refresh(); this.request = builder().buildRequest(new MockServletContext()); this.response = new MockHttpServletResponse(); @@ -75,17 +74,17 @@ public class TraceFilterMockChainIntegrationTests { public void startsNewTrace() throws Exception { TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); filter.doFilter(this.request, this.response, this.filterChain); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void continuesSpanFromHeaders() throws Exception { Random generator = new Random(); - this.request = builder().header(Trace.SPAN_ID_NAME, generator.nextLong()) - .header(Trace.TRACE_ID_NAME, generator.nextLong()).buildRequest(new MockServletContext()); + this.request = builder().header(Span.SPAN_ID_NAME, generator.nextLong()) + .header(Span.TRACE_ID_NAME, generator.nextLong()).buildRequest(new MockServletContext()); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); filter.doFilter(this.request, this.response, this.filterChain); - assertNull(TraceContextHolder.getCurrentSpan()); + assertNull(SpanContextHolder.getCurrentSpan()); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index f4fe03c83..6a8028254 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -16,28 +16,18 @@ package org.springframework.cloud.sleuth.instrument.web; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.entry; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.mockito.MockitoAnnotations.initMocks; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; - -import java.util.Random; - +import lombok.SneakyThrows; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.sampler.IsTracingSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEventPublisher; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -47,7 +37,15 @@ import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import lombok.SneakyThrows; +import java.util.Random; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.mockito.MockitoAnnotations.initMocks; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; /** * @author Spencer Gibb @@ -74,9 +72,9 @@ public class TraceFilterTests { this.tracer = new DefaultTracer(new DelegateSampler(), new Random(), this.publisher) { @Override - protected Trace createTrace(Trace trace, Span span) { - TraceFilterTests.this.span = span; - return super.createTrace(trace, span); + protected Span createSpan(Span trace, Span span) { + TraceFilterTests.this.span = super.createSpan(trace, span); + return TraceFilterTests.this.span; } }; this.request = builder().buildRequest(new MockServletContext()); @@ -101,7 +99,7 @@ public class TraceFilterTests { filter.doFilter(this.request, this.response, this.filterChain); assertFalse(this.span.isExportable()); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test @@ -109,13 +107,13 @@ public class TraceFilterTests { TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); filter.doFilter(this.request, this.response, this.filterChain); verifyHttpTags(); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void continuesSpanInRequestAttr() throws Exception { - Trace trace = this.tracer.startTrace("foo"); + Span trace = this.tracer.startTrace("foo"); this.request.setAttribute(TraceFilter.TRACE_REQUEST_ATTR, trace); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); @@ -123,26 +121,26 @@ public class TraceFilterTests { verifyHttpTags(); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void continuesSpanFromHeaders() throws Exception { - this.request = builder().header(Trace.SPAN_ID_NAME, 10L) - .header(Trace.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); + this.request = builder().header(Span.SPAN_ID_NAME, 10L) + .header(Span.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); filter.doFilter(this.request, this.response, this.filterChain); verifyHttpTags(); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void addsAdditionalHeaders() throws Exception { - this.request = builder().header(Trace.SPAN_ID_NAME, 10L) - .header(Trace.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); + this.request = builder().header(Span.SPAN_ID_NAME, 10L) + .header(Span.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); this.traceKeys.getHttp().getHeaders().add("x-foo"); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); @@ -151,13 +149,13 @@ public class TraceFilterTests { assertThat(this.span.tags()).contains(entry("http/x-foo", "bar")); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test public void additionalMultiValuedHeader() throws Exception { - this.request = builder().header(Trace.SPAN_ID_NAME, 10L) - .header(Trace.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); + this.request = builder().header(Span.SPAN_ID_NAME, 10L) + .header(Span.TRACE_ID_NAME, 20L).buildRequest(new MockServletContext()); this.traceKeys.getHttp().getHeaders().add("x-foo"); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); @@ -167,7 +165,7 @@ public class TraceFilterTests { assertThat(this.span.tags()).contains(entry("http/x-foo", "'bar','spam'")); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } @Test @@ -189,7 +187,7 @@ public class TraceFilterTests { } verifyHttpTags(HttpStatus.INTERNAL_SERVER_ERROR); - assertNull(TraceContextHolder.getCurrentTrace()); + assertNull(SpanContextHolder.getCurrentSpan()); } public void verifyHttpTags() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java index 9e083b44a..58687696b 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java @@ -1,19 +1,19 @@ package org.springframework.cloud.sleuth.template; -import static org.assertj.core.api.BDDAssertions.then; - -import java.util.Random; - import org.junit.After; import org.junit.Test; import org.mockito.Mockito; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEventPublisher; +import java.util.Random; + +import static org.assertj.core.api.BDDAssertions.then; + public class TraceTemplateTests { Tracer tracer = new DefaultTracer(new AlwaysSampler(), @@ -21,25 +21,25 @@ public class TraceTemplateTests { @After public void close() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test public void should_pass_trace_to_the_callback_if_tracing_is_active() { - Trace initialTrace = this.tracer.startTrace("test"); + Span initialTrace = this.tracer.startTrace("test"); TraceTemplate traceTemplate = new TraceTemplate(this.tracer); - Trace traceFromCallback = whenTraceCallbackReturningCurrentTraceIsExecuted(traceTemplate); + Span traceFromCallback = whenTraceCallbackReturningCurrentTraceIsExecuted(traceTemplate); then(traceFromCallback).isNotNull(); - then(traceFromCallback.getSpan().getTraceId()).isEqualTo(initialTrace.getSpan().getTraceId()); + then(traceFromCallback.getTraceId()).isEqualTo(initialTrace.getTraceId()); } - private Trace whenTraceCallbackReturningCurrentTraceIsExecuted(TraceTemplate traceTemplate) { - return traceTemplate.trace(new TraceCallback() { + private Span whenTraceCallbackReturningCurrentTraceIsExecuted(TraceTemplate traceTemplate) { + return traceTemplate.trace(new TraceCallback() { @Override - public Trace doInTrace(Trace trace) { - return TraceContextHolder.getCurrentTrace(); + public Span doInTrace(Span trace) { + return SpanContextHolder.getCurrentSpan(); } }); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java index c5adc85a9..6e75dcf89 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; @@ -94,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Trace trace = this.tracer.startTrace("customTraceEndpoint", + Span trace = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java index 61ac8e400..024e3885e 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java @@ -17,7 +17,6 @@ package tools; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.http.*; import org.springframework.web.client.RestTemplate; @@ -53,7 +52,7 @@ public class RequestSendingRunnable implements Runnable { private RequestEntity requestWithTraceId(long traceId) { HttpHeaders headers = new HttpHeaders(); - headers.add(Trace.TRACE_ID_NAME, Span.IdConverter.toHex(traceId)); + headers.add(Span.TRACE_ID_NAME, Span.IdConverter.toHex(traceId)); URI uri = URI.create(url); RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, uri); log.info("Request [" + requestEntity + "] is ready"); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java index c5adc85a9..6e75dcf89 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; @@ -94,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Trace trace = this.tracer.startTrace("customTraceEndpoint", + Span trace = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java index c5adc85a9..6e75dcf89 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.TraceAccessor; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; @@ -94,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Trace trace = this.tracer.startTrace("customTraceEndpoint", + Span trace = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); diff --git a/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfiguration.java b/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfiguration.java index 2cbcf9fa9..9d3b9e3b3 100644 --- a/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfiguration.java +++ b/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfiguration.java @@ -25,7 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.config.ChannelBindingAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -61,7 +61,7 @@ public class SleuthStreamAutoConfiguration { @Override public Message preSend(Message message, MessageChannel channel) { return MessageBuilder.fromMessage(message) - .setHeader(Trace.NOT_SAMPLED_NAME, "").build(); + .setHeader(Span.NOT_SAMPLED_NAME, "").build(); } }; } diff --git a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java index df311ffb0..5f3522332 100644 --- a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java +++ b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java @@ -31,7 +31,6 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; import org.springframework.cloud.sleuth.event.ClientReceivedEvent; @@ -78,7 +77,7 @@ public class StreamSpanListenerTests { @Test public void acquireAndRelease() { - Trace context = this.tracer.startTrace("foo"); + Span context = this.tracer.startTrace("foo"); this.tracer.close(context); assertEquals(1, this.test.spans.size()); } @@ -87,21 +86,21 @@ public class StreamSpanListenerTests { public void rpcAnnotations() { Span parent = MilliSpan.builder().traceId(1L).name("parent").remote(true) .build(); - Trace context = this.tracer.joinTrace("child", parent); - this.application.publishEvent(new ClientSentEvent(this, context.getSpan())); + Span context = this.tracer.joinTrace("child", parent); + this.application.publishEvent(new ClientSentEvent(this, context)); this.application - .publishEvent(new ServerReceivedEvent(this, parent, context.getSpan())); + .publishEvent(new ServerReceivedEvent(this, parent, context)); this.application - .publishEvent(new ServerSentEvent(this, parent, context.getSpan())); - this.application.publishEvent(new ClientReceivedEvent(this, context.getSpan())); + .publishEvent(new ServerSentEvent(this, parent, context)); + this.application.publishEvent(new ClientReceivedEvent(this, context)); this.tracer.close(context); assertEquals(2, this.test.spans.size()); } @Test public void nullSpanName() { - Trace context = this.tracer.startTrace(null, (Sampler) null); - this.application.publishEvent(new ClientSentEvent(this, context.getSpan())); + Span context = this.tracer.startTrace(null, (Sampler) null); + this.application.publishEvent(new ClientSentEvent(this, context)); this.tracer.close(context); assertEquals(1, this.test.spans.size()); this.listener.poll(); diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java index 95a83a564..f604798c0 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java @@ -32,7 +32,6 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; import org.springframework.cloud.sleuth.event.ClientReceivedEvent; @@ -119,7 +118,7 @@ public class ZipkinSpanListenerTests { */ @Test public void spanWithoutAnnotationsLogsComponent() { - Trace context = this.tracer.startTrace("foo"); + Span context = this.tracer.startTrace("foo"); this.tracer.close(context); assertEquals(1, this.test.spans.size()); assertThat(this.test.spans.get(0).binaryAnnotations.get(0).endpoint.serviceName) @@ -128,11 +127,11 @@ public class ZipkinSpanListenerTests { @Test public void rpcAnnotations() { - Trace context = this.tracer.joinTrace("child", parent); - this.application.publishEvent(new ClientSentEvent(this, context.getSpan())); - this.application.publishEvent(new ServerReceivedEvent(this, parent, context.getSpan())); - this.application.publishEvent(new ServerSentEvent(this, parent, context.getSpan())); - this.application.publishEvent(new ClientReceivedEvent(this, context.getSpan())); + Span context = this.tracer.joinTrace("child", parent); + this.application.publishEvent(new ClientSentEvent(this, context)); + this.application.publishEvent(new ServerReceivedEvent(this, parent, context)); + this.application.publishEvent(new ServerSentEvent(this, parent, context)); + this.application.publishEvent(new ClientReceivedEvent(this, context)); this.tracer.close(context); assertEquals(2, this.test.spans.size()); } From b7580084198162450c07f53007e1560e27ed5bb5 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 19 Jan 2016 16:22:40 +0100 Subject: [PATCH 2/3] Added checkstyle :( --- build-tools/pom.xml | 12 ++ build-tools/src/main/resources/LICENSE.txt | 202 ++++++++++++++++++ build-tools/src/main/resources/checkstyle.xml | 18 ++ pom.xml | 43 ++++ 4 files changed, 275 insertions(+) create mode 100644 build-tools/pom.xml create mode 100644 build-tools/src/main/resources/LICENSE.txt create mode 100644 build-tools/src/main/resources/checkstyle.xml diff --git a/build-tools/pom.xml b/build-tools/pom.xml new file mode 100644 index 000000000..0a8c91e43 --- /dev/null +++ b/build-tools/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + org.springframework.cloud + build-tools + 1.0.0.BUILD-SNAPSHOT + build-tools + jar + Spring Cloud Sleuth Build Tools + diff --git a/build-tools/src/main/resources/LICENSE.txt b/build-tools/src/main/resources/LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/build-tools/src/main/resources/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/build-tools/src/main/resources/checkstyle.xml b/build-tools/src/main/resources/checkstyle.xml new file mode 100644 index 000000000..a61445068 --- /dev/null +++ b/build-tools/src/main/resources/checkstyle.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5f53c76d7..d0e0622a8 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ + build-tools spring-cloud-sleuth-dependencies spring-cloud-sleuth-core spring-cloud-sleuth-zipkin @@ -91,8 +92,49 @@ + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle.version} + + + org.springframework.cloud + build-tools + ${project.version} + + + + + verify-style + process-classes + + check + + + + + true + false + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${checkstyle.version} + + checkstyle.xml + LICENSE.txt + + + + + @@ -164,6 +206,7 @@ 1.8 1.8 2.19.1 + 2.17 From d5b523d0219fc53d9a76af3904baa74e941e0e08 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 19 Jan 2016 16:36:50 +0100 Subject: [PATCH 3/3] Converted MilliSpan to Span. Removed the interface --- .../cloud/sleuth/MilliSpan.java | 150 --------- .../springframework/cloud/sleuth/Sampler.java | 27 +- .../springframework/cloud/sleuth/Span.java | 313 ++++++++++++------ .../springframework/cloud/sleuth/Tracer.java | 30 +- .../autoconfig/TraceAutoConfiguration.java | 4 +- .../sleuth/instrument/TraceCallable.java | 4 +- .../sleuth/instrument/TraceDelegate.java | 12 +- .../sleuth/instrument/TraceRunnable.java | 4 +- .../instrument/hystrix/TraceCommand.java | 4 +- .../AbstractTraceChannelInterceptor.java | 24 +- .../integration/SpanMessageHeaders.java | 27 +- .../integration/StompMessageBuilder.java | 35 +- .../integration/TraceChannelInterceptor.java | 19 +- ...eContextPropagationChannelInterceptor.java | 2 +- .../TraceStompMessageChannelInterceptor.java | 21 +- ...eContextPropagationChannelInterceptor.java | 7 +- .../scheduling/TraceSchedulingAspect.java | 4 +- .../sleuth/instrument/web/TraceFilter.java | 74 ++--- .../TraceFeignClientAutoConfiguration.java | 6 +- .../client/TraceRestTemplateInterceptor.java | 2 +- .../instrument/zuul/TracePreZuulFilter.java | 2 +- .../TraceRestClientRibbonCommandFactory.java | 2 +- .../cloud/sleuth/log/Slf4jSpanListener.java | 13 +- .../cloud/sleuth/sampler/AlwaysSampler.java | 2 +- .../sleuth/sampler/IsTracingSampler.java | 2 +- .../sampler/PercentageBasedSampler.java | 2 +- .../cloud/sleuth/template/TraceCallback.java | 2 +- .../cloud/sleuth/template/TraceTemplate.java | 10 +- .../cloud/sleuth/trace/DefaultTracer.java | 50 ++- .../sleuth/DefaultTraceManagerTests.java | 4 +- .../cloud/sleuth/MilliSpanTests.java | 43 --- .../cloud/sleuth/SpanTest.java | 24 +- .../sleuth/instrument/TraceCallableTests.java | 18 +- .../sleuth/instrument/TraceRunnableTests.java | 42 +-- .../TraceableExecutorServiceTests.java | 44 ++- .../instrument/hystrix/TraceCommandTests.java | 20 +- .../AbstractTraceStompIntegrationTests.java | 16 +- .../TraceChannelInterceptorTests.java | 16 +- ...extPropagationChannelInterceptorTests.java | 12 +- ...ceStompMessageChannelInterceptorTests.java | 8 +- ...extPropagationChannelInterceptorTests.java | 6 +- .../web/TraceFilterIntegrationTests.java | 14 +- .../instrument/web/TraceFilterTests.java | 12 +- .../web/client/FeignTraceTests.java | 39 +-- .../TraceRestTemplateInterceptorTests.java | 37 +-- .../sleuth/log/JsonLogSpanListenerTests.java | 11 +- .../sampler/PercentageBasedSamplerTests.java | 9 +- .../sleuth/template/TraceTemplateTests.java | 10 +- .../sample/SampleMessagingApplication.java | 2 +- .../java/sample/SampleRibbonApplication.java | 2 +- .../main/java/sample/SampleController.java | 4 +- .../java/sample/SampleSleuthApplication.java | 2 +- .../java/tools/RequestSendingRunnable.java | 8 +- .../java/integration/ZipkinStreamTests.java | 3 +- .../main/java/sample/SampleController.java | 4 +- .../java/sample/SampleZipkinApplication.java | 2 +- .../main/java/sample/SampleController.java | 4 +- .../ServerPropertiesHostLocatorTests.java | 5 +- .../stream/StreamSpanListenerTests.java | 20 +- .../SamplingZipkinSpanIteratorTests.java | 6 +- .../stream/ZipkinMessageListenerTests.java | 7 +- .../zipkin/ZipkinSpanListenerTests.java | 20 +- 62 files changed, 614 insertions(+), 714 deletions(-) delete mode 100644 spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java delete mode 100644 spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/MilliSpanTests.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java deleted file mode 100644 index b648dce4a..000000000 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/MilliSpan.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright 2013-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.sleuth; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import lombok.Builder; -import lombok.Data; -import lombok.Singular; - -/** - * @author Spencer Gibb - */ -@Data -@Builder(toBuilder=true) -public class MilliSpan implements Span { - private final long begin; - private long end = 0; - private final String name; - private final long traceId; - @Singular - private List parents = new ArrayList<>(); - private final long spanId; - private boolean remote = false; - private boolean exportable = true; - private final Map tags = new LinkedHashMap<>(); - private final String processId; - @Singular - private final List logs = new ArrayList<>(); - private final Span savedSpan; - - public static MilliSpan.MilliSpanBuilder builder() { - return new MilliSpan().toBuilder(); - } - - public MilliSpan(Span current, Span savedSpan) { - this.begin = current.getBegin(); - this.end = current.getEnd(); - this.name = current.getName(); - this.traceId = current.getTraceId(); - this.parents = current.getParents(); - this.spanId = current.getSpanId(); - this.remote = current.isRemote(); - this.exportable = current.isExportable(); - this.processId = current.getProcessId(); - this.tags.putAll(current.tags()); - this.logs.addAll(current.logs()); - this.savedSpan = savedSpan; - } - - public MilliSpan(long begin, long end, String name, long traceId, List parents, long spanId, boolean remote, boolean exportable, String processId) { - this(begin, end, name, traceId, parents, spanId, remote, exportable, processId, null); - } - - public MilliSpan(long begin, long end, String name, long traceId, List parents, long spanId, boolean remote, boolean exportable, String processId, Span savedSpan) { - this.begin = begin<=0 ? System.currentTimeMillis() : begin; - this.end = end; - this.name = name; - this.traceId = traceId; - this.parents = parents; - this.spanId = spanId; - this.remote = remote; - this.exportable = exportable; - this.processId = processId; - this.savedSpan = savedSpan; - } - - //for serialization - private MilliSpan() { - this.begin = 0; - this.name = null; - this.traceId = 0; - this.spanId = 0; - this.processId = null; - this.parents = new ArrayList<>(); - this.savedSpan = null; - } - - @Override - public synchronized void stop() { - if (this.end == 0) { - if (this.begin == 0) { - throw new IllegalStateException("Span for " + this.name - + " has not been started"); - } - this.end = System.currentTimeMillis(); - } - } - - @Override - public synchronized long getAccumulatedMillis() { - if (this.begin == 0) { - return 0; - } - if (this.end > 0) { - return this.end - this.begin; - } - return System.currentTimeMillis() - this.begin; - } - - @Override - public synchronized boolean isRunning() { - return this.begin != 0 && this.end == 0; - } - - @Override - public void tag(String key, String value) { - this.tags.put(key, value); - } - - @Override - public void log(String msg) { - this.logs.add(new Log(System.currentTimeMillis(), - msg)); - } - - @Override - public Map tags() { - return Collections.unmodifiableMap(this.tags); - } - - @Override - public List logs() { - return Collections.unmodifiableList(this.logs); - } - - @Override - public boolean hasSavedSpan() { - return savedSpan != null; - } - -} diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Sampler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Sampler.java index a12f7b375..109430b75 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Sampler.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Sampler.java @@ -18,32 +18,7 @@ package org.springframework.cloud.sleuth; /** * Extremely simple callback to determine the frequency that an action should be - * performed. - *

- * 'T' is the object type you require to create a more advanced sampling - * function. For example if there is some RPC information in a 'Call' object, - * you might implement Sampler. Then when the RPC is received you can call - * one of the Trace.java functions that takes the extra 'info' parameter, which - * will be passed into the next function you implemented. - *

- * For the example above, the next(T info) function may look like this - *

- *

- * public boolean next(T info) {
- *   if (info == null) {
- *     return false;
- *   } else if (info.getName().equals("get")) {
- *     return Math.random() > 0.5;
- *   } else if (info.getName().equals("put")) {
- *     return Math.random() > 0.25;
- *   } else {
- *     return false;
- *   }
- * }
- * 
- * 
- * This would trace 50% of all gets, 75% of all puts and would not trace any other requests. */ -public interface Sampler { +public interface Sampler { boolean next(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java index f24b23dd1..4b2c6509d 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Span.java @@ -16,115 +16,161 @@ package org.springframework.cloud.sleuth; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Singular; +import lombok.ToString; import org.springframework.util.Assert; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** - * Interface for gathering and reporting statistics about a block of execution. + * Class for gathering and reporting statistics about a block of execution. *

* Spans should form a directed acyclic graph structure. It should be possible to keep * following the parents of a span until you arrive at a span with no parents. *

+ * + * @author Spencer Gibb + * @author Marcin Grzejszczak */ -public interface Span { +@Builder(toBuilder = true) +@ToString +@EqualsAndHashCode +@Getter +public class Span { - String NOT_SAMPLED_NAME = "X-Not-Sampled"; - String PROCESS_ID_NAME = "X-Process-Id"; - String PARENT_ID_NAME = "X-Parent-Id"; - String TRACE_ID_NAME = "X-Trace-Id"; - String SPAN_NAME_NAME = "X-Span-Name"; - String SPAN_ID_NAME = "X-Span-Id"; - List HEADERS = Arrays.asList(SPAN_ID_NAME, TRACE_ID_NAME, - SPAN_NAME_NAME, PARENT_ID_NAME, PROCESS_ID_NAME, NOT_SAMPLED_NAME); - String SPAN_EXPORT_NAME = "X-Span-Export"; + public static final String NOT_SAMPLED_NAME = "X-Not-Sampled"; + public static final String PROCESS_ID_NAME = "X-Process-Id"; + public static final String PARENT_ID_NAME = "X-Parent-Id"; + public static final String TRACE_ID_NAME = "X-Trace-Id"; + public static final String SPAN_NAME_NAME = "X-Span-Name"; + public static final String SPAN_ID_NAME = "X-Span-Id"; + public static final List HEADERS = Arrays + .asList(SPAN_ID_NAME, TRACE_ID_NAME, SPAN_NAME_NAME, PARENT_ID_NAME, + PROCESS_ID_NAME, NOT_SAMPLED_NAME); + public static final String SPAN_EXPORT_NAME = "X-Span-Export"; - /** - * A human-readable name assigned to this span instance. - *

- */ - String getName(); + private final long begin; + private long end = 0; + private final String name; + private final long traceId; + @Singular + private List parents = new ArrayList<>(); + private final long spanId; + private boolean remote = false; + private boolean exportable = true; + private final Map tags = new LinkedHashMap<>(); + private final String processId; + @Singular + private final List logs = new ArrayList<>(); + private final Span savedSpan; - /** - * A pseudo-unique (random) number assigned to this span instance. - *

- *

- * The spanId is immutable and cannot be changed. It is safe to access this from - * multiple threads. - */ - long getSpanId(); + public static Span.SpanBuilder builder() { + return new Span().toBuilder(); + } - /** - * A pseudo-unique (random) number assigned to the trace associated with this span - */ - long getTraceId(); + public Span(Span current, Span savedSpan) { + this.begin = current.getBegin(); + this.end = current.getEnd(); + this.name = current.getName(); + this.traceId = current.getTraceId(); + this.parents = current.getParents(); + this.spanId = current.getSpanId(); + this.remote = current.isRemote(); + this.exportable = current.isExportable(); + this.processId = current.getProcessId(); + this.tags.putAll(current.tags()); + this.logs.addAll(current.logs()); + this.savedSpan = savedSpan; + } - /** - * Return a unique id for the process from which this Span originated. - *

- *

- * // TODO: Check when this is going to be null (cause it may be null) - */ - String getProcessId(); + public Span(long begin, long end, String name, long traceId, List parents, + long spanId, boolean remote, boolean exportable, String processId) { + this(begin, end, name, traceId, parents, spanId, remote, exportable, processId, null); + } - /** - * Returns the parent IDs of the span. - *

- *

- * The collection will be empty if there are no parents. - */ - List getParents(); + public Span(long begin, long end, String name, long traceId, List parents, + long spanId, boolean remote, boolean exportable, String processId, + Span savedSpan) { + this.begin = begin<=0 ? System.currentTimeMillis() : begin; + this.end = end; + this.name = name; + this.traceId = traceId; + this.parents = parents; + this.spanId = spanId; + this.remote = remote; + this.exportable = exportable; + this.processId = processId; + this.savedSpan = savedSpan; + } - /** - * Flag that tells us whether the span was started in another process. Useful in RPC - * tracing when the receiver actually has to add annotations to the senders span. - */ - boolean isRemote(); + //for serialization + private Span() { + this.begin = 0; + this.name = null; + this.traceId = 0; + this.spanId = 0; + this.processId = null; + this.parents = new ArrayList<>(); + this.savedSpan = null; + } /** * The block has completed, stop the clock */ - void stop(); - - /** - * Get the start time, in milliseconds - */ - long getBegin(); - - /** - * Get the stop time, in milliseconds - */ - long getEnd(); + public synchronized void stop() { + if (this.end == 0) { + if (this.begin == 0) { + throw new IllegalStateException("Span for " + this.name + + " has not been started"); + } + this.end = System.currentTimeMillis(); + } + } /** * Return the total amount of time elapsed since start was called, if running, or * difference between stop and start */ - long getAccumulatedMillis(); + public synchronized long getAccumulatedMillis() { + if (this.begin == 0) { + return 0; + } + if (this.end > 0) { + return this.end - this.begin; + } + return System.currentTimeMillis() - this.begin; + } /** * Has the span been started and not yet stopped? */ - boolean isRunning(); - - /** - * Is the span eligible for export? If not then we may not need accumulate annotations - * (for instance). - */ - boolean isExportable(); + public synchronized boolean isRunning() { + return this.begin != 0 && this.end == 0; + } /** * Add a tag or data annotation associated with this span */ - void tag(String key, String value); + public void tag(String key, String value) { + this.tags.put(key, value); + } /** * Add a log or timeline annotation associated with this span */ - void log(String msg); + public void log(String msg) { + this.logs.add(new Log(System.currentTimeMillis(), + msg)); + } /** * Get tag data associated with this span (read only) @@ -132,7 +178,9 @@ public interface Span { *

* Will never be null. */ - Map tags(); + public Map tags() { + return Collections.unmodifiableMap(this.tags); + } /** * Get any logs or annotations (read only) @@ -140,38 +188,111 @@ public interface Span { *

* Will never be null. */ - List logs(); - - - /** - * Class used for conversions of long ids to their String representation - */ - class IdConverter { - - /** - * Represents given long id as hex string - */ - public static String toHex(long id) { - return Long.toHexString(id); - } - - /** - * Represents hex string as long - */ - public static long fromHex(String hexString) { - Assert.hasText(hexString, "Can't convert empty hex string to long"); - return new BigInteger(hexString, 16).longValue(); - } + public List logs() { + return Collections.unmodifiableList(this.logs); } /** - * The span that was "current" before this span was entered + * Returns the saved span. The one that was "current" before this Span. + *

+ * Might be null */ - Span getSavedSpan(); + public Span getSavedSpan() { + return this.savedSpan; + } + + public boolean hasSavedSpan() { + return this.savedSpan != null; + } /** - * - * @return true if there was a "current" span before this span was entered + * A human-readable name assigned to this span instance. + *

*/ - boolean hasSavedSpan(); + public String getName() { + return this.name; + } + + /** + * A pseudo-unique (random) number assigned to this span instance. + *

+ *

+ * The spanId is immutable and cannot be changed. It is safe to access this from + * multiple threads. + */ + public long getSpanId() { + return this.spanId; + } + + /** + * A pseudo-unique (random) number assigned to the trace associated with this span + */ + public long getTraceId() { + return this.traceId; + } + + /** + * Return a unique id for the process from which this Span originated. + *

+ *

+ * // TODO: Check when this is going to be null (cause it may be null) + */ + public String getProcessId() { + return this.processId; + } + + /** + * Returns the parent IDs of the span. + *

+ *

+ * The collection will be empty if there are no parents. + */ + public List getParents() { + return this.parents; + } + + /** + * Flag that tells us whether the span was started in another process. Useful in RPC + * tracing when the receiver actually has to add annotations to the senders span. + */ + public boolean isRemote() { + return this.remote; + } + + /** + * Get the start time, in milliseconds + */ + public long getBegin() { + return this.begin; + } + + /** + * Get the stop time, in milliseconds + */ + public long getEnd() { + return this.end; + } + + /** + * Is the span eligible for export? If not then we may not need accumulate annotations + * (for instance). + */ + public boolean isExportable() { + return this.exportable; + } + + /** + * Represents given long id as hex string + */ + public static String toHex(long id) { + return Long.toHexString(id); + } + + /** + * Represents hex string as long + */ + public static long fromHex(String hexString) { + Assert.hasText(hexString, "Can't convert empty hex string to long"); + return new BigInteger(hexString, 16).longValue(); + } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java index bee98b49f..8013475b5 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/Tracer.java @@ -31,14 +31,8 @@ import java.util.concurrent.Callable; * With care, it is possible to safely pass a Span object between threads, but in most * cases this is not necessary. * - * A 'TraceScope' can either be empty, or contain a Span. TraceScope objects implement the - * Java's Closeable interface. Similar to file descriptors, they must be closed after they - * are created. When a TraceScope contains a Span, this span is closed when the scope is - * closed. + * The 'startTrace' method in this class starts a new span. * - * The 'startTrace' methods in this class do a few things: - *

    - *
  • Set currentSpan to the new Span.
  • *
  • Create a TraceSpan object to manage the new Span.
  • *
* @@ -53,18 +47,18 @@ import java.util.concurrent.Callable; public interface Tracer extends TraceAccessor { /** - * Creates a trace wrapping a new span. + * Creates a new Span. *

* If this thread has a currently active span, it will be the parent of the span we - * create here, and the trace scope will contain the new span and the parent. If there - * is no currently active trace span, the trace scope we create will be empty. + * create here. If there is no currently active trace span, the trace scope we + * create will be empty. * * @param name The name field for the new span to create. */ Span startTrace(String name); /** - * Creates a new trace scope with a specific parent. The parent might be in another + * Creates a new Span with a specific parent. The parent might be in another * process or thread. *

* If this thread has a currently active trace span, it must be the 'parent' span that @@ -81,12 +75,12 @@ public interface Tracer extends TraceAccessor { * @param name the name of the span * @param sampler a sampler to decide whether to create the span or not */ - Span startTrace(String name, Sampler sampler); + Span startTrace(String name, Sampler sampler); /** * Pick up an existing span from another thread. */ - Span continueSpan(Span s); + Span continueSpan(Span span); /** * Adds a tag to the current span if tracing is currently on. @@ -96,19 +90,19 @@ public interface Tracer extends TraceAccessor { /** * Remove this span from the current thread, but don't stop it yet or send it for * collection. This is useful if the span object is then passed to another thread for - * use with Trace.continueTrace(). + * use with Span.continueTrace(). * * @return the saved trace if there was one before the trace started (null otherwise) */ - Span detach(Span trace); + Span detach(Span span); /** * Remove this span from the current thread, stop it and send it for collection. * - * @param trace the trace to close - * @return the saved trace if there was one before the trace started (null otherwise) + * @param span the span to close + * @return the saved span if there was one before the trace started (null otherwise) */ - Span close(Span trace); + Span close(Span span); Callable wrap(Callable callable); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java index 237a2821d..3954e9a37 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java @@ -41,13 +41,13 @@ public class TraceAutoConfiguration { @Bean @ConditionalOnMissingBean - public Sampler defaultTraceSampler() { + public Sampler defaultTraceSampler() { return new IsTracingSampler(); } @Bean @ConditionalOnMissingBean - public DefaultTracer traceManager(Sampler sampler, + public DefaultTracer traceManager(Sampler sampler, ApplicationEventPublisher publisher) { return new DefaultTracer(sampler, random(), publisher); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java index 5a9b028bf..ddf6060c0 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceCallable.java @@ -43,12 +43,12 @@ public class TraceCallable extends TraceDelegate> implements Call @Override public V call() throws Exception { ensureThatThreadIsNotPollutedByPreviousTraces(); - Span trace = startSpan(); + Span span = startSpan(); try { return this.getDelegate().call(); } finally { - closeAll(trace); + closeAll(span); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java index 28a1548c9..f30a7caf9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceDelegate.java @@ -43,14 +43,14 @@ public abstract class TraceDelegate { this.parent = tracer.getCurrentSpan(); } - protected void close(Span trace) { - this.tracer.close(trace); + protected void close(Span span) { + this.tracer.close(span); } - protected void closeAll(Span trace) { - trace = this.tracer.close(trace); - while (trace != null) { - trace = this.tracer.detach(trace); + protected void closeAll(Span span) { + span = this.tracer.close(span); + while (span != null) { + span = this.tracer.detach(span); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java index 0baf6c843..3582aa95b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/TraceRunnable.java @@ -40,12 +40,12 @@ public class TraceRunnable extends TraceDelegate implements Runnable { @Override public void run() { ensureThatThreadIsNotPollutedByPreviousTraces(); - Span trace = startSpan(); + Span span = startSpan(); try { this.getDelegate().run(); } finally { - closeAll(trace); + closeAll(span); } } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java index b520d584a..175d58b8b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java @@ -71,11 +71,11 @@ public abstract class TraceCommand extends HystrixCommand { @Override protected R run() throws Exception { enforceThatHystrixThreadIsNotPollutedByPreviousTraces(); - Span trace = this.tracer.joinTrace(getCommandKey().name(), parentSpan); + Span span = this.tracer.joinTrace(getCommandKey().name(), parentSpan); try { return doRun(); } finally { - this.tracer.close(trace); + this.tracer.close(span); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceChannelInterceptor.java index d813e027f..c43546c23 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceChannelInterceptor.java @@ -1,10 +1,6 @@ package org.springframework.cloud.sleuth.instrument.integration; -import java.util.Random; - -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.integration.channel.AbstractMessageChannel; @@ -13,6 +9,8 @@ import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.support.ChannelInterceptorAdapter; +import java.util.Random; + /** * Abstraction over classes related to channel intercepting * @@ -45,19 +43,19 @@ abstract class AbstractTraceChannelInterceptor extends ChannelInterceptorAdapter * trace id passed initially. */ Span buildSpan(Message message) { - if (!hasHeader(message, Trace.TRACE_ID_NAME) || !hasHeader(message, Trace.SPAN_ID_NAME)) { + if (!hasHeader(message, Span.TRACE_ID_NAME) || !hasHeader(message, Span.SPAN_ID_NAME)) { return null; // cannot build a span without ids } - long spanId = hasHeader(message, Trace.SPAN_ID_NAME) ? - getHeader(message, Trace.SPAN_ID_NAME, Long.class) : this.random.nextLong(); - long traceId = getHeader(message, Trace.TRACE_ID_NAME, Long.class); - MilliSpan.MilliSpanBuilder span = MilliSpan.builder().traceId(traceId).spanId(spanId); - Long parentId = getHeader(message, Trace.PARENT_ID_NAME, Long.class); - if (message.getHeaders().containsKey(Trace.NOT_SAMPLED_NAME)) { + long spanId = hasHeader(message, Span.SPAN_ID_NAME) ? + getHeader(message, Span.SPAN_ID_NAME, Long.class) : this.random.nextLong(); + long traceId = getHeader(message, Span.TRACE_ID_NAME, Long.class); + Span.SpanBuilder span = Span.builder().traceId(traceId).spanId(spanId); + Long parentId = getHeader(message, Span.PARENT_ID_NAME, Long.class); + if (message.getHeaders().containsKey(Span.NOT_SAMPLED_NAME)) { span.exportable(false); } - String processId = getHeader(message, Trace.PROCESS_ID_NAME); - String spanName = getHeader(message, Trace.SPAN_NAME_NAME); + String processId = getHeader(message, Span.PROCESS_ID_NAME); + String spanName = getHeader(message, Span.SPAN_NAME_NAME); if (spanName != null) { span.name(spanName); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/SpanMessageHeaders.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/SpanMessageHeaders.java index b881eb0d2..cae280089 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/SpanMessageHeaders.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/SpanMessageHeaders.java @@ -16,17 +16,16 @@ package org.springframework.cloud.sleuth.instrument.integration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.util.StringUtils; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * Utility for manipulating message headers related to span data. * @@ -38,25 +37,25 @@ public class SpanMessageHeaders { public static Message addSpanHeaders(TraceKeys traceKeys, Message message, Span span) { if (span == null) { - if (!message.getHeaders().containsKey(Trace.NOT_SAMPLED_NAME)) { + if (!message.getHeaders().containsKey(Span.NOT_SAMPLED_NAME)) { return MessageBuilder.fromMessage(message) - .setHeader(Trace.NOT_SAMPLED_NAME, "").build(); + .setHeader(Span.NOT_SAMPLED_NAME, "").build(); } return message; } Map headers = new HashMap<>(); - addHeader(headers, Trace.TRACE_ID_NAME, span.getTraceId()); - addHeader(headers, Trace.SPAN_ID_NAME, span.getSpanId()); + addHeader(headers, Span.TRACE_ID_NAME, span.getTraceId()); + addHeader(headers, Span.SPAN_ID_NAME, span.getSpanId()); if (span.isExportable()) { addAnnotations(traceKeys, message, span); - addHeader(headers, Trace.PARENT_ID_NAME, getFirst(span.getParents())); - addHeader(headers, Trace.SPAN_NAME_NAME, span.getName()); - addHeader(headers, Trace.PROCESS_ID_NAME, span.getProcessId()); + addHeader(headers, Span.PARENT_ID_NAME, getFirst(span.getParents())); + addHeader(headers, Span.SPAN_NAME_NAME, span.getName()); + addHeader(headers, Span.PROCESS_ID_NAME, span.getProcessId()); } else { - addHeader(headers, Trace.NOT_SAMPLED_NAME, ""); + addHeader(headers, Span.NOT_SAMPLED_NAME, ""); } return MessageBuilder.fromMessage(message).copyHeaders(headers).build(); } @@ -100,7 +99,7 @@ public class SpanMessageHeaders { private static void addHeader(Map headers, String name, Long value) { if (value != null) { - addHeader(headers, name, Span.IdConverter.toHex(value)); + addHeader(headers, name, Span.toHex(value)); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/StompMessageBuilder.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/StompMessageBuilder.java index fa16c8b08..3d3351bdb 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/StompMessageBuilder.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/StompMessageBuilder.java @@ -16,18 +16,17 @@ package org.springframework.cloud.sleuth.instrument.integration; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.messaging.Message; import org.springframework.messaging.simp.SimpMessageHeaderAccessor; import org.springframework.messaging.simp.SimpMessageType; import org.springframework.util.StringUtils; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + /** * Builder class to create STOMP message * @@ -62,16 +61,16 @@ public class StompMessageBuilder { public StompMessageBuilder setHeadersFromSpan(final Span span) { if (span != null) { - setHeaderIfAbsent(Trace.SPAN_ID_NAME, span.getSpanId()); - setHeaderIfAbsent(Trace.TRACE_ID_NAME, span.getTraceId()); - setHeaderIfAbsent(Trace.SPAN_NAME_NAME, span.getName()); - Long parentId = getParentId(TraceContextHolder.getCurrentSpan()); + setHeaderIfAbsent(Span.SPAN_ID_NAME, span.getSpanId()); + setHeaderIfAbsent(Span.TRACE_ID_NAME, span.getTraceId()); + setHeaderIfAbsent(Span.SPAN_NAME_NAME, span.getName()); + Long parentId = getParentId(SpanContextHolder.getCurrentSpan()); if (parentId != null) - setHeaderIfAbsent(Trace.PARENT_ID_NAME, parentId); + setHeaderIfAbsent(Span.PARENT_ID_NAME, parentId); String processId = span.getProcessId(); if (StringUtils.hasText(processId)) - setHeaderIfAbsent(Trace.PROCESS_ID_NAME, processId); + setHeaderIfAbsent(Span.PROCESS_ID_NAME, processId); } return this; } @@ -101,12 +100,12 @@ public class StompMessageBuilder { case SimpMessageHeaderAccessor.HEART_BEAT_HEADER: case SimpMessageHeaderAccessor.ORIGINAL_DESTINATION: case SimpMessageHeaderAccessor.IGNORE_ERROR: - case Trace.NOT_SAMPLED_NAME: - case Trace.PARENT_ID_NAME: - case Trace.PROCESS_ID_NAME: - case Trace.SPAN_ID_NAME: - case Trace.SPAN_NAME_NAME: - case Trace.TRACE_ID_NAME: + case Span.NOT_SAMPLED_NAME: + case Span.PARENT_ID_NAME: + case Span.PROCESS_ID_NAME: + case Span.SPAN_ID_NAME: + case Span.SPAN_NAME_NAME: + case Span.TRACE_ID_NAME: accessor.setHeader(key, value); break; default: diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptor.java index 679111fea..605bf390c 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptor.java @@ -16,23 +16,22 @@ package org.springframework.cloud.sleuth.instrument.integration; -import java.util.Random; - import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.cloud.sleuth.sampler.IsTracingSampler; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; +import java.util.Random; + /** * @author Dave Syer * */ public class TraceChannelInterceptor extends AbstractTraceChannelInterceptor { - private ThreadLocal traceHolder = new ThreadLocal<>(); + private ThreadLocal traceHolder = new ThreadLocal<>(); public TraceChannelInterceptor(Tracer tracer, TraceKeys traceKeys, Random random) { super(tracer, traceKeys, random); @@ -40,7 +39,7 @@ public class TraceChannelInterceptor extends AbstractTraceChannelInterceptor { @Override public void postSend(Message message, MessageChannel channel, boolean sent) { - Trace trace = this.traceHolder.get(); + Span trace = this.traceHolder.get(); // Double close to clean up the parent (remote span as well) getTracer().close(getTracer().close(trace)); this.traceHolder.remove(); @@ -53,16 +52,16 @@ public class TraceChannelInterceptor extends AbstractTraceChannelInterceptor { getTracer().getCurrentSpan()); } String name = getMessageChannelName(channel); - Trace trace = startSpan(buildSpan(message), name, message); - this.traceHolder.set(trace); - return SpanMessageHeaders.addSpanHeaders(getTraceKeys(), message, trace.getSpan()); + Span span = startSpan(buildSpan(message), name, message); + this.traceHolder.set(span); + return SpanMessageHeaders.addSpanHeaders(getTraceKeys(), message, span); } - private Trace startSpan(Span span, String name, Message message) { + private Span startSpan(Span span, String name, Message message) { if (span != null) { return getTracer().joinTrace(name, span); } - if (message.getHeaders().containsKey(Trace.NOT_SAMPLED_NAME)) { + if (message.getHeaders().containsKey(Span.NOT_SAMPLED_NAME)) { return getTracer().startTrace(name, IsTracingSampler.INSTANCE); } return getTracer().startTrace(name); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java index 3a51492e8..0faa67801 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptor.java @@ -147,7 +147,7 @@ public class TraceContextPropagationChannelInterceptor extends ChannelIntercepto } } public void setHeader(Map headers, String name, long value) { - setHeader(headers, name, Span.IdConverter.toHex(value)); + setHeader(headers, name, Span.toHex(value)); } @Override diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptor.java index 23ef86df4..e343dfd4d 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptor.java @@ -15,16 +15,15 @@ */ package org.springframework.cloud.sleuth.instrument.integration; -import java.util.Random; - import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.support.ChannelInterceptor; +import java.util.Random; + /** * Interceptor for Stomp Messages sent over websocket * @@ -33,7 +32,7 @@ import org.springframework.messaging.support.ChannelInterceptor; * */ public class TraceStompMessageChannelInterceptor extends AbstractTraceChannelInterceptor implements ChannelInterceptor { - private ThreadLocal traceScopeHolder = new ThreadLocal(); + private ThreadLocal traceScopeHolder = new ThreadLocal<>(); public TraceStompMessageChannelInterceptor(Tracer tracer, TraceKeys traceKeys, Random random) { super(tracer, traceKeys, random); @@ -41,16 +40,16 @@ public class TraceStompMessageChannelInterceptor extends AbstractTraceChannelInt @Override public Message preSend(Message message, MessageChannel channel) { - if (getTracer().isTracing() || message.getHeaders().containsKey(Trace.NOT_SAMPLED_NAME)) { + if (getTracer().isTracing() || message.getHeaders().containsKey(Span.NOT_SAMPLED_NAME)) { return StompMessageBuilder.fromMessage(message).setHeadersFromSpan(getTracer().getCurrentSpan()).build(); } String name = getMessageChannelName(channel); - Trace trace = startSpan(buildSpan(message), name); - this.traceScopeHolder.set(trace); - return StompMessageBuilder.fromMessage(message).setHeadersFromSpan(trace.getSpan()).build(); + Span span = startSpan(buildSpan(message), name); + this.traceScopeHolder.set(span); + return StompMessageBuilder.fromMessage(message).setHeadersFromSpan(span).build(); } - private Trace startSpan(Span span, String name) { + private Span startSpan(Span span, String name) { if (span != null) { return getTracer().joinTrace(name, span); } @@ -59,8 +58,8 @@ public class TraceStompMessageChannelInterceptor extends AbstractTraceChannelInt @Override public void postSend(Message message, MessageChannel channel, boolean sent) { - final ThreadLocal traceScopeHolder = this.traceScopeHolder; - Trace traceInScope = traceScopeHolder.get(); + final ThreadLocal traceScopeHolder = this.traceScopeHolder; + Span traceInScope = traceScopeHolder.get(); getTracer().close(traceInScope); traceScopeHolder.remove(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptor.java index 98c2a6b84..0dd79a057 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptor.java @@ -18,7 +18,6 @@ package org.springframework.cloud.sleuth.instrument.integration; import org.springframework.aop.support.AopUtils; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceKeys; import org.springframework.integration.channel.DirectChannel; @@ -40,7 +39,7 @@ public class TraceStompMessageContextPropagationChannelInterceptor extends Chann implements ExecutorChannelInterceptor { private final Tracer tracer; - private final static ThreadLocal ORIGINAL_CONTEXT = new ThreadLocal<>(); + private final static ThreadLocal ORIGINAL_CONTEXT = new ThreadLocal<>(); private TraceKeys traceKeys; public TraceStompMessageContextPropagationChannelInterceptor(Tracer tracer, TraceKeys traceKeys) { @@ -94,12 +93,12 @@ public class TraceStompMessageContextPropagationChannelInterceptor extends Chann protected void populatePropagatedContext(Span span) { if (span != null) { - ORIGINAL_CONTEXT.set(this.tracer.continueSpan(span).getSaved()); + ORIGINAL_CONTEXT.set(this.tracer.continueSpan(span).getSavedSpan()); } } protected void resetPropagatedContext() { - Trace originalContext = ORIGINAL_CONTEXT.get(); + Span originalContext = ORIGINAL_CONTEXT.get(); this.tracer.detach(originalContext); ORIGINAL_CONTEXT.remove(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java index 0f2707558..64748ddb9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java @@ -46,12 +46,12 @@ public class TraceSchedulingAspect { @Around("execution (@org.springframework.scheduling.annotation.Scheduled * *.*(..))") public Object traceBackgroundThread(final ProceedingJoinPoint pjp) throws Throwable { - Span trace = this.tracer.startTrace(pjp.toShortString()); + Span span = this.tracer.startTrace(pjp.toShortString()); try { return pjp.proceed(); } finally { - this.tracer.close(trace); + this.tracer.close(span); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java index a98865d3b..d1dd8c3eb 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilter.java @@ -15,23 +15,8 @@ */ package org.springframework.cloud.sleuth.instrument.web; -import static org.springframework.util.StringUtils.hasText; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Random; -import java.util.regex.Pattern; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.cloud.sleuth.MilliSpan; -import org.springframework.cloud.sleuth.MilliSpan.MilliSpanBuilder; import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Span.SpanBuilder; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.ServerReceivedEvent; import org.springframework.cloud.sleuth.event.ServerSentEvent; @@ -47,6 +32,19 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.UrlPathHelper; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.Random; +import java.util.regex.Pattern; + +import static org.springframework.util.StringUtils.hasText; + /** * Filter that takes the value of the {@link Span#SPAN_ID_NAME} and * {@link Span#TRACE_ID_NAME} header from either request or response and uses them to @@ -111,9 +109,9 @@ public class TraceFilter extends OncePerRequestFilter boolean skip = this.skipPattern.matcher(uri).matches() || getHeader(request, response, Span.NOT_SAMPLED_NAME) != null; - Span trace = (Span) request.getAttribute(TRACE_REQUEST_ATTR); - if (trace != null) { - this.tracer.continueSpan(trace); + Span spanFromRequest = (Span) request.getAttribute(TRACE_REQUEST_ATTR); + if (spanFromRequest != null) { + this.tracer.continueSpan(spanFromRequest); } else if (skip) { addToResponseIfNotPresent(response, Span.NOT_SAMPLED_NAME, ""); @@ -121,11 +119,12 @@ public class TraceFilter extends OncePerRequestFilter String name = "http" + uri; if (hasHeader(request, response, Span.TRACE_ID_NAME)) { - long traceId = Span.IdConverter.fromHex(getHeader(request, response, Span.TRACE_ID_NAME)); + long traceId = Span.fromHex(getHeader(request, response, Span.TRACE_ID_NAME)); long spanId = hasHeader(request, response, Span.SPAN_ID_NAME) ? - Span.IdConverter.fromHex(getHeader(request, response, Span.SPAN_ID_NAME)) : this.random.nextLong(); + Span.fromHex(getHeader(request, response, Span.SPAN_ID_NAME)) : + this.random.nextLong(); - MilliSpanBuilder span = MilliSpan.builder().traceId(traceId).spanId(spanId); + SpanBuilder span = Span.builder().traceId(traceId).spanId(spanId); if (skip) { span.exportable(false); } @@ -140,25 +139,26 @@ public class TraceFilter extends OncePerRequestFilter span.processId(processId); } if (hasHeader(request, response, Span.PARENT_ID_NAME)) { - span.parent(Span.IdConverter.fromHex(getHeader(request, response, Span.PARENT_ID_NAME))); + span.parent( + Span.fromHex(getHeader(request, response, Span.PARENT_ID_NAME))); } span.remote(true); Span parent = span.build(); - trace = this.tracer.joinTrace(name, parent); - publish(new ServerReceivedEvent(this, parent, trace)); - request.setAttribute(TRACE_REQUEST_ATTR, trace); + spanFromRequest = this.tracer.joinTrace(name, parent); + publish(new ServerReceivedEvent(this, parent, spanFromRequest)); + request.setAttribute(TRACE_REQUEST_ATTR, spanFromRequest); } else { if (skip) { - trace = this.tracer.startTrace(name, IsTracingSampler.INSTANCE + spanFromRequest = this.tracer.startTrace(name, IsTracingSampler.INSTANCE ); } else { - trace = this.tracer.startTrace(name); + spanFromRequest = this.tracer.startTrace(name); } - request.setAttribute(TRACE_REQUEST_ATTR, trace); + request.setAttribute(TRACE_REQUEST_ATTR, spanFromRequest); } Throwable exception = null; @@ -180,23 +180,23 @@ public class TraceFilter extends OncePerRequestFilter if (skip) { addToResponseIfNotPresent(response, Span.NOT_SAMPLED_NAME, ""); } - if (trace != null) { + if (spanFromRequest != null) { addResponseTags(response, exception); - addResponseHeaders(response, trace); - if (trace.hasSavedSpan()) { - publish(new ServerSentEvent(this, trace.getSavedSpan(), - trace)); + addResponseHeaders(response, spanFromRequest); + if (spanFromRequest.hasSavedSpan()) { + publish(new ServerSentEvent(this, spanFromRequest.getSavedSpan(), + spanFromRequest)); } // Double close to clean up the parent (remote span as well) - this.tracer.close(this.tracer.close(trace)); + this.tracer.close(this.tracer.close(spanFromRequest)); } } } private void addResponseHeaders(HttpServletResponse response, Span span) { if (span != null) { - response.addHeader(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); - response.addHeader(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + response.addHeader(Span.SPAN_ID_NAME, Span.toHex(span.getSpanId())); + response.addHeader(Span.TRACE_ID_NAME, Span.toHex(span.getTraceId())); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java index cbcae4f76..ed2f073d3 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceFeignClientAutoConfiguration.java @@ -125,7 +125,7 @@ public class TraceFeignClientAutoConfiguration { setHeader(template, Span.NOT_SAMPLED_NAME, ""); return; } - template.header(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + template.header(Span.TRACE_ID_NAME, Span.toHex(span.getTraceId())); setHeader(template, Span.SPAN_NAME_NAME, span.getName()); setHeader(template, Span.SPAN_ID_NAME, span.getSpanId()); setHeader(template, Span.PARENT_ID_NAME, getParentId(span)); @@ -155,7 +155,7 @@ public class TraceFeignClientAutoConfiguration { public void setHeader(RequestTemplate request, String name, Long value) { if (value != null) { - setHeader(request, name, Span.IdConverter.toHex(value)); + setHeader(request, name, Span.toHex(value)); } } @@ -183,7 +183,7 @@ public class TraceFeignClientAutoConfiguration { public void setHeader(Map> headers, String name, Long value) { if (value != null ){ - setHeader(headers, name, Span.IdConverter.toHex(value)); + setHeader(headers, name, Span.toHex(value)); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java index 750839e93..272f17339 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptor.java @@ -99,7 +99,7 @@ ApplicationEventPublisherAware { public void setHeader(HttpRequest request, String name, Long value) { if (value != null) { - setHeader(request, name, Span.IdConverter.toHex(value)); + setHeader(request, name, Span.toHex(value)); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java index 35bf98f8d..cdac263c3 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TracePreZuulFilter.java @@ -93,7 +93,7 @@ ApplicationEventPublisherAware { } } public void setHeader(Map request, String name, Long value) { - setHeader(request, name, Span.IdConverter.toHex(value)); + setHeader(request, name, Span.toHex(value)); } @Override diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java index 5a4a39f46..29e08177b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceRestClientRibbonCommandFactory.java @@ -121,7 +121,7 @@ public class TraceRestClientRibbonCommandFactory extends RestClientRibbonCommand } public void setHeader(HttpRequest.Builder builder, String name, Long value) { - setHeader(builder, name, Span.IdConverter.toHex(value)); + setHeader(builder, name, Span.toHex(value)); } private Span getCurrentSpan() { diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java index 8b38512f4..4523c0f92 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanListener.java @@ -16,6 +16,7 @@ package org.springframework.cloud.sleuth.log; +import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.event.SpanAcquiredEvent; @@ -25,8 +26,6 @@ import org.springframework.context.event.EventListener; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; -import lombok.extern.slf4j.Slf4j; - /** * @author Spencer Gibb */ @@ -37,9 +36,9 @@ public class Slf4jSpanListener { @Order(Ordered.LOWEST_PRECEDENCE) public void start(SpanAcquiredEvent event) { Span span = event.getSpan(); - MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); + MDC.put(Span.SPAN_ID_NAME, Span.toHex(span.getSpanId())); MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); - MDC.put(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + MDC.put(Span.TRACE_ID_NAME, Span.toHex(span.getTraceId())); log.trace("Starting span: {}", span); if (event.getParent() != null) { log.trace("With parent: {}", event.getParent()); @@ -50,8 +49,8 @@ public class Slf4jSpanListener { @Order(Ordered.LOWEST_PRECEDENCE) public void continued(SpanContinuedEvent event) { Span span = event.getSpan(); - MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(span.getSpanId())); - MDC.put(Span.TRACE_ID_NAME, Span.IdConverter.toHex(span.getTraceId())); + MDC.put(Span.SPAN_ID_NAME, Span.toHex(span.getSpanId())); + MDC.put(Span.TRACE_ID_NAME, Span.toHex(span.getTraceId())); MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(span.isExportable())); log.trace("Continued span: {}", event.getSpan()); } @@ -62,7 +61,7 @@ public class Slf4jSpanListener { log.trace("Stopped span: {}", event.getSpan()); if (event.getParent() != null) { log.trace("With parent: {}", event.getParent()); - MDC.put(Span.SPAN_ID_NAME, Span.IdConverter.toHex(event.getParent().getSpanId())); + MDC.put(Span.SPAN_ID_NAME, Span.toHex(event.getParent().getSpanId())); MDC.put(Span.SPAN_EXPORT_NAME, String.valueOf(event.getParent().isExportable())); } else { diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/AlwaysSampler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/AlwaysSampler.java index cb517f2ee..271218902 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/AlwaysSampler.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/AlwaysSampler.java @@ -21,7 +21,7 @@ import org.springframework.cloud.sleuth.Sampler; /** * @author Spencer Gibb */ -public class AlwaysSampler implements Sampler { +public class AlwaysSampler implements Sampler { @Override public boolean next() { return true; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java index a28c937a6..d9bc6056b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/IsTracingSampler.java @@ -22,7 +22,7 @@ import org.springframework.cloud.sleuth.trace.SpanContextHolder; /** * @author Spencer Gibb */ -public class IsTracingSampler implements Sampler { +public class IsTracingSampler implements Sampler { public static IsTracingSampler INSTANCE = new IsTracingSampler(); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSampler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSampler.java index 01902c79e..8c9923d09 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSampler.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSampler.java @@ -20,7 +20,7 @@ import org.springframework.cloud.sleuth.TraceAccessor; * @author Marcin Grzejszczak * @author Adrian Cole */ -public class PercentageBasedSampler implements Sampler { +public class PercentageBasedSampler implements Sampler { private final SamplerConfiguration configuration; private final TraceAccessor traceAccessor; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java index 4dca2f73f..bbb4c8876 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceCallback.java @@ -19,5 +19,5 @@ package org.springframework.cloud.sleuth.template; import org.springframework.cloud.sleuth.Span; public interface TraceCallback { - T doInTrace(Span trace); + T doInTrace(Span span); } \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceTemplate.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceTemplate.java index 5e5da4bdf..aa6f60876 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceTemplate.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/template/TraceTemplate.java @@ -16,7 +16,7 @@ package org.springframework.cloud.sleuth.template; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.TraceDelegate; @@ -35,11 +35,11 @@ public class TraceTemplate implements TraceOperations { public T trace(final TraceCallback callback) { if (this.tracer.isTracing()) { DelegateCallback delegate = new DelegateCallback<>(this.tracer); - Trace trace = delegate.startSpan(); + Span span = delegate.startSpan(); try { - return callback.doInTrace(trace); + return callback.doInTrace(span); } finally { - this.tracer.close(trace); + this.tracer.close(span); } } else { return callback.doInTrace(null); @@ -53,7 +53,7 @@ public class TraceTemplate implements TraceOperations { } @Override - protected Trace startSpan() { + protected Span startSpan() { return super.startSpan(); } 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 7cd0de715..7b9d4f62c 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,12 +16,6 @@ package org.springframework.cloud.sleuth.trace; -import static org.springframework.cloud.sleuth.util.ExceptionUtils.warn; - -import java.util.Random; -import java.util.concurrent.Callable; - -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; @@ -33,18 +27,23 @@ import org.springframework.cloud.sleuth.instrument.TraceRunnable; import org.springframework.cloud.sleuth.util.ExceptionUtils; import org.springframework.context.ApplicationEventPublisher; +import java.util.Random; +import java.util.concurrent.Callable; + +import static org.springframework.cloud.sleuth.util.ExceptionUtils.warn; + /** * @author Spencer Gibb */ public class DefaultTracer implements Tracer { - private final Sampler defaultSampler; + private final Sampler defaultSampler; private final ApplicationEventPublisher publisher; private final Random random; - public DefaultTracer(Sampler defaultSampler, + public DefaultTracer(Sampler defaultSampler, Random random, ApplicationEventPublisher publisher) { this.defaultSampler = defaultSampler; this.random = random; @@ -58,7 +57,7 @@ public class DefaultTracer implements Tracer { } Span currentSpan = getCurrentSpan(); if (currentSpan != null && !parent.equals(currentSpan)) { - warn("Trace client warn: thread " + Thread.currentThread().getName() + warn("Warn during joining trace: thread " + Thread.currentThread().getName() + " tried to start a new Span " + "with parent " + parent.toString() + ", but there is already a " + "currentSpan " + currentSpan); } @@ -71,15 +70,15 @@ public class DefaultTracer implements Tracer { } @Override - public Span startTrace(String name, Sampler s) { - Span span = null; + public Span startTrace(String name, Sampler s) { + Span span; if (isTracing() || s.next()) { span = createChild(getCurrentSpan(), name); } else { // Non-exportable so we keep the trace but not other data long id = createId(); - span = MilliSpan.builder().begin(System.currentTimeMillis()).name(name) + span = Span.builder().begin(System.currentTimeMillis()).name(name) .traceId(id).spanId(id).exportable(false).build(); this.publisher.publishEvent(new SpanAcquiredEvent(this, span)); } @@ -123,22 +122,15 @@ public class DefaultTracer implements Tracer { + ". You have " + "probably forgotten to close or detach " + cur); } else { - if (span != null) { - span.stop(); - if (savedSpan != null - && span.getParents().contains(savedSpan.getSpanId())) { - this.publisher.publishEvent( - new SpanReleasedEvent(this, savedSpan, span)); - SpanContextHolder.setCurrentSpan(savedSpan); - } - else { - if (!span.isRemote()) { - this.publisher.publishEvent(new SpanReleasedEvent(this, span)); - } - SpanContextHolder.removeCurrentSpan(); - } + span.stop(); + if (savedSpan != null && span.getParents().contains(savedSpan.getSpanId())) { + this.publisher.publishEvent(new SpanReleasedEvent(this, savedSpan, span)); + SpanContextHolder.setCurrentSpan(savedSpan); } else { + if (!span.isRemote()) { + this.publisher.publishEvent(new SpanReleasedEvent(this, span)); + } SpanContextHolder.removeCurrentSpan(); } } @@ -148,7 +140,7 @@ public class DefaultTracer implements Tracer { protected Span createChild(Span parent, String name) { long id = createId(); if (parent == null) { - MilliSpan span = MilliSpan.builder().begin(System.currentTimeMillis()) + Span span = Span.builder().begin(System.currentTimeMillis()) .name(name).traceId(id).spanId(id).build(); this.publisher.publishEvent(new SpanAcquiredEvent(this, span)); return span; @@ -158,7 +150,7 @@ public class DefaultTracer implements Tracer { Span span = createSpan(null, parent); SpanContextHolder.setCurrentSpan(span); } - MilliSpan span = MilliSpan.builder().begin(System.currentTimeMillis()) + Span span = Span.builder().begin(System.currentTimeMillis()) .name(name).traceId(parent.getTraceId()).parent(parent.getSpanId()) .spanId(id).processId(parent.getProcessId()).build(); this.publisher.publishEvent(new SpanAcquiredEvent(this, parent, span)); @@ -181,7 +173,7 @@ public class DefaultTracer implements Tracer { } protected Span createSpan(Span saved, Span span) { - return new MilliSpan(span, saved); + return new Span(span, saved); } @Override diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java index f3f4d537a..7ccfd59eb 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/DefaultTraceManagerTests.java @@ -67,12 +67,12 @@ public class DefaultTraceManagerTests { DefaultTracer traceManager = new DefaultTracer(new IsTracingSampler(), new Random(), publisher); - Span trace = traceManager.startTrace(CREATE_SIMPLE_TRACE, new AlwaysSampler()); + Span span = traceManager.startTrace(CREATE_SIMPLE_TRACE, new AlwaysSampler()); try { importantWork1(traceManager); } finally { - traceManager.close(trace); + traceManager.close(span); } verify(publisher, times(NUM_SPANS)).publishEvent(isA(SpanAcquiredEvent.class)); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/MilliSpanTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/MilliSpanTests.java deleted file mode 100644 index e9a348bef..000000000 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/MilliSpanTests.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2013-2015 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.sleuth; - -import org.junit.Test; - -import java.util.Collections; - -/** - * @author Rob Winch - * @author Spencer Gibb - */ -public class MilliSpanTests { - - @Test(expected = UnsupportedOperationException.class) - public void getAnnotationsReadOnly() { - MilliSpan span = new MilliSpan(1, 2, "name", 1L, Collections.emptyList(), 2L, true, true, "process"); - - span.tags().put("a", "b"); - } - - - @Test(expected = UnsupportedOperationException.class) - public void getTimelineAnnotationsReadOnly() { - MilliSpan span = new MilliSpan(1, 2, "name", 1L, Collections.emptyList(), 2L, true, true, "process"); - - span.logs().add(new Log(1, "1")); - } -} \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/SpanTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/SpanTest.java index 1f4e341fc..4326257df 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/SpanTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/SpanTest.java @@ -2,10 +2,14 @@ package org.springframework.cloud.sleuth; import org.junit.Test; +import java.util.Collections; + import static org.assertj.core.api.BDDAssertions.then; /** * @author Marcin Grzejszczak + * @author Rob Winch + * @author Spencer Gibb */ public class SpanTest { @@ -13,7 +17,7 @@ public class SpanTest { public void should_convert_long_to_hex_string() throws Exception { long someLong = 123123L; - String hexString = Span.IdConverter.toHex(someLong); + String hexString = Span.toHex(someLong); then(hexString).isEqualTo("1e0f3"); } @@ -22,13 +26,27 @@ public class SpanTest { public void should_convert_hex_string_to_long() throws Exception { String hexString = "1e0f3"; - long someLong = Span.IdConverter.fromHex(hexString); + long someLong = Span.fromHex(hexString); then(someLong).isEqualTo(123123L); } @Test(expected = IllegalArgumentException.class) public void should_throw_exception_when_null_string_is_to_be_converted_to_long() throws Exception { - Span.IdConverter.fromHex(null); + Span.fromHex(null); + } + + @Test(expected = UnsupportedOperationException.class) public void getAnnotationsReadOnly() { + Span span = new Span(1, 2, "name", 1L, Collections.emptyList(), 2L, true, + true, "process"); + + span.tags().put("a", "b"); + } + + @Test(expected = UnsupportedOperationException.class) public void getTimelineAnnotationsReadOnly() { + Span span = new Span(1, 2, "name", 1L, Collections.emptyList(), 2L, true, + true, "process"); + + span.logs().add(new Log(1, "1")); } } \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java index 5966d88cc..bf154592a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceCallableTests.java @@ -34,15 +34,15 @@ public class TraceCallableTests { @Test public void should_not_see_same_trace_id_in_successive_tasks() throws Exception { - Span firstTrace = givenCallableGetsSubmitted( + Span firstSpan = givenCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - Span secondTrace = whenCallableGetsSubmitted( + Span secondSpan = whenCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - then(secondTrace.getTraceId()) - .isNotEqualTo(firstTrace.getTraceId()); - then(secondTrace.getSavedSpan()).isNull(); + then(secondSpan.getTraceId()) + .isNotEqualTo(firstSpan.getTraceId()); + then(secondSpan.getSavedSpan()).isNull(); } @Test @@ -50,10 +50,10 @@ public class TraceCallableTests { throws Exception { givenCallableGetsSubmitted(thatRetrievesTraceFromThreadLocal()); - Span secondTrace = whenNonTraceableCallableGetsSubmitted( + Span secondSpan = whenNonTraceableCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - then(secondTrace).isNull(); + then(secondSpan).isNull(); } @Test @@ -64,10 +64,10 @@ public class TraceCallableTests { then(parent).as("parent").isNotNull(); then(child.getSavedSpan()).isEqualTo(parent); - Span secondTrace = whenNonTraceableCallableGetsSubmitted( + Span secondSpan = whenNonTraceableCallableGetsSubmitted( thatRetrievesTraceFromThreadLocal()); - then(secondTrace).isNull(); + then(secondSpan).isNull(); } private Span givenSpanIsAlreadyActive() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceRunnableTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceRunnableTests.java index c23dee40a..14017a032 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceRunnableTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/TraceRunnableTests.java @@ -1,23 +1,23 @@ package org.springframework.cloud.sleuth.instrument; -import static org.assertj.core.api.BDDAssertions.then; - -import java.util.Random; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEventPublisher; +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.springframework.cloud.sleuth.assertions.SleuthAssertions.then; + @RunWith(MockitoJUnitRunner.class) public class TraceRunnableTests { @@ -27,7 +27,7 @@ public class TraceRunnableTests { @After public void cleanup() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test @@ -36,19 +36,19 @@ public class TraceRunnableTests { // given TraceKeepingRunnable traceKeepingRunnable = runnableThatRetrievesTraceFromThreadLocal(); givenRunnableGetsSubmitted(traceKeepingRunnable); - Trace firstTrace = traceKeepingRunnable.trace; - then(firstTrace).as("first trace").isNotNull(); + Span firstSpan = traceKeepingRunnable.span; + then(firstSpan).as("first span").isNotNull(); // when whenRunnableGetsSubmitted(traceKeepingRunnable); // then - Trace secondTrace = traceKeepingRunnable.trace; - then(secondTrace.getSpan().getTraceId()).as("second trace id") - .isNotEqualTo(firstTrace.getSpan().getTraceId()).as("first trace id"); + Span secondSpan = traceKeepingRunnable.span; + then(secondSpan.getTraceId()).as("second span id") + .isNotEqualTo(firstSpan.getTraceId()).as("first span id"); // and - then(secondTrace.getSaved()).as("saved trace as remnant of first trace") + then(secondSpan.getSavedSpan()).as("saved span as remnant of first span") .isNull(); } @@ -58,15 +58,15 @@ public class TraceRunnableTests { // given TraceKeepingRunnable traceKeepingRunnable = runnableThatRetrievesTraceFromThreadLocal(); givenRunnableGetsSubmitted(traceKeepingRunnable); - Trace firstTrace = traceKeepingRunnable.trace; - then(firstTrace).as("expected trace").isNotNull(); + Span firstSpan = traceKeepingRunnable.span; + then(firstSpan).as("expected span").isNotNull(); // when whenNonTraceableRunnableGetsSubmitted(traceKeepingRunnable); // then - Trace secondTrace = traceKeepingRunnable.trace; - then(secondTrace).as("unexpected trace").isNull(); + Span secondSpan = traceKeepingRunnable.span; + then(secondSpan).as("unexpected span").isNull(); } private TraceKeepingRunnable runnableThatRetrievesTraceFromThreadLocal() { @@ -87,11 +87,11 @@ public class TraceRunnableTests { } static class TraceKeepingRunnable implements Runnable { - public Trace trace; + public Span span; @Override public void run() { - this.trace = TraceContextHolder.getCurrentTrace(); + this.span = SpanContextHolder.getCurrentSpan(); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/executor/TraceableExecutorServiceTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/executor/TraceableExecutorServiceTests.java index f95ac3be1..934353bdd 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/executor/TraceableExecutorServiceTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/executor/TraceableExecutorServiceTests.java @@ -1,7 +1,18 @@ package org.springframework.cloud.sleuth.instrument.executor; -import static java.util.stream.Collectors.toList; -import static org.assertj.core.api.BDDAssertions.then; +import lombok.SneakyThrows; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.sampler.AlwaysSampler; +import org.springframework.cloud.sleuth.trace.DefaultTracer; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; +import org.springframework.context.ApplicationEventPublisher; import java.util.ArrayList; import java.util.List; @@ -12,21 +23,8 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; -import org.springframework.cloud.sleuth.Tracer; -import org.springframework.cloud.sleuth.sampler.AlwaysSampler; -import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; -import org.springframework.context.ApplicationEventPublisher; - -import lombok.SneakyThrows; +import static java.util.stream.Collectors.toList; +import static org.assertj.core.api.BDDAssertions.then; @RunWith(MockitoJUnitRunner.class) public class TraceableExecutorServiceTests { @@ -42,7 +40,7 @@ public class TraceableExecutorServiceTests { public void setup() { this.tracer = new DefaultTracer(new AlwaysSampler(), new Random(), this.publisher); this.traceManagerableExecutorService = new TraceableExecutorService(this.executorService, this.tracer); - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @After @@ -50,17 +48,17 @@ public class TraceableExecutorServiceTests { this.tracer = null; this.traceManagerableExecutorService.shutdown(); this.executorService.shutdown(); - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test @SneakyThrows public void should_propagate_trace_id_and_set_new_span_when_traceable_executor_service_is_executed() { - Trace trace = this.tracer.startTrace("PARENT"); + Span span = this.tracer.startTrace("PARENT"); CompletableFuture.allOf(runnablesExecutedViaTraceManagerableExecutorService()).get(); - this.tracer.close(trace); + this.tracer.close(span); - then(this.spanVerifyingRunnable.traceIds.stream().distinct().collect(toList())).containsOnly(trace.getSpan().getTraceId()); + then(this.spanVerifyingRunnable.traceIds.stream().distinct().collect(toList())).containsOnly(span.getTraceId()); then(this.spanVerifyingRunnable.spanIds.stream().distinct().collect(toList())).hasSize(TOTAL_THREADS); } @@ -79,7 +77,7 @@ public class TraceableExecutorServiceTests { @Override public void run() { - Span span = TraceContextHolder.getCurrentSpan(); + Span span = SpanContextHolder.getCurrentSpan(); this.traceIds.add(span.getTraceId()); this.spanIds.add(span.getSpanId()); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java index 6b3f4b6a3..718bc7a1a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java @@ -6,7 +6,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; @@ -40,13 +39,13 @@ public class TraceCommandTests { public void should_remove_span_from_thread_local_after_finishing_work() throws Exception { SpanContextHolder.removeCurrentSpan(); - Span firstTraceFromHystrix = givenACommandWasExecuted(traceReturningCommand()); + Span firstSpanFromHystrix = givenACommandWasExecuted(traceReturningCommand()); - Span secondTraceFromHystrix = whenCommandIsExecuted(traceReturningCommand()); + Span secondSpanFromHystrix = whenCommandIsExecuted(traceReturningCommand()); - then(secondTraceFromHystrix.getTraceId()).as("second trace id") - .isNotEqualTo(firstTraceFromHystrix.getTraceId()).as("first trace id"); - then(secondTraceFromHystrix.getSavedSpan()).as("saved trace as remnant of first trace") + then(secondSpanFromHystrix.getTraceId()).as("second span id") + .isNotEqualTo(firstSpanFromHystrix.getTraceId()).as("first span id"); + then(secondSpanFromHystrix.getSavedSpan()).as("saved span as remnant of first span") .isNull(); } @@ -55,10 +54,10 @@ public class TraceCommandTests { givenATraceIsPresentInTheCurrentThread(); TraceCommand command = traceReturningCommand(); - Span traceFromCommand = whenCommandIsExecuted(command); + Span spanFromCommand = whenCommandIsExecuted(command); - then(traceFromCommand).as("Span from the Hystrix Thread").isNotNull(); - then(traceFromCommand.getTraceId()).isEqualTo(EXPECTED_TRACE_ID); + then(spanFromCommand).as("Span from the Hystrix Thread").isNotNull(); + then(spanFromCommand.getTraceId()).isEqualTo(EXPECTED_TRACE_ID); } @After @@ -67,7 +66,8 @@ public class TraceCommandTests { } private Span givenATraceIsPresentInTheCurrentThread() { - return this.tracer.joinTrace("test", MilliSpan.builder().traceId(EXPECTED_TRACE_ID).build()); + return this.tracer + .joinTrace("test", Span.builder().traceId(EXPECTED_TRACE_ID).build()); } private TraceCommand traceReturningCommand() { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceStompIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceStompIntegrationTests.java index 01efe7457..b56c04fa1 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceStompIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/AbstractTraceStompIntegrationTests.java @@ -1,21 +1,21 @@ package org.springframework.cloud.sleuth.instrument.integration; -import static org.assertj.core.api.BDDAssertions.then; - import org.junit.After; import org.junit.Before; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.messaging.Message; import org.springframework.messaging.support.ExecutorSubscribableChannel; import org.springframework.messaging.support.GenericMessage; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.assertj.core.api.BDDAssertions.then; + @RunWith(SpringJUnit4ClassRunner.class) public abstract class AbstractTraceStompIntegrationTests { @@ -34,11 +34,11 @@ public abstract class AbstractTraceStompIntegrationTests { @After public void close() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); this.channel.unsubscribe(this.stompMessageHandler); } - Trace givenALocallyStartedSpan() { + Span givenALocallyStartedSpan() { return this.tracer.startTrace("testSendMessage", this.sampler); } @@ -52,13 +52,13 @@ public abstract class AbstractTraceStompIntegrationTests { } Long thenSpanIdFromHeadersIsNotEmpty() { - Long header = getValueFromHeaders(Trace.SPAN_ID_NAME, Long.class); + Long header = getValueFromHeaders(Span.SPAN_ID_NAME, Long.class); then(header).as("Span id should not be empty").isNotNull(); return header; } Long thenTraceIdFromHeadersIsNotEmpty() { - Long header = getValueFromHeaders(Trace.TRACE_ID_NAME, Long.class); + Long header = getValueFromHeaders(Span.TRACE_ID_NAME, Long.class); then(header).as("Trace id should not be empty").isNotNull(); return header; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java index 4b078f428..3d1d8bb57 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceChannelInterceptorTests.java @@ -47,7 +47,10 @@ import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.BDDAssertions.then; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; /** * @author Dave Syer @@ -113,7 +116,8 @@ public class TraceChannelInterceptorTests implements MessageHandler { String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); assertNotNull("spanId was null", spanId); - long traceId = Span.IdConverter.fromHex(this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); + long traceId = Span + .fromHex(this.message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); then(traceId).isEqualTo(10L); then(spanId).isNotEqualTo(20L); assertNull(SpanContextHolder.getCurrentSpan()); @@ -135,10 +139,10 @@ public class TraceChannelInterceptorTests implements MessageHandler { @Test public void headerCreation() { - Span trace = this.tracer.startTrace("testSendMessage", + Span span = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.channel.send(MessageBuilder.withPayload("hi").build()); - this.tracer.close(trace); + this.tracer.close(span); assertNotNull("message was null", this.message); String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); @@ -152,10 +156,10 @@ public class TraceChannelInterceptorTests implements MessageHandler { // TODO: Refactor to parametrized test together with sending messages via channel @Test public void headerCreationViaMessagingTemplate() { - Span trace = this.tracer.startTrace("testSendMessage", + Span span = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.messagingTemplate.send(MessageBuilder.withPayload("hi").build()); - this.tracer.close(trace); + this.tracer.close(span); assertNotNull("message was null", this.message); String spanId = this.message.getHeaders().get(Span.SPAN_ID_NAME, String.class); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java index 631a1a621..978e9e023 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceContextPropagationChannelInterceptorTests.java @@ -65,19 +65,21 @@ public class TraceContextPropagationChannelInterceptorTests { @Test public void testSpanPropagation() { - Span trace = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); + Span span = this.tracer.startTrace("testSendMessage", new AlwaysSampler()); this.channel.send(MessageBuilder.withPayload("hi").build()); - Long expectedSpanId = trace.getSpanId(); - this.tracer.close(trace); + Long expectedSpanId = span.getSpanId(); + this.tracer.close(span); Message message = this.channel.receive(0); assertNotNull("message was null", message); - Long spanId = Span.IdConverter.fromHex(message.getHeaders().get(Span.SPAN_ID_NAME, String.class)); + Long spanId = Span + .fromHex(message.getHeaders().get(Span.SPAN_ID_NAME, String.class)); assertEquals("spanId was wrong", expectedSpanId, spanId); - long traceId = Span.IdConverter.fromHex(message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); + long traceId = Span + .fromHex(message.getHeaders().get(Span.TRACE_ID_NAME, String.class)); assertNotNull("traceId was null", traceId); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java index 1383347b9..200bd5a5f 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageChannelInterceptorTests.java @@ -49,16 +49,16 @@ public class TraceStompMessageChannelInterceptorTests extends AbstractTraceStomp @Test public void should_propagate_headers_when_message_was_sent_during_local_span_starting() { - Span trace = givenALocallyStartedSpan(); + Span span = givenALocallyStartedSpan(); Message message = givenMessageToBeSampled(); whenTheMessageWasSent(message); - this.tracer.close(trace); + this.tracer.close(span); Long spanId = thenSpanIdFromHeadersIsNotEmpty(); long traceId = thenTraceIdFromHeadersIsNotEmpty(); - then(traceId).isEqualTo(trace.getTraceId()); - then(spanId).isEqualTo(trace.getSpanId()); + then(traceId).isEqualTo(span.getTraceId()); + then(spanId).isEqualTo(span.getSpanId()); then(SpanContextHolder.getCurrentSpan()).isNull(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java index 01e7f395f..e7c73546d 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/integration/TraceStompMessageContextPropagationChannelInterceptorTests.java @@ -28,12 +28,12 @@ public class TraceStompMessageContextPropagationChannelInterceptorTests extends @Test public void should_propagate_span_information() { - Span trace = givenALocallyStartedSpan(); + Span span = givenALocallyStartedSpan(); Message m = givenMessageToBeSampled(); whenTheMessageWasSent(m); - Long expectedTraceId = trace.getTraceId(); - this.tracer.close(trace); + Long expectedTraceId = span.getTraceId(); + this.tracer.close(span); thenReceivedMessageIsNotNull(); long traceId = thenTraceIdFromHeadersIsNotEmpty(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java index 0069c4843..69157d80c 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java @@ -1,9 +1,5 @@ package org.springframework.cloud.sleuth.instrument.web; -import static org.assertj.core.api.BDDAssertions.then; - -import java.util.Random; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +15,10 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder; +import java.util.Random; + +import static org.assertj.core.api.BDDAssertions.then; + @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(TraceFilterIntegrationTests.class) @DefaultTestAutoConfiguration @@ -66,12 +66,12 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { throws Exception { return this.mockMvc .perform(MockMvcRequestBuilders.get("/ping").accept(MediaType.TEXT_PLAIN) - .header(headerName, Span.IdConverter.toHex(passedCorrelationId)) - .header(Span.SPAN_ID_NAME, Span.IdConverter.toHex(new Random().nextLong()))) + .header(headerName, Span.toHex(passedCorrelationId)) + .header(Span.SPAN_ID_NAME, Span.toHex(new Random().nextLong()))) .andReturn(); } private Long tracingHeaderFrom(MvcResult mvcResult) { - return Span.IdConverter.fromHex(mvcResult.getResponse().getHeader(Span.TRACE_ID_NAME)); + return Span.fromHex(mvcResult.getResponse().getHeader(Span.TRACE_ID_NAME)); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index 6a8028254..fedcc440f 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -63,7 +63,7 @@ public class TraceFilterTests { private MockHttpServletRequest request; private MockHttpServletResponse response; private MockFilterChain filterChain; - private Sampler sampler = new AlwaysSampler(); + private Sampler sampler = new AlwaysSampler(); @Before @SneakyThrows @@ -72,8 +72,8 @@ public class TraceFilterTests { this.tracer = new DefaultTracer(new DelegateSampler(), new Random(), this.publisher) { @Override - protected Span createSpan(Span trace, Span span) { - TraceFilterTests.this.span = super.createSpan(trace, span); + protected Span createSpan(Span saved, Span span) { + TraceFilterTests.this.span = super.createSpan(saved, span); return TraceFilterTests.this.span; } }; @@ -113,8 +113,8 @@ public class TraceFilterTests { @Test public void continuesSpanInRequestAttr() throws Exception { - Span trace = this.tracer.startTrace("foo"); - this.request.setAttribute(TraceFilter.TRACE_REQUEST_ATTR, trace); + Span span = this.tracer.startTrace("foo"); + this.request.setAttribute(TraceFilter.TRACE_REQUEST_ATTR, span); TraceFilter filter = new TraceFilter(this.tracer, this.traceKeys); filter.doFilter(this.request, this.response, this.filterChain); @@ -214,7 +214,7 @@ public class TraceFilterTests { } } - private class DelegateSampler implements Sampler { + private class DelegateSampler implements Sampler { @Override public boolean next() { return TraceFilterTests.this.sampler.next(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/FeignTraceTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/FeignTraceTests.java index 88a48ab65..e065b2c48 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/FeignTraceTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/FeignTraceTests.java @@ -1,12 +1,8 @@ package org.springframework.cloud.sleuth.instrument.web.client; -import static org.assertj.core.api.BDDAssertions.then; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - +import com.netflix.loadbalancer.BaseLoadBalancer; +import com.netflix.loadbalancer.ILoadBalancer; +import com.netflix.loadbalancer.Server; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,13 +14,11 @@ import org.springframework.boot.test.WebIntegrationTest; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; -import org.springframework.cloud.sleuth.Trace; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.event.ClientReceivedEvent; import org.springframework.cloud.sleuth.event.ClientSentEvent; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.ApplicationEvent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -38,9 +32,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import com.netflix.loadbalancer.BaseLoadBalancer; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.Server; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import static org.assertj.core.api.BDDAssertions.then; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = { FeignTraceTests.TestConfiguration.class }) @@ -59,7 +56,7 @@ public class FeignTraceTests { @After public void close() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); this.listener.getEvents().clear(); } @@ -69,7 +66,7 @@ public class FeignTraceTests { ResponseEntity response = this.testFeignInterface.getNoTrace(); // then - then(getHeader(response, Trace.TRACE_ID_NAME)).isNotNull(); + then(getHeader(response, Span.TRACE_ID_NAME)).isNotNull(); then(this.listener.getEvents()).isNotEmpty(); } @@ -78,14 +75,14 @@ public class FeignTraceTests { // given Long currentTraceId = 1L; Long currentParentId = 2L; - this.tracer.continueSpan(MilliSpan.builder().traceId(currentTraceId) + this.tracer.continueSpan(Span.builder().traceId(currentTraceId) .spanId(generatedId()).parent(currentParentId).build()); // when ResponseEntity response = this.testFeignInterface.getTraceId(); // then - then(Span.IdConverter.fromHex(getHeader(response, Trace.TRACE_ID_NAME))).isEqualTo(currentTraceId); + then(Span.fromHex(getHeader(response, Span.TRACE_ID_NAME))).isEqualTo(currentTraceId); then(this.listener.getEvents().size()).isEqualTo(2); } @@ -148,15 +145,15 @@ public class FeignTraceTests { @RequestMapping(value = "/notrace", method = RequestMethod.GET) public String notrace( - @RequestHeader(name = Trace.TRACE_ID_NAME, required = false) String traceId) { + @RequestHeader(name = Span.TRACE_ID_NAME, required = false) String traceId) { then(traceId).isNotNull(); return "OK"; } @RequestMapping(value = "/traceid", method = RequestMethod.GET) - public String traceId(@RequestHeader(Trace.TRACE_ID_NAME) String traceId, - @RequestHeader(Trace.SPAN_ID_NAME) String spanId, - @RequestHeader(Trace.PARENT_ID_NAME) String parentId) { + public String traceId(@RequestHeader(Span.TRACE_ID_NAME) String traceId, + @RequestHeader(Span.SPAN_ID_NAME) String spanId, + @RequestHeader(Span.PARENT_ID_NAME) String parentId) { then(traceId).isNotEmpty(); then(parentId).isNotEmpty(); then(spanId).isNotEmpty(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java index 098e95c0f..1c9c8c19a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java @@ -16,22 +16,13 @@ package org.springframework.cloud.sleuth.instrument.web.client; -import static org.assertj.core.api.BDDAssertions.then; -import static org.junit.Assert.assertFalse; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.springframework.cloud.sleuth.MilliSpan; -import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.trace.DefaultTracer; -import org.springframework.cloud.sleuth.trace.TraceContextHolder; +import org.springframework.cloud.sleuth.trace.SpanContextHolder; import org.springframework.context.support.StaticApplicationContext; import org.springframework.http.HttpHeaders; import org.springframework.http.client.ClientHttpRequestInterceptor; @@ -43,6 +34,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import static org.assertj.core.api.BDDAssertions.then; +import static org.junit.Assert.assertFalse; + /** * @author Dave Syer * @@ -65,22 +64,22 @@ public class TraceRestTemplateInterceptorTests { this.traces = new DefaultTracer(new AlwaysSampler(), new Random(), this.publisher); this.template.setInterceptors(Arrays.asList( new TraceRestTemplateInterceptor(this.traces))); - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @After public void clean() { - TraceContextHolder.removeCurrentTrace(); + SpanContextHolder.removeCurrentSpan(); } @Test public void headersAddedWhenTracing() { - this.traces.continueSpan(MilliSpan.builder().traceId(1L).spanId(2L).build()); + this.traces.continueSpan(Span.builder().traceId(1L).spanId(2L).build()); @SuppressWarnings("unchecked") Map headers = this.template.getForEntity("/", Map.class) .getBody(); - then(Long.valueOf(headers.get(Trace.TRACE_ID_NAME))).isEqualTo(1L); - then(Long.valueOf(headers.get(Trace.SPAN_ID_NAME))).isEqualTo(2L); + then(Long.valueOf(headers.get(Span.TRACE_ID_NAME))).isEqualTo(1L); + then(Long.valueOf(headers.get(Span.SPAN_ID_NAME))).isEqualTo(2L); } @Test @@ -88,7 +87,7 @@ public class TraceRestTemplateInterceptorTests { @SuppressWarnings("unchecked") Map headers = this.template.getForEntity("/", Map.class) .getBody(); - assertFalse("Wrong headers: " + headers, headers.containsKey(Trace.SPAN_ID_NAME)); + assertFalse("Wrong headers: " + headers, headers.containsKey(Span.SPAN_ID_NAME)); } @RestController @@ -96,8 +95,8 @@ public class TraceRestTemplateInterceptorTests { @RequestMapping("/") public Map home(@RequestHeader HttpHeaders headers) { Map map = new HashMap(); - addHeaders(map, headers, Trace.SPAN_ID_NAME, Trace.TRACE_ID_NAME, - Trace.PARENT_ID_NAME); + addHeaders(map, headers, Span.SPAN_ID_NAME, Span.TRACE_ID_NAME, + Span.PARENT_ID_NAME); return map; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/JsonLogSpanListenerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/JsonLogSpanListenerTests.java index f8ad2a534..2fa8f834b 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/JsonLogSpanListenerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/JsonLogSpanListenerTests.java @@ -16,18 +16,19 @@ package org.springframework.cloud.sleuth.log; -import static org.junit.Assert.*; - import org.junit.Rule; import org.junit.Test; import org.springframework.boot.test.OutputCapture; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.event.SpanReleasedEvent; import org.springframework.util.StringUtils; import java.io.IOException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + /** * @author Spencer Gibb */ @@ -38,7 +39,7 @@ public class JsonLogSpanListenerTests { @Test public void jsonSpanIsOnOneLine() throws IOException { JsonLogSpanListener listener = new JsonLogSpanListener(); - Span span = MilliSpan.builder() + Span span = Span.builder() .name("testSpan") .spanId(1L) .parent(2L) @@ -61,7 +62,7 @@ public class JsonLogSpanListenerTests { assertFalse("json contains linefeed", output.contains("\n")); assertFalse("json contains carriage return", output.contains("\r")); - MilliSpan read = listener.getObjectMapper().readValue(json, MilliSpan.class); + Span read = listener.getObjectMapper().readValue(json, Span.class); assertEquals("span not equals", read, span); } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSamplerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSamplerTests.java index d8969010a..50740044d 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSamplerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/sampler/PercentageBasedSamplerTests.java @@ -1,15 +1,14 @@ package org.springframework.cloud.sleuth.sampler; -import static org.assertj.core.api.BDDAssertions.then; -import static org.assertj.core.data.Percentage.withPercentage; - import org.junit.Test; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.TraceAccessor; import java.util.Random; +import static org.assertj.core.api.BDDAssertions.then; +import static org.assertj.core.data.Percentage.withPercentage; + public class PercentageBasedSamplerTests { SamplerConfiguration samplerConfiguration = new SamplerConfiguration(); @@ -59,7 +58,7 @@ public class PercentageBasedSamplerTests { return new TraceAccessor() { @Override public Span getCurrentSpan() { - return MilliSpan.builder().traceId(RANDOM.nextLong()).build(); + return Span.builder().traceId(RANDOM.nextLong()).build(); } @Override diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java index 58687696b..339f9e2b4 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/template/TraceTemplateTests.java @@ -26,19 +26,19 @@ public class TraceTemplateTests { @Test public void should_pass_trace_to_the_callback_if_tracing_is_active() { - Span initialTrace = this.tracer.startTrace("test"); + Span initialSpan = this.tracer.startTrace("test"); TraceTemplate traceTemplate = new TraceTemplate(this.tracer); - Span traceFromCallback = whenTraceCallbackReturningCurrentTraceIsExecuted(traceTemplate); + Span spanFromCallback = whenTraceCallbackReturningCurrentTraceIsExecuted(traceTemplate); - then(traceFromCallback).isNotNull(); - then(traceFromCallback.getTraceId()).isEqualTo(initialTrace.getTraceId()); + then(spanFromCallback).isNotNull(); + then(spanFromCallback.getTraceId()).isEqualTo(initialSpan.getTraceId()); } private Span whenTraceCallbackReturningCurrentTraceIsExecuted(TraceTemplate traceTemplate) { return traceTemplate.trace(new TraceCallback() { @Override - public Span doInTrace(Span trace) { + public Span doInTrace(Span span) { return SpanContextHolder.getCurrentSpan(); } }); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleMessagingApplication.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleMessagingApplication.java index b89f583a7..081068f44 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleMessagingApplication.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleMessagingApplication.java @@ -49,7 +49,7 @@ public class SampleMessagingApplication { private SampleRequestResponse transformer; @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-ribbon/src/main/java/sample/SampleRibbonApplication.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-ribbon/src/main/java/sample/SampleRibbonApplication.java index 7993591ad..21be87a57 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-ribbon/src/main/java/sample/SampleRibbonApplication.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-ribbon/src/main/java/sample/SampleRibbonApplication.java @@ -39,7 +39,7 @@ import com.github.kristofa.brave.SpanCollector; public class SampleRibbonApplication { @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java index 6e75dcf89..ed28050ef 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleController.java @@ -93,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Span trace = this.tracer.startTrace("customTraceEndpoint", + Span span = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); @@ -102,7 +102,7 @@ ApplicationListener { String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); - this.tracer.close(trace); + this.tracer.close(span); return "traced/" + s; } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleSleuthApplication.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleSleuthApplication.java index 8312ad842..0dea467c7 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleSleuthApplication.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/main/java/sample/SampleSleuthApplication.java @@ -35,7 +35,7 @@ public class SampleSleuthApplication { public static final String CLIENT_NAME = "testApp"; @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java index 024e3885e..39bebdec8 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/RequestSendingRunnable.java @@ -17,7 +17,11 @@ package tools; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.sleuth.Span; -import org.springframework.http.*; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.net.URI; @@ -52,7 +56,7 @@ public class RequestSendingRunnable implements Runnable { private RequestEntity requestWithTraceId(long traceId) { HttpHeaders headers = new HttpHeaders(); - headers.add(Span.TRACE_ID_NAME, Span.IdConverter.toHex(traceId)); + headers.add(Span.TRACE_ID_NAME, Span.toHex(traceId)); URI uri = URI.create(url); RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, uri); log.info("Request [" + requestEntity + "] is ready"); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java index 7b565aa5f..b83abba32 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java @@ -24,7 +24,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.boot.test.WebIntegrationTest; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.stream.Host; import org.springframework.cloud.sleuth.stream.SleuthSink; @@ -60,7 +59,7 @@ public class ZipkinStreamTests extends AbstractIntegrationTest { await().until(zipkinServerIsUp()); long traceId = new Random().nextLong(); - Span span = MilliSpan.builder().traceId(traceId).spanId(traceId).name("test") + Span span = Span.builder().traceId(traceId).spanId(traceId).name("test") .build(); span.tag(getRequiredBinaryAnnotationName(), "10131"); diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java index 6e75dcf89..ed28050ef 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java @@ -93,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Span trace = this.tracer.startTrace("customTraceEndpoint", + Span span = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); @@ -102,7 +102,7 @@ ApplicationListener { String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); - this.tracer.close(trace); + this.tracer.close(span); return "traced/" + s; } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleZipkinApplication.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleZipkinApplication.java index 683837b72..03b942f3f 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleZipkinApplication.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleZipkinApplication.java @@ -39,7 +39,7 @@ public class SampleZipkinApplication { public static final String CLIENT_NAME = "testApp"; @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java index 6e75dcf89..ed28050ef 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java @@ -93,7 +93,7 @@ ApplicationListener { @SneakyThrows @RequestMapping("/traced") public String traced() { - Span trace = this.tracer.startTrace("customTraceEndpoint", + Span span = this.tracer.startTrace("customTraceEndpoint", new AlwaysSampler()); int millis = random.nextInt(1000); log.info("Sleeping for {} millis", millis); @@ -102,7 +102,7 @@ ApplicationListener { String s = this.restTemplate.getForObject("http://localhost:" + this.port + "/call", String.class); - this.tracer.close(trace); + this.tracer.close(span); return "traced/" + s; } diff --git a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/ServerPropertiesHostLocatorTests.java b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/ServerPropertiesHostLocatorTests.java index 9d76e5c5c..130b9e869 100644 --- a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/ServerPropertiesHostLocatorTests.java +++ b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/ServerPropertiesHostLocatorTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.stream; import org.junit.Test; import org.springframework.boot.autoconfigure.web.ServerProperties; -import org.springframework.cloud.sleuth.MilliSpan; +import org.springframework.cloud.sleuth.Span; import java.net.InetAddress; import java.net.UnknownHostException; @@ -27,7 +27,8 @@ import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; public class ServerPropertiesHostLocatorTests { - MilliSpan span = new MilliSpan(1, 3, "name", 1L, Collections.emptyList(), 2L, true, true, "process"); + Span span = new Span(1, 3, "name", 1L, Collections.emptyList(), 2L, true, true, + "process"); @Test public void portDefaultsTo8080() { diff --git a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java index 5f3522332..2aeef5b65 100644 --- a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java +++ b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/StreamSpanListenerTests.java @@ -16,19 +16,11 @@ package org.springframework.cloud.sleuth.stream; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.PostConstruct; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; @@ -50,6 +42,12 @@ import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.Message; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + /** * @author Dave Syer * @@ -84,7 +82,7 @@ public class StreamSpanListenerTests { @Test public void rpcAnnotations() { - Span parent = MilliSpan.builder().traceId(1L).name("parent").remote(true) + Span parent = Span.builder().traceId(1L).name("parent").remote(true) .build(); Span context = this.tracer.joinTrace("child", parent); this.application.publishEvent(new ClientSentEvent(this, context)); @@ -99,7 +97,7 @@ public class StreamSpanListenerTests { @Test public void nullSpanName() { - Span context = this.tracer.startTrace(null, (Sampler) null); + Span context = this.tracer.startTrace(null, null); this.application.publishEvent(new ClientSentEvent(this, context)); this.tracer.close(context); assertEquals(1, this.test.spans.size()); @@ -128,7 +126,7 @@ public class StreamSpanListenerTests { } @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); } diff --git a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java index 57e13ec82..287a2ca27 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java +++ b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.sleuth.zipkin.stream; import org.junit.Test; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.stream.Host; import org.springframework.cloud.sleuth.stream.Spans; @@ -36,7 +35,7 @@ public class SamplingZipkinSpanIteratorTests { @Test public void skipsInputSpans() { - Spans spans = new Spans(host, Arrays.asList(span("message/sleuth"))); + Spans spans = new Spans(host, Collections.singletonList(span("message/sleuth"))); Iterator result = new SamplingZipkinSpanIterator(Sampler.create(1.0f), spans); @@ -71,6 +70,7 @@ public class SamplingZipkinSpanIteratorTests { Span span(String name) { Long id = new Random().nextLong(); - return new MilliSpan(1, 3, name, id, Collections.emptyList(), id, true, true, "process"); + return new Span(1, 3, name, id, Collections.emptyList(), id, true, true, + "process"); } } \ No newline at end of file diff --git a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java index 30757f0d8..b7878729c 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java +++ b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java @@ -21,13 +21,14 @@ import zipkin.BinaryAnnotation; import zipkin.Endpoint; import org.junit.Test; -import org.springframework.cloud.sleuth.MilliSpan; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.stream.Host; import static org.assertj.core.api.Assertions.assertThat; public class ZipkinMessageListenerTests { - MilliSpan span = new MilliSpan(1, 3, "name", 1L, Collections.emptyList(), 2L, true, true, "process"); + Span span = new Span(1, 3, "name", 1L, Collections.emptyList(), 2L, true, true, + "process"); Host host = new Host("myservice", "1.2.3.4", 8080); Endpoint endpoint = Endpoint.create("myservice", 1 << 24 | 2 << 16 | 3 << 8 | 4, 8080); @@ -79,7 +80,7 @@ public class ZipkinMessageListenerTests { // TODO: "unknown" bc process id, documented as not nullable, is null in some tests. @Test public void nullProcessIdCoercesToUnknownServiceName() { - MilliSpan noProcessId = MilliSpan.builder().traceId(1L).name("parent").remote(true).build(); + Span noProcessId = Span.builder().traceId(1L).name("parent").remote(true).build(); zipkin.Span result = ZipkinMessageListener.convert(noProcessId, host); diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java index f604798c0..bcfc8e8aa 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java @@ -16,20 +16,11 @@ package org.springframework.cloud.sleuth.zipkin; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.PostConstruct; - import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.sleuth.MilliSpan; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; @@ -46,6 +37,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; + /** * @author Dave Syer * @@ -71,7 +69,7 @@ public class ZipkinSpanListenerTests { this.test.spans.clear(); } - Span parent = MilliSpan.builder().traceId(1L).name("parent").remote(true).build(); + Span parent = Span.builder().traceId(1L).name("parent").remote(true).build(); /** Sleuth timestamps are millisecond granularity while zipkin is microsecond. */ @Test @@ -148,7 +146,7 @@ public class ZipkinSpanListenerTests { private List spans = new ArrayList<>(); @Bean - public Sampler defaultSampler() { + public Sampler defaultSampler() { return new AlwaysSampler(); }