From c2b3b8b73c218f5b30d530443e967e767c579df3 Mon Sep 17 00:00:00 2001 From: bono007 Date: Sat, 10 Apr 2021 23:06:09 -0500 Subject: [PATCH 1/4] Add auto-configuration for Micrometer DiskSpaceMetrics Fixes gh-25996 --- .../metrics/JvmMetricsAutoConfiguration.java | 9 +++ .../JvmMetricsAutoConfigurationTests.java | 66 +++++++++++++------ .../asciidoc/production-ready-features.adoc | 3 +- 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java index 629e3dc8f32c..0f846f6692dc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java @@ -16,8 +16,11 @@ package org.springframework.boot.actuate.autoconfigure.metrics; +import java.io.File; + import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; +import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; @@ -66,4 +69,10 @@ public ClassLoaderMetrics classLoaderMetrics() { return new ClassLoaderMetrics(); } + @Bean + @ConditionalOnMissingBean + public DiskSpaceMetrics diskSpaceMetrics() { + return new DiskSpaceMetrics(new File(System.getProperty("user.dir"))); + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java index 72c39c9d3447..86a6df69f027 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java @@ -16,7 +16,10 @@ package org.springframework.boot.actuate.autoconfigure.metrics; +import java.io.File; + import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; +import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; @@ -24,7 +27,9 @@ import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,6 +40,7 @@ * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Chris Bono */ class JvmMetricsAutoConfigurationTests { @@ -43,41 +49,53 @@ class JvmMetricsAutoConfigurationTests { @Test void autoConfiguresJvmMetrics() { - this.contextRunner.run( - (context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class)); + this.contextRunner.run((context) -> validateBaseJvmMetricsBeansArePresent()); } @Test void allowsCustomJvmGcMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class) - .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasBean("customJvmGcMetrics") - .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) - .hasSingleBean(ClassLoaderMetrics.class)); + this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class).run((context) -> { + validateBaseJvmMetricsBeansArePresent(); + assertThat(context).hasBean("customJvmGcMetrics"); + }); } @Test void allowsCustomJvmMemoryMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class) - .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) - .hasSingleBean(JvmMemoryMetrics.class).hasBean("customJvmMemoryMetrics") - .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class)); + this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class).run((context) -> { + validateBaseJvmMetricsBeansArePresent(); + assertThat(context).hasBean("customJvmMemoryMetrics"); + }); } @Test void allowsCustomJvmThreadMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class) - .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) - .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) - .hasSingleBean(ClassLoaderMetrics.class).hasBean("customJvmThreadMetrics")); + this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class).run((context) -> { + validateBaseJvmMetricsBeansArePresent(); + assertThat(context).hasBean("customJvmThreadMetrics"); + }); } @Test void allowsCustomClassLoaderMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class) - .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) - .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) - .hasSingleBean(ClassLoaderMetrics.class).hasBean("customClassLoaderMetrics")); + this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class).run((context) -> { + validateBaseJvmMetricsBeansArePresent(); + assertThat(context).hasBean("customClassLoaderMetrics"); + }); + } + + @Test + void allowsCustomDiskSpaceMetricsToBeUsed() { + this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class).run((context) -> { + validateBaseJvmMetricsBeansArePresent(); + assertThat(context).hasBean("customDiskSpaceMetrics"); + }); + } + + private ContextConsumer validateBaseJvmMetricsBeansArePresent() { + return (context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) + .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class); } @Configuration(proxyBeanMethods = false) @@ -120,4 +138,14 @@ ClassLoaderMetrics customClassLoaderMetrics() { } + @Configuration(proxyBeanMethods = false) + static class CustomDiskSpaceMetricsConfiguration { + + @Bean + DiskSpaceMetrics customDiskSpaceMetrics() { + return new DiskSpaceMetrics(new File(System.getProperty("user.dir"))); + } + + } + } diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc index 8c3f8636f941..a6fb42987a39 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/production-ready-features.adoc @@ -2140,7 +2140,7 @@ In most situations, the out-of-the-box defaults will provide sensible metrics th [[production-ready-metrics-jvm]] ==== JVM Metrics Auto-configuration will enable JVM Metrics using core Micrometer classes. -JVM metrics are published under the `jvm.` meter name. +JVM metrics are published under the `jvm.` and `disk.` meter names. The following JVM metrics are provided: @@ -2148,6 +2148,7 @@ The following JVM metrics are provided: * Statistics related to garbage collection * Threads utilization * The Number of classes loaded/unloaded +* Disk space available From 7c3293c6f79c59ca783b2bc8c1180f80cd9d3693 Mon Sep 17 00:00:00 2001 From: bono007 Date: Sun, 11 Apr 2021 10:03:34 -0500 Subject: [PATCH 2/4] Fix tests to actually run the validation --- .../JvmMetricsAutoConfigurationTests.java | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java index 86a6df69f027..7c71fd8488ba 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java @@ -49,53 +49,48 @@ class JvmMetricsAutoConfigurationTests { @Test void autoConfiguresJvmMetrics() { - this.contextRunner.run((context) -> validateBaseJvmMetricsBeansArePresent()); + this.contextRunner.run(validateBaseJvmMetricsBeansArePresentWithCustomBean(null)); } @Test void allowsCustomJvmGcMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class).run((context) -> { - validateBaseJvmMetricsBeansArePresent(); - assertThat(context).hasBean("customJvmGcMetrics"); - }); + this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class).run( + validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmGcMetrics")); } @Test void allowsCustomJvmMemoryMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class).run((context) -> { - validateBaseJvmMetricsBeansArePresent(); - assertThat(context).hasBean("customJvmMemoryMetrics"); - }); + this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class).run( + validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmMemoryMetrics")); } @Test void allowsCustomJvmThreadMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class).run((context) -> { - validateBaseJvmMetricsBeansArePresent(); - assertThat(context).hasBean("customJvmThreadMetrics"); - }); + this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class).run( + validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmThreadMetrics")); } @Test void allowsCustomClassLoaderMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class).run((context) -> { - validateBaseJvmMetricsBeansArePresent(); - assertThat(context).hasBean("customClassLoaderMetrics"); - }); + this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class).run( + validateBaseJvmMetricsBeansArePresentWithCustomBean("customClassLoaderMetrics")); } @Test void allowsCustomDiskSpaceMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class).run((context) -> { - validateBaseJvmMetricsBeansArePresent(); - assertThat(context).hasBean("customDiskSpaceMetrics"); - }); + this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class).run( + validateBaseJvmMetricsBeansArePresentWithCustomBean("customDiskSpaceMetrics")); } - private ContextConsumer validateBaseJvmMetricsBeansArePresent() { - return (context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) - .hasSingleBean(DiskSpaceMetrics.class); + private ContextConsumer validateBaseJvmMetricsBeansArePresentWithCustomBean(String customBean) { + return (context) -> { + assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) + .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class); + if (customBean != null) { + assertThat(context).hasBean(customBean); + } + }; } @Configuration(proxyBeanMethods = false) From 08024eb15708c5f060f60eb72895d25cbe9d3791 Mon Sep 17 00:00:00 2001 From: bono007 Date: Sun, 11 Apr 2021 10:04:56 -0500 Subject: [PATCH 3/4] Fix test format --- .../JvmMetricsAutoConfigurationTests.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java index 7c71fd8488ba..60f98f5f0318 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java @@ -54,43 +54,44 @@ void autoConfiguresJvmMetrics() { @Test void allowsCustomJvmGcMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class).run( - validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmGcMetrics")); + this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class) + .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmGcMetrics")); } @Test void allowsCustomJvmMemoryMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class).run( - validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmMemoryMetrics")); + this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class) + .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmMemoryMetrics")); } @Test void allowsCustomJvmThreadMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class).run( - validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmThreadMetrics")); + this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class) + .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmThreadMetrics")); } @Test void allowsCustomClassLoaderMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class).run( - validateBaseJvmMetricsBeansArePresentWithCustomBean("customClassLoaderMetrics")); + this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class) + .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customClassLoaderMetrics")); } @Test void allowsCustomDiskSpaceMetricsToBeUsed() { - this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class).run( - validateBaseJvmMetricsBeansArePresentWithCustomBean("customDiskSpaceMetrics")); + this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class) + .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customDiskSpaceMetrics")); } - private ContextConsumer validateBaseJvmMetricsBeansArePresentWithCustomBean(String customBean) { + private ContextConsumer validateBaseJvmMetricsBeansArePresentWithCustomBean( + String customBean) { return (context) -> { - assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) - .hasSingleBean(DiskSpaceMetrics.class); - if (customBean != null) { - assertThat(context).hasBean(customBean); - } - }; + assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) + .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class); + if (customBean != null) { + assertThat(context).hasBean(customBean); + } + }; } @Configuration(proxyBeanMethods = false) From 04b442a659bf1438b4849aa2dbbdca0ad4ae1a5b Mon Sep 17 00:00:00 2001 From: bono007 Date: Wed, 21 Apr 2021 09:18:03 -0500 Subject: [PATCH 4/4] Implemented suggested changes from MR - Reverted overuse of ContextConsumer - use "." for the directory to report metrics on --- .../metrics/JvmMetricsAutoConfiguration.java | 2 +- .../JvmMetricsAutoConfigurationTests.java | 42 ++++++++++--------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java index 0f846f6692dc..ea46bc95d207 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfiguration.java @@ -72,7 +72,7 @@ public ClassLoaderMetrics classLoaderMetrics() { @Bean @ConditionalOnMissingBean public DiskSpaceMetrics diskSpaceMetrics() { - return new DiskSpaceMetrics(new File(System.getProperty("user.dir"))); + return new DiskSpaceMetrics(new File(".")); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java index 60f98f5f0318..294129b91423 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/JvmMetricsAutoConfigurationTests.java @@ -27,9 +27,7 @@ import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -49,49 +47,53 @@ class JvmMetricsAutoConfigurationTests { @Test void autoConfiguresJvmMetrics() { - this.contextRunner.run(validateBaseJvmMetricsBeansArePresentWithCustomBean(null)); + this.contextRunner.run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class).hasSingleBean(DiskSpaceMetrics.class)); } @Test void allowsCustomJvmGcMetricsToBeUsed() { this.contextRunner.withUserConfiguration(CustomJvmGcMetricsConfiguration.class) - .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmGcMetrics")); + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasBean("customJvmGcMetrics") + .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class).hasSingleBean(DiskSpaceMetrics.class)); } @Test void allowsCustomJvmMemoryMetricsToBeUsed() { this.contextRunner.withUserConfiguration(CustomJvmMemoryMetricsConfiguration.class) - .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmMemoryMetrics")); + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class).hasBean("customJvmMemoryMetrics") + .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class)); } @Test void allowsCustomJvmThreadMetricsToBeUsed() { this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class) - .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customJvmThreadMetrics")); + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) + .hasBean("customJvmThreadMetrics").hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class)); } @Test void allowsCustomClassLoaderMetricsToBeUsed() { this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class) - .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customClassLoaderMetrics")); + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class).hasBean("customClassLoaderMetrics") + .hasSingleBean(DiskSpaceMetrics.class)); } @Test void allowsCustomDiskSpaceMetricsToBeUsed() { this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class) - .run(validateBaseJvmMetricsBeansArePresentWithCustomBean("customDiskSpaceMetrics")); - } - - private ContextConsumer validateBaseJvmMetricsBeansArePresentWithCustomBean( - String customBean) { - return (context) -> { - assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) - .hasSingleBean(DiskSpaceMetrics.class); - if (customBean != null) { - assertThat(context).hasBean(customBean); - } - }; + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class).hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class).hasSingleBean(DiskSpaceMetrics.class) + .hasBean("customDiskSpaceMetrics")); } @Configuration(proxyBeanMethods = false)