Merge branch '3.4.x'

Closes gh-44257
This commit is contained in:
Andy Wilkinson 2025-02-13 10:50:02 +00:00
commit 4c097b9841
2 changed files with 27 additions and 18 deletions

View File

@ -54,6 +54,7 @@ import org.springframework.util.StringUtils;
* {@link DataSource datasources}. * {@link DataSource datasources}.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Yanming Zhou
* @since 2.0.0 * @since 2.0.0
*/ */
@AutoConfiguration(after = { MetricsAutoConfiguration.class, DataSourceAutoConfiguration.class, @AutoConfiguration(after = { MetricsAutoConfiguration.class, DataSourceAutoConfiguration.class,
@ -140,13 +141,13 @@ public class DataSourcePoolMetricsAutoConfiguration {
@Override @Override
public void bindTo(MeterRegistry registry) { public void bindTo(MeterRegistry registry) {
for (DataSource dataSource : this.dataSources) { this.dataSources.stream(ObjectProvider.UNFILTERED).forEach((dataSource) -> {
HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(dataSource, HikariConfigMXBean.class, HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(dataSource, HikariConfigMXBean.class,
HikariDataSource.class); HikariDataSource.class);
if (hikariDataSource != null) { if (hikariDataSource != null) {
bindMetricsRegistryToHikariDataSource(hikariDataSource, registry); bindMetricsRegistryToHikariDataSource(hikariDataSource, registry);
} }
} });
} }
private void bindMetricsRegistryToHikariDataSource(HikariDataSource hikari, MeterRegistry registry) { private void bindMetricsRegistryToHikariDataSource(HikariDataSource hikari, MeterRegistry registry) {

View File

@ -51,6 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Tommy Ludwig * @author Tommy Ludwig
* @author Yanming Zhou
*/ */
class DataSourcePoolMetricsAutoConfigurationTests { class DataSourcePoolMetricsAutoConfigurationTests {
@ -156,14 +157,15 @@ class DataSourcePoolMetricsAutoConfigurationTests {
@Test @Test
void allHikariDataSourcesCanBeInstrumented() { void allHikariDataSourcesCanBeInstrumented() {
this.contextRunner.withUserConfiguration(TwoHikariDataSourcesConfiguration.class) this.contextRunner.withUserConfiguration(MultipleHikariDataSourcesConfiguration.class)
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class))
.run((context) -> { .run((context) -> {
context.getBean("firstDataSource", DataSource.class).getConnection(); context.getBean("standardDataSource", DataSource.class).getConnection();
context.getBean("secondOne", DataSource.class).getConnection(); context.getBean("nonDefault", DataSource.class).getConnection();
context.getBean("nonAutowire", DataSource.class).getConnection();
MeterRegistry registry = context.getBean(MeterRegistry.class); MeterRegistry registry = context.getBean(MeterRegistry.class);
registry.get("hikaricp.connections").tags("pool", "firstDataSource").meter(); assertThat(registry.find("hikaricp.connections").meters()).map((meter) -> meter.getId().getTag("pool"))
registry.get("hikaricp.connections").tags("pool", "secondOne").meter(); .containsOnly("standardDataSource", "nonDefault");
}); });
} }
@ -182,16 +184,17 @@ class DataSourcePoolMetricsAutoConfigurationTests {
@Test @Test
void allHikariDataSourcesCanBeInstrumentedWhenUsingLazyInitialization() { void allHikariDataSourcesCanBeInstrumentedWhenUsingLazyInitialization() {
this.contextRunner.withUserConfiguration(TwoHikariDataSourcesConfiguration.class) this.contextRunner.withUserConfiguration(MultipleHikariDataSourcesConfiguration.class)
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class))
.withInitializer( .withInitializer(
(context) -> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor())) (context) -> context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()))
.run((context) -> { .run((context) -> {
context.getBean("firstDataSource", DataSource.class).getConnection(); context.getBean("standardDataSource", DataSource.class).getConnection();
context.getBean("secondOne", DataSource.class).getConnection(); context.getBean("nonDefault", DataSource.class).getConnection();
context.getBean("nonAutowire", DataSource.class).getConnection();
MeterRegistry registry = context.getBean(MeterRegistry.class); MeterRegistry registry = context.getBean(MeterRegistry.class);
registry.get("hikaricp.connections").tags("pool", "firstDataSource").meter(); assertThat(registry.find("hikaricp.connections").meters()).map((meter) -> meter.getId().getTag("pool"))
registry.get("hikaricp.connections").tags("pool", "secondOne").meter(); .containsOnly("standardDataSource", "nonDefault");
}); });
} }
@ -257,16 +260,21 @@ class DataSourcePoolMetricsAutoConfigurationTests {
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
static class TwoHikariDataSourcesConfiguration { static class MultipleHikariDataSourcesConfiguration {
@Bean @Bean
DataSource firstDataSource() { DataSource standardDataSource() {
return createHikariDataSource("firstDataSource"); return createHikariDataSource("standardDataSource");
} }
@Bean @Bean(defaultCandidate = false)
DataSource secondOne() { DataSource nonDefault() {
return createHikariDataSource("secondOne"); return createHikariDataSource("nonDefault");
}
@Bean(autowireCandidate = false)
DataSource nonAutowire() {
return createHikariDataSource("nonAutowire");
} }
} }