diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanHolder.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanHolder.java
index 2735c7700..8efd31be1 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanHolder.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanHolder.java
@@ -19,4 +19,8 @@ public class SpanHolder {
}
currentSpan.set(span);
}
+
+ public static boolean isTracing() {
+ return currentSpan.get() != null;
+ }
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceAutoConfiguration.java
index 7d7c4cd6b..a46b743b7 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceAutoConfiguration.java
@@ -20,6 +20,7 @@ public class TraceAutoConfiguration {
}
@Bean
+ @ConditionalOnMissingBean
public Sampler defaultSampler() {
return new IsTracingSampler();
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/scheduling/TraceSchedulingAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/scheduling/TraceSchedulingAutoConfiguration.java
index f0e31e71c..7c8900ddd 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/scheduling/TraceSchedulingAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/scheduling/TraceSchedulingAutoConfiguration.java
@@ -4,6 +4,8 @@ package org.springframework.cloud.sleuth.scheduling;
* @author Spencer Gibb
*/
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.sleuth.Trace;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -21,6 +23,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
@EnableAspectJAutoProxy
+@ConditionalOnClass(ProceedingJoinPoint.class)
public class TraceSchedulingAutoConfiguration {
@Bean
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/slf4j/Slf4jSpanStartListener.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/slf4j/Slf4jSpanStartListener.java
index ebf1c090e..98ab81ace 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/slf4j/Slf4jSpanStartListener.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/slf4j/Slf4jSpanStartListener.java
@@ -16,7 +16,8 @@ public class Slf4jSpanStartListener implements SpanStartListener {
@Override
public void startSpan(Span span) {
//TODO: what log level?
- log.info("Starting span with id: [{}]", span.getSpanId());
+ log.info("Starting span: {}", span);
MDC.put(Trace.SPAN_ID_NAME, span.getSpanId());
+ MDC.put(Trace.TRACE_ID_NAME, span.getTraceId());
}
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceWebAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceWebAutoConfiguration.java
index df7719d21..bc815172e 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceWebAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/TraceWebAutoConfiguration.java
@@ -17,8 +17,10 @@ package org.springframework.cloud.sleuth.web;
import java.util.regex.Pattern;
+import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
@@ -26,6 +28,7 @@ import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.cloud.sleuth.Trace;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.util.StringUtils;
/**
@@ -37,8 +40,10 @@ import org.springframework.util.StringUtils;
* @author Spencer Gibb
*/
@Configuration
+@EnableAspectJAutoProxy
@ConditionalOnProperty(value = "spring.cloud.sleuth.trace.web.enabled", matchIfMissing = true)
@ConditionalOnWebApplication
+@ConditionalOnClass(ProceedingJoinPoint.class)
public class TraceWebAutoConfiguration {
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/client/TraceRestTemplateInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/client/TraceRestTemplateInterceptor.java
index 4dc7b9332..ba61ec3cc 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/client/TraceRestTemplateInterceptor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/web/client/TraceRestTemplateInterceptor.java
@@ -42,15 +42,15 @@ public class TraceRestTemplateInterceptor implements ClientHttpRequestIntercepto
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
- if (!request.getHeaders().containsKey(SPAN_ID_NAME)) {
- request.getHeaders().add(SPAN_ID_NAME,
- SpanHolder.getCurrentSpan().getSpanId());
- }
- if (!request.getHeaders().containsKey(TRACE_ID_NAME)) {
- request.getHeaders().add(TRACE_ID_NAME,
- SpanHolder.getCurrentSpan().getSpanId());
- }
+ setHeader(request, SPAN_ID_NAME, SpanHolder.getCurrentSpan().getSpanId());
+ setHeader(request, TRACE_ID_NAME, SpanHolder.getCurrentSpan().getTraceId());
return execution.execute(request, body);
}
+ public void setHeader(HttpRequest request, String spanIdName, String spanId) {
+ if (!request.getHeaders().containsKey(spanIdName) && SpanHolder.isTracing()) {
+ request.getHeaders().add(spanIdName, spanId);
+ }
+ }
+
}
diff --git a/spring-cloud-sleuth-sample/pom.xml b/spring-cloud-sleuth-sample/pom.xml
index 012281b99..4b6422b47 100644
--- a/spring-cloud-sleuth-sample/pom.xml
+++ b/spring-cloud-sleuth-sample/pom.xml
@@ -49,6 +49,10 @@
org.springframework.cloud
spring-cloud-sleuth-core
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
org.projectlombok
lombok
diff --git a/spring-cloud-sleuth-sample/src/main/java/org/springframework/cloud/sleuth/sample/SampleApplication.java b/spring-cloud-sleuth-sample/src/main/java/org/springframework/cloud/sleuth/sample/SampleApplication.java
index f235a9cdf..90b1f9d88 100644
--- a/spring-cloud-sleuth-sample/src/main/java/org/springframework/cloud/sleuth/sample/SampleApplication.java
+++ b/spring-cloud-sleuth-sample/src/main/java/org/springframework/cloud/sleuth/sample/SampleApplication.java
@@ -9,11 +9,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
+import org.springframework.cloud.sleuth.Sampler;
import org.springframework.cloud.sleuth.Trace;
import org.springframework.cloud.sleuth.TraceScope;
import org.springframework.cloud.sleuth.sampler.AlwaysSampler;
import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@@ -23,50 +26,63 @@ import org.springframework.web.client.RestTemplate;
*/
@Configuration
@EnableAutoConfiguration
-@RestController
+@EnableAspectJAutoProxy
@Slf4j
-public class SampleApplication implements
- ApplicationListener {
+public class SampleApplication {
public static final String CLIENT_NAME = "testApp";
- @Autowired
- private RestTemplate restTemplate;
- @Autowired
- private Trace trace;
- private int port;
+ @RestController
+ protected static class SampleController implements
+ ApplicationListener {
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private Trace trace;
+ private int port;
- @SneakyThrows
- @RequestMapping("/")
- public String hi() {
- final Random random = new Random();
- Thread.sleep(random.nextInt(1000));
+ @SneakyThrows
+ @RequestMapping("/")
+ public String hi() {
+ final Random random = new Random();
+ Thread.sleep(random.nextInt(1000));
- String s = restTemplate.getForObject("http://localhost:" + port + "/hi2",
- String.class);
- return "hi/" + s;
+ String s = restTemplate.getForObject("http://localhost:" + port + "/hi2",
+ String.class);
+ return "hi/" + s;
+ }
+
+ @SneakyThrows
+ @RequestMapping("/hi2")
+ public String hi2() {
+ final Random random = new Random();
+ Thread.sleep(random.nextInt(1000));
+ return "hi2";
+ }
+
+ @SneakyThrows
+ @RequestMapping("/traced")
+ public String traced() {
+ TraceScope scope = trace.startSpan("customTraceEndpoint", new AlwaysSampler());
+ final Random random = new Random();
+ int millis = random.nextInt(1000);
+ log.info("Sleeping for {} millis", millis);
+ Thread.sleep(millis);
+
+ String s = restTemplate.getForObject("http://localhost:" + port + "/hi2", String.class);
+ scope.close();
+ return "hi/" + s;
+ }
+
+ @Override
+ public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
+ port = event.getEmbeddedServletContainer().getPort();
+ }
}
- @SneakyThrows
- @RequestMapping("/hi2")
- public String hi2() {
- final Random random = new Random();
- Thread.sleep(random.nextInt(1000));
- return "hi2";
- }
-
- @SneakyThrows
- @RequestMapping("/traced")
- public String traced() {
- TraceScope scope = trace.startSpan("customTraceEndpoint", new AlwaysSampler());
- final Random random = new Random();
- int millis = random.nextInt(1000);
- log.info("Sleeping for {} millis", millis);
- Thread.sleep(millis);
-
- String s = restTemplate.getForObject("http://localhost:" + port + "/hi2", String.class);
- scope.close();
- return "hi/"+s;
+ @Bean
+ public Sampler defaultSampler() {
+ return new AlwaysSampler();
}
public static void main(String[] args) {
@@ -78,8 +94,4 @@ public class SampleApplication implements
* }
*/
- @Override
- public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
- port = event.getEmbeddedServletContainer().getPort();
- }
}
diff --git a/spring-cloud-sleuth-sample/src/main/resources/logback.xml b/spring-cloud-sleuth-sample/src/main/resources/logback.xml
index 6ae7c6632..1698a3b29 100644
--- a/spring-cloud-sleuth-sample/src/main/resources/logback.xml
+++ b/spring-cloud-sleuth-sample/src/main/resources/logback.xml
@@ -3,8 +3,8 @@
-
-
+
+