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 629e3dc8f32..99ed01b22e5 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -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 class JvmMetricsAutoConfiguration { return new ClassLoaderMetrics(); } + @Bean + @ConditionalOnMissingBean + public DiskSpaceMetrics diskSpaceMetrics() { + 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 72c39c9d344..d0e5d16f3b3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 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. @@ -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.junit.jupiter.api.Test; 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 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Andy Wilkinson * @author Stephane Nicoll + * @author Chris Bono */ class JvmMetricsAutoConfigurationTests { @@ -43,41 +49,43 @@ 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(assertMetricsBeans()); } @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)); + .run(assertMetricsBeans().andThen((context) -> 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)); + .run(assertMetricsBeans().andThen((context) -> 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")); + .run(assertMetricsBeans().andThen((context) -> 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( + assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customClassLoaderMetrics"))); + } + + @Test + void allowsCustomDiskSpaceMetricsToBeUsed() { + this.contextRunner.withUserConfiguration(CustomDiskSpaceMetricsConfiguration.class) + .run(assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customDiskSpaceMetrics"))); + } + + private ContextConsumer assertMetricsBeans() { + return (context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class).hasSingleBean(JvmMemoryMetrics.class) + .hasSingleBean(JvmThreadMetrics.class).hasSingleBean(ClassLoaderMetrics.class) + .hasSingleBean(DiskSpaceMetrics.class); } @Configuration(proxyBeanMethods = false) @@ -120,4 +128,14 @@ class JvmMetricsAutoConfigurationTests { } + @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/actuator/metrics.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc index 9692532be35..47765a84602 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/actuator/metrics.adoc @@ -554,7 +554,7 @@ In most situations, the out-of-the-box defaults will provide sensible metrics th [[actuator.metrics.supported.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: @@ -562,6 +562,7 @@ The following JVM metrics are provided: * Statistics related to garbage collection * Threads utilization * The Number of classes loaded/unloaded +* Disk space available