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
This commit is contained in:
Stephane Nicoll
2020-02-29 10:27:40 -05:00
parent 73777af388
commit 2d5a55fb0d
2 changed files with 40 additions and 4 deletions

View File

@@ -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);
}
});
}
}

View File

@@ -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 {