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;
@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<String, ConnectionPool> connectionPools, MeterRegistry registry) {
connectionPools.forEach((beanName,
connectionPool) -> new ConnectionPoolMetrics(connectionPool, beanName, Tags.empty()).bindTo(registry));
public void bindConnectionPoolsToRegistry(Map<String, ConnectionFactory> connectionFactories,
MeterRegistry registry) {
connectionFactories.forEach((beanName, connectionFactory) -> {
if (connectionFactory instanceof ConnectionPool) {
new ConnectionPoolMetrics((ConnectionPool) connectionFactory, beanName, Tags.empty()).bindTo(registry);
}
});
}
}
......@@ -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 {
......
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