Skip to content
This repository has been archived by the owner on Jan 19, 2022. It is now read-only.

Commit

Permalink
Hide trace scheduler from spring sleuth (#2158) (#2166)
Browse files Browse the repository at this point in the history
Co-authored-by: JBodkin <[email protected]>
  • Loading branch information
elefeint and JBodkin authored Feb 3, 2020
1 parent 78a65dc commit 3407a53
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
package org.springframework.cloud.gcp.autoconfigure.trace;

import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

import javax.annotation.PreDestroy;

import brave.http.HttpClientParser;
import brave.http.HttpServerParser;
import brave.propagation.Propagation;
Expand Down Expand Up @@ -101,6 +104,8 @@ public class StackdriverTraceAutoConfiguration {

private UserAgentHeaderProvider headerProvider = new UserAgentHeaderProvider(this.getClass());

private ThreadPoolTaskScheduler defaultTraceSenderThreadPool;

public StackdriverTraceAutoConfiguration(GcpProjectIdProvider gcpProjectIdProvider,
CredentialsProvider credentialsProvider,
GcpTraceProperties gcpTraceProperties) throws IOException {
Expand All @@ -121,19 +126,21 @@ public SleuthProperties stackdriverSleuthProperties(SleuthProperties sleuthPrope
return sleuthProperties;
}

@Bean
@ConditionalOnMissingBean(name = "traceSenderThreadPool")
public ThreadPoolTaskScheduler traceSenderThreadPool(GcpTraceProperties traceProperties) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(traceProperties.getNumExecutorThreads());
scheduler.setThreadNamePrefix("gcp-trace-sender");
scheduler.setDaemon(true);
return scheduler;
}

@Bean
@ConditionalOnMissingBean(name = "traceExecutorProvider")
public ExecutorProvider traceExecutorProvider(@Qualifier("traceSenderThreadPool") ThreadPoolTaskScheduler scheduler) {
public ExecutorProvider traceExecutorProvider(GcpTraceProperties traceProperties, @Qualifier("traceSenderThreadPool") Optional<ThreadPoolTaskScheduler> userProvidedScheduler) {
ThreadPoolTaskScheduler scheduler;
if (userProvidedScheduler.isPresent()) {
scheduler = userProvidedScheduler.get();
}
else {
this.defaultTraceSenderThreadPool = new ThreadPoolTaskScheduler();
scheduler = this.defaultTraceSenderThreadPool;
scheduler.setPoolSize(traceProperties.getNumExecutorThreads());
scheduler.setThreadNamePrefix("gcp-trace-sender");
scheduler.setDaemon(true);
scheduler.initialize();
}
return FixedExecutorProvider.create(scheduler.getScheduledExecutor());
}

Expand Down Expand Up @@ -218,6 +225,13 @@ public Propagation.Factory stackdriverPropagation() {
return StackdriverTracePropagation.FACTORY;
}

@PreDestroy
public void closeScheduler() {
if (this.defaultTraceSenderThreadPool != null) {
this.defaultTraceSenderThreadPool.shutdown();
}
}

/**
* Configuration for Sleuth.
*/
Expand All @@ -242,4 +256,5 @@ HttpServerParser stackdriverHttpServerParser() {
return new StackdriverHttpServerParser();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import brave.Tracing;
import brave.http.HttpClientParser;
import brave.http.HttpServerParser;
import com.google.api.gax.core.CredentialsProvider;
import com.google.api.gax.core.ExecutorProvider;
import com.google.auth.Credentials;
import com.google.auth.RequestMetadataCallback;
import com.google.devtools.cloudtrace.v2.BatchWriteSpansRequest;
Expand Down Expand Up @@ -57,6 +59,7 @@
import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
import org.springframework.cloud.sleuth.log.SleuthLogAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
Expand Down Expand Up @@ -164,6 +167,29 @@ public void testAsyncReporterHealthCheck() {
});
}

@Test
public void defaultSchedulerUsedWhenNoneProvided() {
this.contextRunner
.run(context -> {
final ExecutorProvider executorProvider = context.getBean("traceExecutorProvider", ExecutorProvider.class);
assertThat(executorProvider.getExecutor()).isNotNull();
});
}

@Test
public void customSchedulerUsedWhenAvailable() {
ThreadPoolTaskScheduler threadPoolTaskSchedulerMock = mock(ThreadPoolTaskScheduler.class);
ScheduledExecutorService scheduledExecutorServiceMock = mock(ScheduledExecutorService.class);
when(threadPoolTaskSchedulerMock.getScheduledExecutor()).thenReturn(scheduledExecutorServiceMock);

this.contextRunner
.withBean("traceSenderThreadPool", ThreadPoolTaskScheduler.class, () -> threadPoolTaskSchedulerMock)
.run(context -> {
final ExecutorProvider executorProvider = context.getBean("traceExecutorProvider", ExecutorProvider.class);
assertThat(executorProvider.getExecutor()).isEqualTo(scheduledExecutorServiceMock);
});
}

/**
* Spring config for tests.
*/
Expand Down

0 comments on commit 3407a53

Please sign in to comment.