Skip to content

Commit e7176c6

Browse files
committed
Stop DataSource initialization from preventing Hikari instrumentation
Closes gh-12129
1 parent 33be78a commit e7176c6

File tree

3 files changed

+81
-6
lines changed

3 files changed

+81
-6
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/HikariDataSourceMetricsPostProcessor.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
import com.zaxxer.hikari.HikariDataSource;
2020
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
2121
import io.micrometer.core.instrument.MeterRegistry;
22+
import org.apache.commons.logging.Log;
23+
import org.apache.commons.logging.LogFactory;
2224

2325
import org.springframework.beans.factory.config.BeanPostProcessor;
2426
import org.springframework.context.ApplicationContext;
27+
import org.springframework.core.Ordered;
2528

2629
/**
2730
* {@link BeanPostProcessor} that configures Hikari metrics. Such arrangement is necessary
@@ -30,7 +33,10 @@
3033
*
3134
* @author Stephane Nicoll
3235
*/
33-
class HikariDataSourceMetricsPostProcessor implements BeanPostProcessor {
36+
class HikariDataSourceMetricsPostProcessor implements BeanPostProcessor, Ordered {
37+
38+
private static final Log logger = LogFactory
39+
.getLog(HikariDataSourceMetricsPostProcessor.class);
3440

3541
private final ApplicationContext context;
3642

@@ -53,8 +59,13 @@ private void bindMetricsRegistryToHikariDataSource(MeterRegistry registry,
5359
HikariDataSource dataSource) {
5460
if (dataSource.getMetricRegistry() == null
5561
&& dataSource.getMetricsTrackerFactory() == null) {
56-
dataSource.setMetricsTrackerFactory(
57-
new MicrometerMetricsTrackerFactory(registry));
62+
try {
63+
dataSource.setMetricsTrackerFactory(
64+
new MicrometerMetricsTrackerFactory(registry));
65+
}
66+
catch (Exception ex) {
67+
logger.warn("Failed to bind Hikari metrics: " + ex.getMessage());
68+
}
5869
}
5970
}
6071

@@ -65,4 +76,9 @@ private MeterRegistry getMeterRegistry() {
6576
return this.meterRegistry;
6677
}
6778

79+
@Override
80+
public int getOrder() {
81+
return Ordered.HIGHEST_PRECEDENCE;
82+
}
83+
6884
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jdbc/DataSourcePoolMetricsAutoConfigurationTests.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics.jdbc;
1818

19+
import java.sql.SQLException;
1920
import java.util.UUID;
2021

2122
import javax.sql.DataSource;
@@ -26,13 +27,17 @@
2627
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
2728
import org.junit.Test;
2829

30+
import org.springframework.beans.BeansException;
31+
import org.springframework.beans.factory.config.BeanPostProcessor;
2932
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
3033
import org.springframework.boot.autoconfigure.AutoConfigurations;
3134
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
3235
import org.springframework.boot.jdbc.DataSourceBuilder;
3336
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3437
import org.springframework.context.annotation.Bean;
3538
import org.springframework.context.annotation.Configuration;
39+
import org.springframework.core.Ordered;
40+
import org.springframework.core.PriorityOrdered;
3641

3742
import static org.assertj.core.api.Assertions.assertThat;
3843

@@ -96,6 +101,29 @@ public void autoConfiguredHikariDataSourceIsInstrumented() {
96101
});
97102
}
98103

104+
@Test
105+
public void autoConfiguredHikariDataSourceIsInstrumentedWhenUsingDataSourceInitialization() {
106+
this.contextRunner
107+
.withPropertyValues(
108+
"spring.datasource.schema:db/create-custom-schema.sql")
109+
.run((context) -> {
110+
context.getBean(DataSource.class).getConnection();
111+
MeterRegistry registry = context.getBean(MeterRegistry.class);
112+
registry.get("hikaricp.connections").meter();
113+
});
114+
}
115+
116+
@Test
117+
public void failureToInstrumentHikariDataSourceIsTolerated() {
118+
this.contextRunner.withUserConfiguration(HikariSealingConfiguration.class)
119+
.run((context) -> {
120+
assertThat(context).hasNotFailed();
121+
context.getBean(DataSource.class).getConnection();
122+
MeterRegistry registry = context.getBean(MeterRegistry.class);
123+
assertThat(registry.find("hikaricp.connections").meter()).isNull();
124+
});
125+
}
126+
99127
@Test
100128
public void hikariDataSourceInstrumentationCanBeDisabled() {
101129
this.contextRunner.withPropertyValues("management.metrics.enable.hikaricp=false")
@@ -215,4 +243,37 @@ private org.apache.tomcat.jdbc.pool.DataSource createTomcatDataSource() {
215243

216244
}
217245

246+
@Configuration
247+
static class HikariSealingConfiguration {
248+
249+
@Bean
250+
public static HikariSealer hikariSealer() {
251+
return new HikariSealer();
252+
}
253+
254+
static class HikariSealer implements BeanPostProcessor, PriorityOrdered {
255+
256+
@Override
257+
public int getOrder() {
258+
return Ordered.HIGHEST_PRECEDENCE;
259+
}
260+
261+
@Override
262+
public Object postProcessAfterInitialization(Object bean, String beanName)
263+
throws BeansException {
264+
if (bean instanceof HikariDataSource) {
265+
try {
266+
((HikariDataSource) bean).getConnection().close();
267+
}
268+
catch (SQLException ex) {
269+
throw new IllegalStateException(ex);
270+
}
271+
}
272+
return bean;
273+
}
274+
275+
}
276+
277+
}
278+
218279
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerPostProcessor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,9 @@
3333
*/
3434
class DataSourceInitializerPostProcessor implements BeanPostProcessor, Ordered {
3535

36-
private int order = Ordered.HIGHEST_PRECEDENCE;
37-
3836
@Override
3937
public int getOrder() {
40-
return this.order;
38+
return Ordered.HIGHEST_PRECEDENCE + 1;
4139
}
4240

4341
@Autowired

0 commit comments

Comments
 (0)