Skip to content

Commit d0fa72a

Browse files
committed
Filter AbstractRoutingDataSource from health indicator
Closes gh-6806
1 parent ba3fae3 commit d0fa72a

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfiguration.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.actuate.autoconfigure;
1818

1919
import java.util.Collection;
20+
import java.util.LinkedHashMap;
2021
import java.util.Map;
2122

2223
import javax.jms.ConnectionFactory;
@@ -75,6 +76,7 @@
7576
import org.springframework.data.mongodb.core.MongoTemplate;
7677
import org.springframework.data.redis.connection.RedisConnectionFactory;
7778
import org.springframework.jdbc.core.JdbcTemplate;
79+
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
7880
import org.springframework.mail.javamail.JavaMailSenderImpl;
7981

8082
/**
@@ -170,7 +172,7 @@ public HealthIndicator couchbaseHealthIndicator() {
170172
}
171173

172174
@Configuration
173-
@ConditionalOnClass(JdbcTemplate.class)
175+
@ConditionalOnClass({ JdbcTemplate.class, AbstractRoutingDataSource.class })
174176
@ConditionalOnBean(DataSource.class)
175177
@ConditionalOnEnabledHealthIndicator("db")
176178
public static class DataSourcesHealthIndicatorConfiguration extends
@@ -186,10 +188,21 @@ public static class DataSourcesHealthIndicatorConfiguration extends
186188
public DataSourcesHealthIndicatorConfiguration(
187189
ObjectProvider<Map<String, DataSource>> dataSourcesProvider,
188190
ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProvidersProvider) {
189-
this.dataSources = dataSourcesProvider.getIfAvailable();
191+
this.dataSources = filterDataSources(dataSourcesProvider.getIfAvailable());
190192
this.metadataProviders = metadataProvidersProvider.getIfAvailable();
191193
}
192194

195+
private static Map<String, DataSource> filterDataSources(
196+
Map<String,DataSource> candidates) {
197+
Map<String,DataSource> dataSources = new LinkedHashMap<String, DataSource>();
198+
for (Map.Entry<String, DataSource> entry : candidates.entrySet()) {
199+
if (!(entry.getValue() instanceof AbstractRoutingDataSource)) {
200+
dataSources.put(entry.getKey(), entry.getValue());
201+
}
202+
}
203+
return dataSources;
204+
}
205+
193206
@Override
194207
public void afterPropertiesSet() throws Exception {
195208
this.poolMetadataProvider = new DataSourcePoolMetadataProviders(

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/HealthIndicatorAutoConfigurationTests.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
import org.junit.After;
2525
import org.junit.Test;
2626

27+
import org.springframework.beans.DirectFieldAccessor;
2728
import org.springframework.boot.actuate.health.ApplicationHealthIndicator;
2829
import org.springframework.boot.actuate.health.CassandraHealthIndicator;
30+
import org.springframework.boot.actuate.health.CompositeHealthIndicator;
2931
import org.springframework.boot.actuate.health.CouchbaseHealthIndicator;
3032
import org.springframework.boot.actuate.health.DataSourceHealthIndicator;
3133
import org.springframework.boot.actuate.health.DiskSpaceHealthIndicator;
@@ -61,6 +63,7 @@
6163
import org.springframework.context.annotation.Configuration;
6264
import org.springframework.data.cassandra.core.CassandraOperations;
6365
import org.springframework.data.couchbase.core.CouchbaseOperations;
66+
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
6467

6568
import static org.assertj.core.api.Assertions.assertThat;
6669
import static org.mockito.Mockito.mock;
@@ -226,6 +229,39 @@ public void dataSourceHealthIndicator() {
226229
.isEqualTo(DataSourceHealthIndicator.class);
227230
}
228231

232+
@Test
233+
public void dataSourceHealthIndicatorWithSeveralDataSources() {
234+
this.context.register(EmbeddedDataSourceConfiguration.class,
235+
DataSourceConfig.class, ManagementServerProperties.class,
236+
HealthIndicatorAutoConfiguration.class);
237+
EnvironmentTestUtils.addEnvironment(this.context,
238+
"management.health.diskspace.enabled:false");
239+
this.context.refresh();
240+
Map<String, HealthIndicator> beans = this.context
241+
.getBeansOfType(HealthIndicator.class);
242+
assertThat(beans).hasSize(1);
243+
HealthIndicator bean = beans.values().iterator().next();
244+
assertThat(bean).isExactlyInstanceOf(CompositeHealthIndicator.class);
245+
Map<String, HealthIndicator> indicators = (Map<String, HealthIndicator>)
246+
new DirectFieldAccessor(bean).getPropertyValue("indicators");
247+
assertThat(indicators).hasSize(2);
248+
}
249+
250+
@Test
251+
public void dataSourceHealthIndicatorWithAbstractRoutingDataSource() {
252+
this.context.register(EmbeddedDataSourceConfiguration.class,
253+
RoutingDatasourceConfig.class, ManagementServerProperties.class,
254+
HealthIndicatorAutoConfiguration.class);
255+
EnvironmentTestUtils.addEnvironment(this.context,
256+
"management.health.diskspace.enabled:false");
257+
this.context.refresh();
258+
Map<String, HealthIndicator> beans = this.context
259+
.getBeansOfType(HealthIndicator.class);
260+
assertThat(beans).hasSize(1);
261+
assertThat(beans.values().iterator().next().getClass())
262+
.isEqualTo(DataSourceHealthIndicator.class);
263+
}
264+
229265
@Test
230266
public void dataSourceHealthIndicatorWithCustomValidationQuery() {
231267
this.context.register(PropertyPlaceholderAutoConfiguration.class,
@@ -507,14 +543,24 @@ protected static class DataSourceConfig {
507543

508544
@Bean
509545
@ConfigurationProperties(prefix = "spring.datasource.test")
510-
public DataSource dataSource() {
546+
public DataSource testDataSource() {
511547
return DataSourceBuilder.create()
512548
.driverClassName("org.hsqldb.jdbc.JDBCDriver")
513549
.url("jdbc:hsqldb:mem:test").username("sa").build();
514550
}
515551

516552
}
517553

554+
@Configuration
555+
protected static class RoutingDatasourceConfig {
556+
557+
@Bean
558+
AbstractRoutingDataSource routingDataSource() {
559+
return mock(AbstractRoutingDataSource.class);
560+
}
561+
562+
}
563+
518564
@Configuration
519565
protected static class CustomHealthIndicator {
520566

0 commit comments

Comments
 (0)