diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryObservationConvention.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryObservationConvention.java index 53e035b8..c99d21ab 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryObservationConvention.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryObservationConvention.java @@ -16,6 +16,7 @@ package org.springframework.cloud.config.server.environment; +import io.micrometer.common.KeyValue; import io.micrometer.common.KeyValues; import io.micrometer.common.docs.KeyName; import io.micrometer.observation.Observation; @@ -35,21 +36,20 @@ class ObservationEnvironmentRepositoryObservationConvention @Override public KeyValues getLowCardinalityKeyValues(ObservationEnvironmentRepositoryContext context) { KeyValues keyValues = KeyValues.empty(); - keyValues = appendIfPresent(keyValues, DocumentedConfigObservation.LowCardinalityTags.ENVIRONMENT_CLASS, + keyValues = appendWithValueOrUseDefault(keyValues, + DocumentedConfigObservation.LowCardinalityTags.ENVIRONMENT_CLASS, context.getEnvironmentRepositoryClass().getName()); - keyValues = appendIfPresent(keyValues, DocumentedConfigObservation.LowCardinalityTags.LABEL, + keyValues = appendWithValueOrUseDefault(keyValues, DocumentedConfigObservation.LowCardinalityTags.LABEL, context.getLabel()); - keyValues = appendIfPresent(keyValues, DocumentedConfigObservation.LowCardinalityTags.PROFILE, + keyValues = appendWithValueOrUseDefault(keyValues, DocumentedConfigObservation.LowCardinalityTags.PROFILE, context.getProfile()); - return appendIfPresent(keyValues, DocumentedConfigObservation.LowCardinalityTags.APPLICATION, + return appendWithValueOrUseDefault(keyValues, DocumentedConfigObservation.LowCardinalityTags.APPLICATION, context.getApplication()); } - private KeyValues appendIfPresent(KeyValues keyValues, KeyName profile, String value) { - if (StringUtils.hasText(value)) { - keyValues = keyValues.and(profile.withValue(value)); - } - return keyValues; + private KeyValues appendWithValueOrUseDefault(KeyValues keyValues, KeyName keyName, String value) { + value = StringUtils.hasText(value) ? value : KeyValue.NONE_VALUE; + return keyValues.and(keyName.withValue(value)); } @Override diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapperTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapperTests.java index 0e72d6e4..fcdefbdf 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapperTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapperTests.java @@ -18,6 +18,7 @@ package org.springframework.cloud.config.server.environment; import java.util.Arrays; +import io.micrometer.common.KeyValue; import io.micrometer.observation.Observation; import io.micrometer.observation.tck.TestObservationRegistry; import org.junit.jupiter.api.Test; @@ -70,6 +71,50 @@ class ObservationEnvironmentRepositoryWrapperTests { }); } + @Test + void shouldCreateRootObservationForCompositeWithDefaultValues() { + TestObservationRegistry registry = TestObservationRegistry.create(); + EnvironmentRepository delegate = new MyEnvRepo(); + EnvironmentRepository composite = new CompositeEnvironmentRepository(Arrays.asList(delegate), registry, true); + EnvironmentRepository wrapper = ObservationEnvironmentRepositoryWrapper.wrap(registry, composite); + + wrapper.findOne("foo", "bar", null); + + assertThat(registry).hasHandledContextsThatSatisfy(contexts -> { + contexts.stream() + .filter(context -> context.getName().equals("spring.cloud.config.environment.find") + && contextExists(context, "spring.cloud.config.environment.class", + "org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository") + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.label") + .getValue() + .equals(KeyValue.NONE_VALUE) + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.application") + .getValue() + .equals("foo") + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.profile") + .getValue() + .equals("bar")) + .findFirst() + .orElseThrow( + () -> new AssertionError("There's no observation for the Composite EnvironmentRepository")); + contexts.stream() + .filter(context -> context.getName().equals("spring.cloud.config.environment.find") && contextExists( + context, "spring.cloud.config.environment.class", + "org.springframework.cloud.config.server.environment.ObservationEnvironmentRepositoryWrapperTests$MyEnvRepo") + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.label") + .getValue() + .equals(KeyValue.NONE_VALUE) + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.application") + .getValue() + .equals("foo") + && context.getLowCardinalityKeyValue("spring.cloud.config.environment.profile") + .getValue() + .equals("bar")) + .findFirst() + .orElseThrow(() -> new AssertionError("There's no observation for the wrapped EnvironmentRepository")); + }); + } + private boolean contextExists(Observation.Context context, String tagName, String tagValue) { return context.getLowCardinalityKeyValues() .stream()