diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java index 1beceb70c0..96eaf0a939 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfiguration.java @@ -18,10 +18,12 @@ package org.springframework.boot.actuate.autoconfigure.metrics; import io.micrometer.core.annotation.Timed; import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import io.micrometer.core.instrument.binder.logging.LogbackMetrics; +import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; import io.micrometer.core.instrument.binder.system.ProcessorMetrics; import io.micrometer.core.instrument.binder.system.UptimeMetrics; @@ -92,6 +94,12 @@ public class MetricsAutoConfiguration { return new JvmThreadMetrics(); } + @Bean + @ConditionalOnMissingBean + public ClassLoaderMetrics classLoaderMetrics() { + return new ClassLoaderMetrics(); + } + } @Configuration @@ -119,6 +127,13 @@ public class MetricsAutoConfiguration { return new ProcessorMetrics(); } + @Bean + @ConditionalOnProperty(name = "management.metrics.binders.files.enabled", matchIfMissing = true) + @ConditionalOnMissingBean + public FileDescriptorMetrics fileDescriptorMetrics() { + return new FileDescriptorMetrics(); + } + } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index d44005d147..9632126d2c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -179,7 +179,13 @@ "name": "management.info.git.mode", "defaultValue": "simple" }, - { + { + "name": "management.metrics.binders.files.enabled", + "type": "java.lang.Boolean", + "description": "Whether to enable files metrics.", + "defaultValue": true + }, + { "name": "management.metrics.binders.integration.enabled", "type": "java.lang.Boolean", "description": "Whether to enable Spring Integration metrics.", diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java index 5ace579ba7..fcb05065bc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/MetricsAutoConfigurationTests.java @@ -21,10 +21,12 @@ import java.util.List; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.MeterBinder; +import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import io.micrometer.core.instrument.binder.logging.LogbackMetrics; +import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; import io.micrometer.core.instrument.binder.system.ProcessorMetrics; import io.micrometer.core.instrument.binder.system.UptimeMetrics; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; @@ -94,7 +96,8 @@ public class MetricsAutoConfigurationTests { public void autoConfiguresJvmMetrics() { this.runner.run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) .hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class)); + .hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class)); } @Test @@ -102,7 +105,8 @@ public class MetricsAutoConfigurationTests { this.runner.withPropertyValues("management.metrics.binders.jvm.enabled=false") .run((context) -> assertThat(context).doesNotHaveBean(JvmGcMetrics.class) .doesNotHaveBean(JvmMemoryMetrics.class) - .doesNotHaveBean(JvmThreadMetrics.class)); + .doesNotHaveBean(JvmThreadMetrics.class) + .doesNotHaveBean(ClassLoaderMetrics.class)); } @Test @@ -111,7 +115,8 @@ public class MetricsAutoConfigurationTests { .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) .hasBean("customJvmGcMetrics") .hasSingleBean(JvmMemoryMetrics.class) - .hasSingleBean(JvmThreadMetrics.class)); + .hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class)); } @Test @@ -120,7 +125,8 @@ public class MetricsAutoConfigurationTests { .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) .hasSingleBean(JvmMemoryMetrics.class) .hasBean("customJvmMemoryMetrics") - .hasSingleBean(JvmThreadMetrics.class)); + .hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class)); } @Test @@ -129,9 +135,20 @@ public class MetricsAutoConfigurationTests { .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) .hasSingleBean(JvmMemoryMetrics.class) .hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class) .hasBean("customJvmThreadMetrics")); } + @Test + public void allowsCustomClassLoaderMetricsToBeUsed() { + this.runner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class) + .run((context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) + .hasSingleBean(JvmMemoryMetrics.class) + .hasSingleBean(JvmThreadMetrics.class) + .hasSingleBean(ClassLoaderMetrics.class) + .hasBean("customClassLoaderMetrics")); + } + @Test public void autoConfiguresLogbackMetrics() { this.runner.run( @@ -194,6 +211,27 @@ public class MetricsAutoConfigurationTests { .hasBean("customProcessorMetrics")); } + @Test + public void autoConfiguresFileDescriptorMetrics() { + this.runner.run((context) -> assertThat(context) + .hasSingleBean(FileDescriptorMetrics.class)); + } + + @Test + public void allowsFileDescriptorMetricsToBeDisabled() { + this.runner.withPropertyValues("management.metrics.binders.files.enabled=false") + .run((context) -> assertThat(context) + .doesNotHaveBean(FileDescriptorMetrics.class)); + } + + @Test + public void allowsCustomFileDescriptorMetricsToBeUsed() { + this.runner.withUserConfiguration(CustomFileDescriptorMetricsConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(FileDescriptorMetrics.class) + .hasBean("customFileDescriptorMetrics")); + } + @Configuration static class CustomClockConfiguration { @@ -256,6 +294,16 @@ public class MetricsAutoConfigurationTests { } + @Configuration + static class CustomClassLoaderMetricsConfiguration { + + @Bean + ClassLoaderMetrics customClassLoaderMetrics() { + return new ClassLoaderMetrics(); + } + + } + @Configuration static class CustomLogbackMetricsConfiguration { @@ -286,4 +334,14 @@ public class MetricsAutoConfigurationTests { } + @Configuration + static class CustomFileDescriptorMetricsConfiguration { + + @Bean + FileDescriptorMetrics customFileDescriptorMetrics() { + return new FileDescriptorMetrics(); + } + + } + } diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 26543ff2cc..84e471527a 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -1295,6 +1295,7 @@ content into your application. Rather, pick only the properties that you need. management.info.git.mode=simple # Mode to use to expose git information. # METRICS + management.metrics.binders.files.enabled=true # Whether to enable files metrics. management.metrics.binders.integration.enabled=true # Whether to enable Spring Integration metrics. management.metrics.binders.jvm.enabled=true # Whether to enable JVM metrics. management.metrics.binders.logback.enabled=true # Whether to enable Logback metrics.