diff --git a/pom.xml b/pom.xml index c590183137..4ae672d6c8 100644 --- a/pom.xml +++ b/pom.xml @@ -160,6 +160,7 @@ spring-security-rest spring-security-x509 spring-session + spring-sleuth spring-social-login spring-spel spring-thymeleaf diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml new file mode 100644 index 0000000000..80415dc00d --- /dev/null +++ b/spring-sleuth/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + com.baeldung + spring-sleuth + 1.0.0-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 1.4.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.cloud + spring-cloud-dependencies + Camden.SR3 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + \ No newline at end of file diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java new file mode 100644 index 0000000000..70d4270b41 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SchedulingService.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +public class SchedulingService { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + + @Autowired + public SchedulingService(SleuthService sleuthService) { + this.sleuthService = sleuthService; + } + + @Scheduled(fixedDelay = 30000) + public void scheduledWork() throws InterruptedException { + logger.info("Start some work from the scheduled task"); + sleuthService.asyncMethod(); + logger.info("End work from scheduled task"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java new file mode 100644 index 0000000000..eeaed15bea --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthController.java @@ -0,0 +1,71 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.Executor; + +@RestController +public class SleuthController { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SleuthService sleuthService; + private final Executor executor; + + @Autowired + public SleuthController(SleuthService sleuthService, Executor executor) { + this.sleuthService = sleuthService; + this.executor = executor; + } + + @GetMapping("/") + public String helloSleuth() { + logger.info("Hello Sleuth"); + return "success"; + } + + @GetMapping("/same-span") + public String helloSleuthSameSpan() throws InterruptedException { + logger.info("Same Span"); + sleuthService.doSomeWorkSameSpan(); + return "success"; + } + + @GetMapping("/new-span") + public String helloSleuthNewSpan() throws InterruptedException { + logger.info("New Span"); + sleuthService.doSomeWorkNewSpan(); + return "success"; + } + + @GetMapping("/new-thread") + public String helloSleuthNewThread() { + logger.info("New Thread"); + Runnable runnable = () -> { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + logger.info("I'm inside the new thread - with a new span"); + }; + executor.execute(runnable); + + logger.info("I'm done - with the original span"); + return "success"; + } + + @GetMapping("/async") + public String helloSleuthAsync() throws InterruptedException { + logger.info("Before Async Method Call"); + sleuthService.asyncMethod(); + logger.info("After Async Method Call"); + return "success"; + } + + + +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java new file mode 100644 index 0000000000..38480a9b91 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthService.java @@ -0,0 +1,46 @@ +package com.baeldung.spring.session; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +public class SleuthService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private final Tracer tracer; + + @Autowired + public SleuthService(Tracer tracer) { + this.tracer = tracer; + } + + public void doSomeWorkSameSpan() throws InterruptedException { + Thread.sleep(1000L); + logger.info("Doing some work"); + } + + public void doSomeWorkNewSpan() throws InterruptedException { + logger.info("I'm in the original span"); + + Span newSpan = tracer.createSpan("newSpan"); + try { + Thread.sleep(1000L); + logger.info("I'm in the new span doing some cool work that needs its own span"); + } finally { + tracer.close(newSpan); + } + + logger.info("I'm in the original span"); + } + + @Async + public void asyncMethod() throws InterruptedException { + logger.info("Start Async Method"); + Thread.sleep(1000L); + logger.info("End Async Method"); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java new file mode 100644 index 0000000000..eb57231f53 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/SleuthWebApp.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.session; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SleuthWebApp { + public static void main(String[] args) { + SpringApplication.run(SleuthWebApp.class, args); + } +} diff --git a/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java new file mode 100644 index 0000000000..56cabee443 --- /dev/null +++ b/spring-sleuth/src/main/java/com/baeldung/spring/session/ThreadConfig.java @@ -0,0 +1,56 @@ +package com.baeldung.spring.session; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.sleuth.instrument.async.LazyTraceExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurerSupport; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +@Configuration +@EnableAsync +@EnableScheduling +public class ThreadConfig extends AsyncConfigurerSupport implements SchedulingConfigurer{ + + @Autowired + private BeanFactory beanFactory; + + @Bean + public Executor executor() { + return makeExecutor(); + } + + @Override + public Executor getAsyncExecutor() { + return makeExecutor(); + } + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + scheduledTaskRegistrar.setScheduler(schedulingExecutor()); + } + + @Bean(destroyMethod = "shutdown") + public Executor schedulingExecutor() { + return Executors.newScheduledThreadPool(100); + } + + private Executor makeExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + threadPoolTaskExecutor.setCorePoolSize(5); + threadPoolTaskExecutor.setMaxPoolSize(10); + threadPoolTaskExecutor.initialize(); + + return new LazyTraceExecutor(beanFactory, threadPoolTaskExecutor); + } + + +} diff --git a/spring-sleuth/src/main/resources/application.properties b/spring-sleuth/src/main/resources/application.properties new file mode 100644 index 0000000000..2678b57b0c --- /dev/null +++ b/spring-sleuth/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=Baeldung Sleuth Tutorial \ No newline at end of file