diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfiguration.java index 931ecc9da3..fa21ac1fb0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfiguration.java @@ -46,13 +46,17 @@ import org.springframework.context.annotation.Configuration; @AutoConfigureAfter({ MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class, R2dbcAutoConfiguration.class }) @ConditionalOnClass({ ConnectionPool.class, MeterRegistry.class }) -@ConditionalOnBean({ ConnectionPool.class, MeterRegistry.class }) +@ConditionalOnBean({ ConnectionFactory.class, MeterRegistry.class }) public class ConnectionPoolMetricsAutoConfiguration { @Autowired - public void bindConnectionPoolsToRegistry(Map connectionPools, MeterRegistry registry) { - connectionPools.forEach((beanName, - connectionPool) -> new ConnectionPoolMetrics(connectionPool, beanName, Tags.empty()).bindTo(registry)); + public void bindConnectionPoolsToRegistry(Map connectionFactories, + MeterRegistry registry) { + connectionFactories.forEach((beanName, connectionFactory) -> { + if (connectionFactory instanceof ConnectionPool) { + new ConnectionPoolMetrics((ConnectionPool) connectionFactory, beanName, Tags.empty()).bindTo(registry); + } + }); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfigurationTests.java index acb4697fdc..c4f4d41010 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/r2dbc/ConnectionPoolMetricsAutoConfigurationTests.java @@ -60,6 +60,17 @@ class ConnectionPoolMetricsAutoConfigurationTests { }); } + @Test + void autoConfiguredDataSourceExposedAsConnectionFactoryTypeIsInstrumented() { + this.contextRunner + .withPropertyValues( + "spring.r2dbc.url:r2dbc:pool:h2:mem:///name?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE") + .withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class)).run((context) -> { + MeterRegistry registry = context.getBean(MeterRegistry.class); + assertThat(registry.find("r2dbc.pool.acquired").gauges()).hasSize(1); + }); + } + @Test void connectionPoolInstrumentationCanBeDisabled() { this.contextRunner.withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class)) @@ -69,6 +80,15 @@ class ConnectionPoolMetricsAutoConfigurationTests { }); } + @Test + void connectionPoolExposedAsConnectionFactoryTypeIsInstrumented() { + this.contextRunner.withUserConfiguration(ConnectionFactoryConfiguration.class).run((context) -> { + MeterRegistry registry = context.getBean(MeterRegistry.class); + assertThat(registry.find("r2dbc.pool.acquired").gauges()).extracting(Meter::getId) + .extracting((id) -> id.getTag("name")).containsExactly("testConnectionPool"); + }); + } + @Test void allConnectionPoolsCanBeInstrumented() { this.contextRunner.withUserConfiguration(TwoConnectionPoolsConfiguration.class).run((context) -> { @@ -88,6 +108,18 @@ class ConnectionPoolMetricsAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class ConnectionFactoryConfiguration { + + @Bean + ConnectionFactory testConnectionPool() { + return new ConnectionPool( + ConnectionPoolConfiguration.builder(H2ConnectionFactory.inMemory("db-" + UUID.randomUUID(), "sa", + "", Collections.singletonMap(H2ConnectionOption.DB_CLOSE_DELAY, "-1"))).build()); + } + + } + @Configuration(proxyBeanMethods = false) static class TwoConnectionPoolsConfiguration {