diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfiguration.java index 885c4e57de..73fe9e708b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jdbc.metadata.CompositeDataSourcePoolMetadataProvider; import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata; import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider; @@ -54,6 +55,7 @@ import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; * @author Andy Wilkinson * @author Stephane Nicoll * @author Arthur Kalimullin + * @author Julio Gomez * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) @@ -61,6 +63,7 @@ import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; @ConditionalOnBean(DataSource.class) @ConditionalOnEnabledHealthIndicator("db") @AutoConfigureAfter(DataSourceAutoConfiguration.class) +@EnableConfigurationProperties(DataSourceHealthIndicatorProperties.class) public class DataSourceHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration implements InitializingBean { @@ -80,7 +83,14 @@ public class DataSourceHealthContributorAutoConfiguration extends @Bean @ConditionalOnMissingBean(name = { "dbHealthIndicator", "dbHealthContributor" }) - public HealthContributor dbHealthContributor(Map dataSources) { + public HealthContributor dbHealthContributor(Map dataSources, + DataSourceHealthIndicatorProperties dataSourceHealthIndicatorProperties) { + if (dataSourceHealthIndicatorProperties.isIgnoreRoutingDataSources()) { + Map filteredDatasources = dataSources.entrySet().stream() + .filter((e) -> !(e.getValue() instanceof AbstractRoutingDataSource)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + return createContributor(filteredDatasources); + } return createContributor(dataSources); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorProperties.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorProperties.java new file mode 100644 index 0000000000..5efe2583e7 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorProperties.java @@ -0,0 +1,45 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.jdbc; + +import org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * External configuration properties for {@link DataSourceHealthIndicator}. + * + * @author Julio Gomez + * @since 2.4.0 + */ +@ConfigurationProperties(prefix = "management.health.db") +public class DataSourceHealthIndicatorProperties { + + /** + * Whether to ignore AbstractRoutingDataSources when creating database health + * indicators. + */ + private boolean ignoreRoutingDataSources = false; + + public boolean isIgnoreRoutingDataSources() { + return this.ignoreRoutingDataSources; + } + + public void setIgnoreRoutingDataSources(boolean ignoreRoutingDataSources) { + this.ignoreRoutingDataSources = ignoreRoutingDataSources; + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfigurationTests.java index a303852323..094e4d7e0e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthContributorAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,6 +44,7 @@ import static org.mockito.Mockito.mock; * Tests for {@link DataSourceHealthContributorAutoConfiguration}. * * @author Phillip Webb + * @author Julio Gomez */ class DataSourceHealthContributorAutoConfigurationTests { @@ -82,12 +83,30 @@ class DataSourceHealthContributorAutoConfigurationTests { }); } + @Test + void runWithRoutingAndEmbeddedDataSourceShouldNotIncludeRoutingDataSourceWhenIgnored() { + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, RoutingDatasourceConfig.class) + .withPropertyValues("management.health.db.ignore-routing-datasources:true").run((context) -> { + assertThat(context).doesNotHaveBean(CompositeHealthContributor.class); + assertThat(context).hasSingleBean(DataSourceHealthIndicator.class); + assertThat(context).doesNotHaveBean(RoutingDataSourceHealthIndicator.class); + }); + } + @Test void runWithOnlyRoutingDataSourceShouldIncludeRoutingDataSource() { this.contextRunner.withUserConfiguration(RoutingDatasourceConfig.class) .run((context) -> assertThat(context).hasSingleBean(RoutingDataSourceHealthIndicator.class)); } + @Test + void runWithOnlyRoutingDataSourceShouldCrashWhenIgnored() { + this.contextRunner.withUserConfiguration(RoutingDatasourceConfig.class) + .withPropertyValues("management.health.db.ignore-routing-datasources:true") + .run((context) -> assertThat(context).hasFailed().getFailure() + .hasRootCauseInstanceOf(IllegalArgumentException.class)); + } + @Test void runWithValidationQueryPropertyShouldUseCustomQuery() { this.contextRunner