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:
@@ -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 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user