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