Skip to content

Commit 0cbeb11

Browse files
committed
Autoconfigure custom MeterConventions for JVM and system metrics
Autoconfigure the following beans with their corresponding conventions, if available: - ProcessorMetrics with JvmCpuMeterConventions - JvmMemoryMetrics with JvmMemoryMeterConventions - JvmThreadMetrics with JvmThreadMeterConventions - ClassLoaderMetrics with JvmClassLoadingMeterConventions Signed-off-by: Dmytro Nosan <dimanosan@gmail.com>
1 parent 8820a99 commit 0cbeb11

File tree

4 files changed

+68
-8
lines changed

4 files changed

+68
-8
lines changed

module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/jvm/JvmMetricsAutoConfiguration.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.micrometer.metrics.autoconfigure.jvm;
1818

19+
import java.util.Collections;
20+
1921
import io.micrometer.core.instrument.MeterRegistry;
2022
import io.micrometer.core.instrument.binder.MeterBinder;
2123
import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
@@ -25,12 +27,16 @@
2527
import io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics;
2628
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
2729
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
30+
import io.micrometer.core.instrument.binder.jvm.convention.JvmClassLoadingMeterConventions;
31+
import io.micrometer.core.instrument.binder.jvm.convention.JvmMemoryMeterConventions;
32+
import io.micrometer.core.instrument.binder.jvm.convention.JvmThreadMeterConventions;
2833
import org.jspecify.annotations.Nullable;
2934

3035
import org.springframework.aot.hint.MemberCategory;
3136
import org.springframework.aot.hint.RuntimeHints;
3237
import org.springframework.aot.hint.RuntimeHintsRegistrar;
3338
import org.springframework.beans.BeanUtils;
39+
import org.springframework.beans.factory.ObjectProvider;
3440
import org.springframework.boot.autoconfigure.AutoConfiguration;
3541
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3642
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -71,20 +77,26 @@ JvmHeapPressureMetrics jvmHeapPressureMetrics() {
7177

7278
@Bean
7379
@ConditionalOnMissingBean
74-
JvmMemoryMetrics jvmMemoryMetrics() {
75-
return new JvmMemoryMetrics();
80+
JvmMemoryMetrics jvmMemoryMetrics(ObjectProvider<JvmMemoryMeterConventions> jvmMemoryMeterConventions) {
81+
JvmMemoryMeterConventions conventions = jvmMemoryMeterConventions.getIfAvailable();
82+
return (conventions != null) ? new JvmMemoryMetrics(Collections.emptyList(), conventions)
83+
: new JvmMemoryMetrics();
7684
}
7785

7886
@Bean
7987
@ConditionalOnMissingBean
80-
JvmThreadMetrics jvmThreadMetrics() {
81-
return new JvmThreadMetrics();
88+
JvmThreadMetrics jvmThreadMetrics(ObjectProvider<JvmThreadMeterConventions> jvmThreadMeterConventions) {
89+
JvmThreadMeterConventions conventions = jvmThreadMeterConventions.getIfAvailable();
90+
return (conventions != null) ? new JvmThreadMetrics(Collections.emptyList(), conventions)
91+
: new JvmThreadMetrics();
8292
}
8393

8494
@Bean
8595
@ConditionalOnMissingBean
86-
ClassLoaderMetrics classLoaderMetrics() {
87-
return new ClassLoaderMetrics();
96+
ClassLoaderMetrics classLoaderMetrics(
97+
ObjectProvider<JvmClassLoadingMeterConventions> jvmClassLoadingMeterConventions) {
98+
JvmClassLoadingMeterConventions conventions = jvmClassLoadingMeterConventions.getIfAvailable();
99+
return (conventions != null) ? new ClassLoaderMetrics(conventions) : new ClassLoaderMetrics();
88100
}
89101

90102
@Bean

module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/system/SystemMetricsAutoConfiguration.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
package org.springframework.boot.micrometer.metrics.autoconfigure.system;
1818

1919
import java.io.File;
20+
import java.util.Collections;
2021
import java.util.List;
2122

2223
import io.micrometer.core.instrument.MeterRegistry;
2324
import io.micrometer.core.instrument.Tags;
25+
import io.micrometer.core.instrument.binder.jvm.convention.JvmCpuMeterConventions;
2426
import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
2527
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
2628
import io.micrometer.core.instrument.binder.system.UptimeMetrics;
2729

30+
import org.springframework.beans.factory.ObjectProvider;
2831
import org.springframework.boot.autoconfigure.AutoConfiguration;
2932
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3033
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -58,8 +61,10 @@ UptimeMetrics uptimeMetrics() {
5861

5962
@Bean
6063
@ConditionalOnMissingBean
61-
ProcessorMetrics processorMetrics() {
62-
return new ProcessorMetrics();
64+
ProcessorMetrics processorMetrics(ObjectProvider<JvmCpuMeterConventions> jvmCpuMeterConventions) {
65+
JvmCpuMeterConventions conventions = jvmCpuMeterConventions.getIfAvailable();
66+
return (conventions != null) ? new ProcessorMetrics(Collections.emptyList(), conventions)
67+
: new ProcessorMetrics();
6368
}
6469

6570
@Bean

module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/jvm/JvmMetricsAutoConfigurationTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@
2525
import io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics;
2626
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
2727
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
28+
import io.micrometer.core.instrument.binder.jvm.convention.JvmClassLoadingMeterConventions;
29+
import io.micrometer.core.instrument.binder.jvm.convention.JvmMemoryMeterConventions;
30+
import io.micrometer.core.instrument.binder.jvm.convention.JvmThreadMeterConventions;
2831
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2932
import org.junit.jupiter.api.Test;
3033
import org.junit.jupiter.api.condition.EnabledForJreRange;
3134
import org.junit.jupiter.api.condition.JRE;
35+
import org.mockito.Mockito;
3236

3337
import org.springframework.aot.hint.MemberCategory;
3438
import org.springframework.aot.hint.RuntimeHints;
@@ -82,18 +86,46 @@ void allowsCustomJvmMemoryMetricsToBeUsed() {
8286
.run(assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customJvmMemoryMetrics")));
8387
}
8488

89+
@Test
90+
void allowCustomJvmMemoryMeterConventionsToBeUsed() {
91+
JvmMemoryMeterConventions jvmMemoryMeterConventions = Mockito.mock(JvmMemoryMeterConventions.class);
92+
this.contextRunner.withBean(JvmMemoryMeterConventions.class, () -> jvmMemoryMeterConventions)
93+
.run((context) -> assertThat(context).hasSingleBean(JvmMemoryMetrics.class)
94+
.getBean(JvmMemoryMetrics.class)
95+
.hasFieldOrPropertyWithValue("conventions", jvmMemoryMeterConventions));
96+
}
97+
8598
@Test
8699
void allowsCustomJvmThreadMetricsToBeUsed() {
87100
this.contextRunner.withUserConfiguration(CustomJvmThreadMetricsConfiguration.class)
88101
.run(assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customJvmThreadMetrics")));
89102
}
90103

104+
@Test
105+
void allowCustomJvmThreadMeterConventionsToBeUsed() {
106+
JvmThreadMeterConventions jvmThreadMeterConventions = Mockito.mock(JvmThreadMeterConventions.class);
107+
this.contextRunner.withBean(JvmThreadMeterConventions.class, () -> jvmThreadMeterConventions)
108+
.run((context) -> assertThat(context).hasSingleBean(JvmThreadMetrics.class)
109+
.getBean(JvmThreadMetrics.class)
110+
.hasFieldOrPropertyWithValue("conventions", jvmThreadMeterConventions));
111+
}
112+
91113
@Test
92114
void allowsCustomClassLoaderMetricsToBeUsed() {
93115
this.contextRunner.withUserConfiguration(CustomClassLoaderMetricsConfiguration.class)
94116
.run(assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customClassLoaderMetrics")));
95117
}
96118

119+
@Test
120+
void allowCustomJvmClassLoadingMeterConventionsToBeUsed() {
121+
JvmClassLoadingMeterConventions jvmClassLoadingMeterConventions = Mockito
122+
.mock(JvmClassLoadingMeterConventions.class);
123+
this.contextRunner.withBean(JvmClassLoadingMeterConventions.class, () -> jvmClassLoadingMeterConventions)
124+
.run((context) -> assertThat(context).hasSingleBean(ClassLoaderMetrics.class)
125+
.getBean(ClassLoaderMetrics.class)
126+
.hasFieldOrPropertyWithValue("conventions", jvmClassLoadingMeterConventions));
127+
}
128+
97129
@Test
98130
void allowsCustomJvmInfoMetricsToBeUsed() {
99131
this.contextRunner.withUserConfiguration(CustomJvmInfoMetricsConfiguration.class)

module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/system/SystemMetricsAutoConfigurationTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
import java.util.Collections;
2222

2323
import io.micrometer.core.instrument.Tags;
24+
import io.micrometer.core.instrument.binder.jvm.convention.JvmCpuMeterConventions;
2425
import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
2526
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
2627
import io.micrometer.core.instrument.binder.system.UptimeMetrics;
2728
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2829
import org.junit.jupiter.api.Test;
30+
import org.mockito.Mockito;
2931

3032
import org.springframework.boot.autoconfigure.AutoConfigurations;
3133
import org.springframework.boot.micrometer.metrics.system.DiskSpaceMetricsBinder;
@@ -71,6 +73,15 @@ void allowsCustomProcessorMetricsToBeUsed() {
7173
.hasBean("customProcessorMetrics"));
7274
}
7375

76+
@Test
77+
void allowsCustomJvmCpuMeterConventionsToBeUsed() {
78+
JvmCpuMeterConventions jvmCpuMeterConventions = Mockito.mock(JvmCpuMeterConventions.class);
79+
this.contextRunner.withBean(JvmCpuMeterConventions.class, () -> jvmCpuMeterConventions)
80+
.run((context) -> assertThat(context).hasSingleBean(ProcessorMetrics.class)
81+
.getBean(ProcessorMetrics.class)
82+
.hasFieldOrPropertyWithValue("conventions", jvmCpuMeterConventions));
83+
}
84+
7485
@Test
7586
void autoConfiguresFileDescriptorMetrics() {
7687
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(FileDescriptorMetrics.class));

0 commit comments

Comments
 (0)