From d4f439053fbb2e7945c6a8b053b9a6d512bd3316 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Wed, 11 Dec 2024 17:15:53 +0800 Subject: [PATCH] Fix non-default HikariDataSource candidates are not included in metrics See https://github.com/spring-projects/spring-boot/issues/43481#issuecomment-2655527313 Signed-off-by: Yanming Zhou --- ...ataSourcePoolMetricsAutoConfiguration.java | 5 ++- ...urcePoolMetricsAutoConfigurationTests.java | 40 +++++++++++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfiguration.java index adfe57d95ddd..8af299bf52d2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfiguration.java @@ -54,6 +54,7 @@ * {@link DataSource datasources}. * * @author Stephane Nicoll + * @author Yanming Zhou * @since 2.0.0 */ @AutoConfiguration(after = { MetricsAutoConfiguration.class, DataSourceAutoConfiguration.class, @@ -140,13 +141,13 @@ static class HikariDataSourceMeterBinder implements MeterBinder { @Override public void bindTo(MeterRegistry registry) { - for (DataSource dataSource : this.dataSources) { + this.dataSources.stream(ObjectProvider.UNFILTERED).forEach((dataSource) -> { HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(dataSource, HikariConfigMXBean.class, HikariDataSource.class); if (hikariDataSource != null) { bindMetricsRegistryToHikariDataSource(hikariDataSource, registry); } - } + }); } private void bindMetricsRegistryToHikariDataSource(HikariDataSource hikari, MeterRegistry registry) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java index 06f4638bd6b5..5e20efa842a6 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java @@ -51,6 +51,7 @@ * @author Stephane Nicoll * @author Andy Wilkinson * @author Tommy Ludwig + * @author Yanming Zhou */ class DataSourcePoolMetricsAutoConfigurationTests { @@ -156,14 +157,15 @@ void hikariDataSourceInstrumentationCanBeDisabled() { @Test void allHikariDataSourcesCanBeInstrumented() { - this.contextRunner.withUserConfiguration(TwoHikariDataSourcesConfiguration.class) + this.contextRunner.withUserConfiguration(MultipleHikariDataSourcesConfiguration.class) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) .run((context) -> { - context.getBean("firstDataSource", DataSource.class).getConnection(); - context.getBean("secondOne", DataSource.class).getConnection(); + context.getBean("standardDataSource", DataSource.class).getConnection(); + context.getBean("nonDefault", DataSource.class).getConnection(); + context.getBean("nonAutowire", DataSource.class).getConnection(); MeterRegistry registry = context.getBean(MeterRegistry.class); - registry.get("hikaricp.connections").tags("pool", "firstDataSource").meter(); - registry.get("hikaricp.connections").tags("pool", "secondOne").meter(); + assertThat(registry.find("hikaricp.connections").meters()).map((meter) -> meter.getId().getTag("pool")) + .containsOnly("standardDataSource", "nonDefault"); }); } @@ -182,16 +184,17 @@ void someHikariDataSourcesCanBeInstrumented() { @Test void allHikariDataSourcesCanBeInstrumentedWhenUsingLazyInitialization() { - this.contextRunner.withUserConfiguration(TwoHikariDataSourcesConfiguration.class) + this.contextRunner.withUserConfiguration(MultipleHikariDataSourcesConfiguration.class) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) .withInitializer( (context) -> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor())) .run((context) -> { - context.getBean("firstDataSource", DataSource.class).getConnection(); - context.getBean("secondOne", DataSource.class).getConnection(); + context.getBean("standardDataSource", DataSource.class).getConnection(); + context.getBean("nonDefault", DataSource.class).getConnection(); + context.getBean("nonAutowire", DataSource.class).getConnection(); MeterRegistry registry = context.getBean(MeterRegistry.class); - registry.get("hikaricp.connections").tags("pool", "firstDataSource").meter(); - registry.get("hikaricp.connections").tags("pool", "secondOne").meter(); + assertThat(registry.find("hikaricp.connections").meters()).map((meter) -> meter.getId().getTag("pool")) + .containsOnly("standardDataSource", "nonDefault"); }); } @@ -257,16 +260,21 @@ private DataSource createDataSource() { } @Configuration(proxyBeanMethods = false) - static class TwoHikariDataSourcesConfiguration { + static class MultipleHikariDataSourcesConfiguration { @Bean - DataSource firstDataSource() { - return createHikariDataSource("firstDataSource"); + DataSource standardDataSource() { + return createHikariDataSource("standardDataSource"); } - @Bean - DataSource secondOne() { - return createHikariDataSource("secondOne"); + @Bean(defaultCandidate = false) + DataSource nonDefault() { + return createHikariDataSource("nonDefault"); + } + + @Bean(autowireCandidate = false) + DataSource nonAutowire() { + return createHikariDataSource("nonAutowire"); } }