Commit 2d5a55fb authored by Stephane Nicoll's avatar Stephane Nicoll

Bind ConnectionPool beans that are exposed as ConnectionFactory

This commit relaxes the class condition to ConnectionFactory, checking
if the connection factory is a connection pool and bind its metrics to
the registry accordingly.

Closes gh-20349
parent 73777af3
...@@ -46,13 +46,17 @@ import org.springframework.context.annotation.Configuration; ...@@ -46,13 +46,17 @@ import org.springframework.context.annotation.Configuration;
@AutoConfigureAfter({ MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class, @AutoConfigureAfter({ MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class,
R2dbcAutoConfiguration.class }) R2dbcAutoConfiguration.class })
@ConditionalOnClass({ ConnectionPool.class, MeterRegistry.class }) @ConditionalOnClass({ ConnectionPool.class, MeterRegistry.class })
@ConditionalOnBean({ ConnectionPool.class, MeterRegistry.class }) @ConditionalOnBean({ ConnectionFactory.class, MeterRegistry.class })
public class ConnectionPoolMetricsAutoConfiguration { public class ConnectionPoolMetricsAutoConfiguration {
@Autowired @Autowired
public void bindConnectionPoolsToRegistry(Map<String, ConnectionPool> connectionPools, MeterRegistry registry) { public void bindConnectionPoolsToRegistry(Map<String, ConnectionFactory> connectionFactories,
connectionPools.forEach((beanName, MeterRegistry registry) {
connectionPool) -> new ConnectionPoolMetrics(connectionPool, beanName, Tags.empty()).bindTo(registry)); connectionFactories.forEach((beanName, connectionFactory) -> {
if (connectionFactory instanceof ConnectionPool) {
new ConnectionPoolMetrics((ConnectionPool) connectionFactory, beanName, Tags.empty()).bindTo(registry);
}
});
} }
} }
...@@ -60,6 +60,17 @@ class ConnectionPoolMetricsAutoConfigurationTests { ...@@ -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 @Test
void connectionPoolInstrumentationCanBeDisabled() { void connectionPoolInstrumentationCanBeDisabled() {
this.contextRunner.withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class)) this.contextRunner.withConfiguration(AutoConfigurations.of(R2dbcAutoConfiguration.class))
...@@ -69,6 +80,15 @@ class ConnectionPoolMetricsAutoConfigurationTests { ...@@ -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 @Test
void allConnectionPoolsCanBeInstrumented() { void allConnectionPoolsCanBeInstrumented() {
this.contextRunner.withUserConfiguration(TwoConnectionPoolsConfiguration.class).run((context) -> { this.contextRunner.withUserConfiguration(TwoConnectionPoolsConfiguration.class).run((context) -> {
...@@ -88,6 +108,18 @@ class ConnectionPoolMetricsAutoConfigurationTests { ...@@ -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) @Configuration(proxyBeanMethods = false)
static class TwoConnectionPoolsConfiguration { static class TwoConnectionPoolsConfiguration {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment