Removed Trace

This commit is contained in:
Marcin Grzejszczak
2016-01-19 12:38:04 +01:00
committed by Marcin Grzejszczak
parent 9bcab5b0c6
commit 797ca4f50c
44 changed files with 382 additions and 435 deletions

View File

@@ -45,12 +45,32 @@ public class MilliSpan implements Span {
private final String processId;
@Singular
private final List<Log> 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<Long> 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<Long> 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;
}
}

View File

@@ -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<String> 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.
* <p/>
@@ -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();
}

View File

@@ -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<String> 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);
}
}

View File

@@ -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
*/
<T> Trace startTrace(String name, Sampler<T> sampler);
<T> Span startTrace(String name, Sampler<T> 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);
<V> Callable<V> wrap(Callable<V> callable);

View File

@@ -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,

View File

@@ -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<V> extends TraceDelegate<Callable<V>> implements Call
@Override
public V call() throws Exception {
ensureThatThreadIsNotPollutedByPreviousTraces();
Trace trace = startSpan();
Span trace = startSpan();
try {
return this.getDelegate().call();
}

View File

@@ -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<T> {
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<T> {
}
protected void ensureThatThreadIsNotPollutedByPreviousTraces() {
TraceContextHolder.removeCurrentTrace();
SpanContextHolder.removeCurrentSpan();
}
}

View File

@@ -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<Runnable> implements Runnable {
@Override
public void run() {
ensureThatThreadIsNotPollutedByPreviousTraces();
Trace trace = startSpan();
Span trace = startSpan();
try {
this.getDelegate().run();
}

View File

@@ -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<R> extends HystrixCommand<R> {
@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<R> extends HystrixCommand<R> {
// TODO: Do more analysis why this is not removed properly
private void enforceThatHystrixThreadIsNotPollutedByPreviousTraces() {
TraceContextHolder.removeCurrentTrace();
SpanContextHolder.removeCurrentSpan();
}
public abstract R doRun() throws Exception;

View File

@@ -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<Trace> ORIGINAL_CONTEXT = new ThreadLocal<>();
private final static ThreadLocal<Span> 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<String, Object> 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);
}

View File

@@ -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();
}

View File

@@ -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.
*
* <p>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()));
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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));
}

View File

@@ -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));
}

View File

@@ -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));
}

View File

@@ -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);
}
}

View File

@@ -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<Void> {
@Override
public boolean next() {
return TraceContextHolder.isTracing();
return SpanContextHolder.isTracing();
}
}

View File

@@ -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> {
T doInTrace(Trace trace);
T doInTrace(Span trace);
}

View File

@@ -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 <T> Trace startTrace(String name, Sampler<T> s) {
public <T> Span startTrace(String name, Sampler<T> 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

View File

@@ -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<Trace> currentTrace = new NamedThreadLocal<>("Trace Context");
public static Trace getCurrentTrace() {
return currentTrace.get();
}
private static final ThreadLocal<Span> 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;
}
}

View File

@@ -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()));
}

View File

@@ -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<Trace> thatRetrievesTraceFromThreadLocal() {
return new Callable<Trace>() {
private Callable<Span> thatRetrievesTraceFromThreadLocal() {
return new Callable<Span>() {
@Override
public Trace call() throws Exception {
return TraceContextHolder.getCurrentTrace();
public Span call() throws Exception {
return SpanContextHolder.getCurrentSpan();
}
};
}
private Trace givenCallableGetsSubmitted(Callable<Trace> callable)
private Span givenCallableGetsSubmitted(Callable<Span> callable)
throws InterruptedException, java.util.concurrent.ExecutionException {
return whenCallableGetsSubmitted(callable);
}
private Trace whenCallableGetsSubmitted(Callable<Trace> callable)
private Span whenCallableGetsSubmitted(Callable<Span> callable)
throws InterruptedException, java.util.concurrent.ExecutionException {
return this.executor.submit(new TraceCallable<>(this.tracer, callable))
.get();
}
private Trace whenNonTraceableCallableGetsSubmitted(Callable<Trace> callable)
private Span whenNonTraceableCallableGetsSubmitted(Callable<Span> callable)
throws InterruptedException, java.util.concurrent.ExecutionException {
return this.executor.submit(callable).get();
}

View File

@@ -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() {

View File

@@ -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<Trace> command = traceReturningCommand();
TraceCommand<Span> 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<Trace> traceReturningCommand() {
return new TraceCommand<Trace>(this.tracer, withGroupKey(asKey(""))
private TraceCommand<Span> traceReturningCommand() {
return new TraceCommand<Span>(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<Trace> command) {
private Span whenCommandIsExecuted(TraceCommand<Span> command) {
return command.execute();
}
private Trace givenACommandWasExecuted(TraceCommand<Trace> command) {
private Span givenACommandWasExecuted(TraceCommand<Span> command) {
return whenCommandIsExecuted(command);
}
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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() {

View File

@@ -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 {

View File

@@ -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() {

View File

@@ -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));
}
}

View File

@@ -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());
}
}

View File

@@ -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() {

View File

@@ -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<Trace>() {
private Span whenTraceCallbackReturningCurrentTraceIsExecuted(TraceTemplate traceTemplate) {
return traceTemplate.trace(new TraceCallback<Span>() {
@Override
public Trace doInTrace(Trace trace) {
return TraceContextHolder.getCurrentTrace();
public Span doInTrace(Span trace) {
return SpanContextHolder.getCurrentSpan();
}
});
}

View File

@@ -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<EmbeddedServletContainerInitializedEvent> {
@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);

View File

@@ -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");

View File

@@ -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<EmbeddedServletContainerInitializedEvent> {
@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);

View File

@@ -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<EmbeddedServletContainerInitializedEvent> {
@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);

View File

@@ -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();
}
};
}

View File

@@ -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();

View File

@@ -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());
}