Allow customizing the base Propagation.Factory (#1156)

* Add a customizer interface, not a huge fan of the class names

* Allow an optional factory builder to be passed

* Put imports back

* Add autoconfig test

* Faster tests and better coverage

* Better class name
This commit is contained in:
Brian Devins-Suresh
2018-12-14 03:33:40 -05:00
committed by Marcin Grzejszczak
parent 99c426ad76
commit 4afb5836e8
2 changed files with 69 additions and 2 deletions

View File

@@ -71,6 +71,9 @@ public class TraceAutoConfiguration {
@Autowired(required = false)
List<CurrentTraceContext.ScopeDecorator> scopeDecorators = new ArrayList<>();
@Autowired(required = false)
ExtraFieldPropagation.FactoryBuilder extraFieldPropagationFactoryBuilder;
@Bean
@ConditionalOnMissingBean
// NOTE: stable bean name as might be used outside sleuth
@@ -126,8 +129,14 @@ public class TraceAutoConfiguration {
&& sleuthProperties.getPropagationKeys().isEmpty()) {
return B3Propagation.FACTORY;
}
ExtraFieldPropagation.FactoryBuilder factoryBuilder = ExtraFieldPropagation
.newFactoryBuilder(B3Propagation.FACTORY);
ExtraFieldPropagation.FactoryBuilder factoryBuilder;
if (extraFieldPropagationFactoryBuilder != null) {
factoryBuilder = extraFieldPropagationFactoryBuilder;
}
else {
factoryBuilder = ExtraFieldPropagation
.newFactoryBuilder(B3Propagation.FACTORY);
}
if (!sleuthProperties.getBaggageKeys().isEmpty()) {
factoryBuilder = factoryBuilder
// for HTTP

View File

@@ -0,0 +1,58 @@
package org.springframework.cloud.sleuth.autoconfig;
import brave.propagation.B3Propagation;
import brave.propagation.B3SinglePropagation;
import brave.propagation.ExtraFieldPropagation;
import brave.propagation.Propagation;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class TraceAutoConfigurationPropagationCustomizationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class));
@Test
public void stillCreatesDefault() {
this.contextRunner.run((context) -> {
BDDAssertions.then(context.getBean(Propagation.Factory.class))
.isEqualTo(B3Propagation.FACTORY);
});
}
@Test
public void allowsCustomization() {
this.contextRunner
.withPropertyValues("spring.sleuth.baggage-keys=my-baggage")
.run((context) -> {
BDDAssertions.then(context.getBean(Propagation.Factory.class))
.hasFieldOrPropertyWithValue("delegate", B3Propagation.FACTORY);
});
}
@Test
public void allowsCustomizationOfBuilder() {
this.contextRunner
.withPropertyValues("spring.sleuth.baggage-keys=my-baggage")
.withUserConfiguration(CustomPropagationFactoryBuilderConfig.class)
.run((context) -> {
BDDAssertions.then(context.getBean(Propagation.Factory.class))
.hasFieldOrPropertyWithValue("delegate", B3SinglePropagation.FACTORY);
});
}
@Configuration
static class CustomPropagationFactoryBuilderConfig {
@Bean
public ExtraFieldPropagation.FactoryBuilder factoryBuilder() {
return ExtraFieldPropagation.newFactoryBuilder(B3SinglePropagation.FACTORY);
}
}
}