Removed Trace
This commit is contained in:
committed by
Marcin Grzejszczak
parent
9bcab5b0c6
commit
797ca4f50c
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user