From 29cc2422ec2312eb3388daa30bd235678b0de28f Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Tue, 7 Apr 2020 11:36:21 +0800 Subject: [PATCH] Adds missing customizer config and backfills tests --- .../TraceBaggageAutoConfiguration.java | 10 +++ .../TraceBaggageAutoConfigurationTests.java | 76 ++++++++++++++++++- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfiguration.java index c108609c5..1279926fd 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfiguration.java @@ -26,6 +26,7 @@ import brave.baggage.BaggagePropagation; import brave.baggage.BaggagePropagationConfig.SingleBaggageField; import brave.baggage.BaggagePropagationCustomizer; import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; +import brave.baggage.CorrelationScopeCustomizer; import brave.baggage.CorrelationScopeDecorator; import brave.context.slf4j.MDCScopeDecorator; import brave.handler.FinishedSpanHandler; @@ -68,6 +69,9 @@ public class TraceBaggageAutoConfiguration { @Autowired(required = false) List baggagePropagationCustomizers = new ArrayList<>(); + @Autowired(required = false) + List correlationScopeCustomizers = new ArrayList<>(); + /** * To override the underlying context format, override this bean and set the delegate * to what you need. {@link BaggagePropagation.FactoryBuilder} will unwrap itself if @@ -183,11 +187,17 @@ public class TraceBaggageAutoConfiguration { "spring.sleuth.baggage.correlation-fields", sleuthBaggageProperties.getCorrelationFields()); + // Add fields from properties CorrelationScopeDecorator.Builder builder = MDCScopeDecorator.newBuilder(); for (String field : correlationFields) { builder.add(SingleCorrelationField.newBuilder(BaggageField.create(field)) .build()); } + + // handle user overrides + for (CorrelationScopeCustomizer customizer : this.correlationScopeCustomizers) { + customizer.customize(builder); + } return builder.build(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfigurationTests.java index 237f85708..ed749cdb3 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfigurationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/baggage/TraceBaggageAutoConfigurationTests.java @@ -17,10 +17,16 @@ package org.springframework.cloud.sleuth.baggage; import java.util.List; +import java.util.Set; import brave.baggage.BaggageField; +import brave.baggage.BaggageFields; import brave.baggage.BaggagePropagationConfig.SingleBaggageField; import brave.baggage.BaggagePropagationCustomizer; +import brave.baggage.CorrelationScopeConfig; +import brave.baggage.CorrelationScopeConfig.SingleCorrelationField; +import brave.baggage.CorrelationScopeCustomizer; +import brave.baggage.CorrelationScopeDecorator; import brave.handler.FinishedSpanHandler; import brave.propagation.Propagation; import org.assertj.core.api.AbstractListAssert; @@ -38,6 +44,7 @@ import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import static org.assertj.core.api.InstanceOfAssertFactories.array; public class TraceBaggageAutoConfigurationTests { @@ -102,7 +109,7 @@ public class TraceBaggageAutoConfigurationTests { } @Test - public void catCreateDeprecatedBaggageFieldsWithJavaConfig() { + public void canCreateDeprecatedBaggageFieldsWithJavaConfig() { this.contextRunner.withUserConfiguration(CustomBaggageConfiguration.class) .run((context) -> assertThatBaggageFieldNameToKeyNames(context) .containsOnly(tuple("country-code", new String[] { @@ -130,8 +137,7 @@ public class TraceBaggageAutoConfigurationTests { AssertableApplicationContext context) { return assertThat(context.getBean(FinishedSpanHandler.class)) .isInstanceOf(BaggageTagFinishedSpanHandler.class) - .extracting("fieldsToTag") - .asInstanceOf(InstanceOfAssertFactories.array(BaggageField[].class)) + .extracting("fieldsToTag").asInstanceOf(array(BaggageField[].class)) .extracting(BaggageField::name); } @@ -144,6 +150,70 @@ public class TraceBaggageAutoConfigurationTests { }); } + @Test + public void canAddOldCorrelationFieldsForLogScraping() { + this.contextRunner + .withUserConfiguration( + OldCorrelationFieldsForLogScrapingConfiguration.class) + .run((context) -> assertThat( + context.getBean(CorrelationScopeDecorator.class)) + .extracting("fields") + .asInstanceOf(array(SingleCorrelationField[].class)) + .extracting(SingleCorrelationField::name) + .containsExactly("traceId", "spanId", "parentId", + "spanExportable")); + } + + @Test + public void canMakeAllCorrelationFieldsDirty() { + this.contextRunner + .withPropertyValues( + "spring.sleuth.baggage.correlation-fields=country-code") + .withUserConfiguration(DirtyCorrelationFieldConfiguration.class) + .run((context) -> assertThat( + context.getBean(CorrelationScopeDecorator.class)) + .extracting("fields") + .asInstanceOf(array(SingleCorrelationField[].class)) + .filteredOn(c -> !c.readOnly()) + .extracting(SingleCorrelationField::dirty) + .containsExactly(true)); + } + + @Configuration + static class DirtyCorrelationFieldConfiguration { + + @Bean + CorrelationScopeCustomizer makeCorrelationFieldsDirty() { + return b -> { + Set configs = b.configs(); + b.clear(); + + for (CorrelationScopeConfig config : configs) { + if (config instanceof SingleCorrelationField) { + SingleCorrelationField field = (SingleCorrelationField) config; + if (!field.readOnly()) { + config = field.toBuilder().dirty().build(); + } + } + b.add(config); + } + }; + } + + } + + @Configuration + static class OldCorrelationFieldsForLogScrapingConfiguration { + + @Bean + CorrelationScopeCustomizer addParentAndSpanExportable() { + return b -> b.add(SingleCorrelationField.create(BaggageFields.PARENT_ID)) + .add(SingleCorrelationField.newBuilder(BaggageFields.SAMPLED) + .name("spanExportable").build()); + } + + } + @Configuration static class CustomBaggageConfiguration {