From 198dbb4a45554db18eaaadded81574a9a3f8378d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 12 Dec 2023 11:13:50 +0100 Subject: [PATCH] Auto-configure observatibility beans in sliced tests If @AutoConfigureObservability is applied to a sliced test, it auto-configures: - An in-memory MeterRegistry - A no-op Tracer - An ObservationRegistry Closes gh-38568 --- .../src/docs/asciidoc/features/testing.adoc | 11 ++++ .../AutoConfigureObservability.java | 15 +++-- ...ability.AutoConfigureObservability.imports | 13 +++++ ...reObservabilitySlicedIntegrationTests.java | 58 +++++++++++++++++++ 4 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability.imports create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservabilitySlicedIntegrationTests.java diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc index d39d902b31b..24bcf0d1ee4 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/testing.adoc @@ -255,6 +255,11 @@ If such test needs access to an `MBeanServer`, consider marking it dirty as well include::code:MyJmxTests[] +[[features.testing.spring-boot-applications.observations]] +==== Using Observations +If you annotate <> with `@AutoConfigureObservability`, it auto-configures an `ObservationRegistry`. + + [[features.testing.spring-boot-applications.metrics]] ==== Using Metrics @@ -262,6 +267,9 @@ Regardless of your classpath, meter registries, except the in-memory backed, are If you need to export metrics to a different backend as part of an integration test, annotate it with `@AutoConfigureObservability`. +If you annotate <> with `@AutoConfigureObservability`, it auto-configures an in-memory `MeterRegistry`. +Data exporting in sliced tests is not supported with the `@AutoConfigureObservability` annotation. + [[features.testing.spring-boot-applications.tracing]] @@ -272,6 +280,9 @@ If you need those components as part of an integration test, annotate the test w If you have created your own reporting components (e.g. a custom `SpanExporter` or `SpanHandler`) and you don't want them to be active in tests, you can use the `@ConditionalOnEnabledTracing` annotation to disable them. +If you annotate <> with `@AutoConfigureObservability`, it auto-configures a no-op `Tracer`. +Data exporting in sliced tests is not supported with the `@AutoConfigureObservability` annotation. + [[features.testing.spring-boot-applications.mocking-beans]] diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservability.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservability.java index fb16e8d1032..746d0a747d9 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservability.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservability.java @@ -23,9 +23,15 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; + /** * Annotation that can be applied to a test class to enable auto-configuration for * observability. + *

+ * If this annotation is applied to a sliced test, an in-memory {@code MeterRegistry}, a + * no-op {@code Tracer} and an {@code ObservationRegistry} is added to the application + * context. * * @author Moritz Halbritter * @since 3.0.0 @@ -34,17 +40,18 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited +@ImportAutoConfiguration public @interface AutoConfigureObservability { /** - * Whether metrics should be enabled in the test. - * @return whether metrics should be enabled in the test + * Whether metrics should be reported to external systems in the test. + * @return whether metrics should be reported to external systems in the test */ boolean metrics() default true; /** - * Whether tracing should be enabled in the test. - * @return whether tracing should be enabled in the test + * Whether traces should be reported to external systems in the test. + * @return whether traces should be reported to external systems in the test */ boolean tracing() default true; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability.imports b/spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability.imports new file mode 100644 index 00000000000..af374669f52 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability.imports @@ -0,0 +1,13 @@ +# AutoConfigureObservability auto-configuration imports + +# Observation +org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration + +# Metrics +org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration +org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration +org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration + +# Tracing +org.springframework.boot.actuate.autoconfigure.tracing.NoopTracerAutoConfiguration +org.springframework.boot.actuate.autoconfigure.tracing.MicrometerTracingAutoConfiguration diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservabilitySlicedIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservabilitySlicedIntegrationTests.java new file mode 100644 index 00000000000..4b73857da05 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/actuate/observability/AutoConfigureObservabilitySlicedIntegrationTests.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.actuate.observability; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.observation.ObservationRegistry; +import io.micrometer.tracing.Tracer; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.ApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link AutoConfigureObservability} when used on a sliced test. + * + * @author Moritz Halbritter + */ +@WebMvcTest +@AutoConfigureObservability +class AutoConfigureObservabilitySlicedIntegrationTests { + + @Autowired + private ApplicationContext context; + + @Test + void shouldHaveTracer() { + assertThat(this.context.getBean(Tracer.class)).isEqualTo(Tracer.NOOP); + } + + @Test + void shouldHaveMeterRegistry() { + assertThat(this.context.getBean(MeterRegistry.class)).isInstanceOf(SimpleMeterRegistry.class); + } + + @Test + void shouldHaveObservationRegistry() { + assertThat(this.context.getBean(ObservationRegistry.class)).isNotNull(); + } + +}