From 13d1d2393d4d12f33532a48a3f30864b402c452a Mon Sep 17 00:00:00 2001 From: Julio Gomez Diaz Date: Wed, 1 Jul 2020 23:12:00 +0200 Subject: [PATCH 1/2] Optionally ignore routing data sources when creating DB health indicators See gh-22222 --- ...rceHealthContributorAutoConfiguration.java | 11 ++++- .../DataSourceHealthIndicatorProperties.java | 44 +++++++++++++++++++ ...althContributorAutoConfigurationTests.java | 18 ++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorProperties.java 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..8c7e916722 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 @@ -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; @@ -61,6 +62,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 +82,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..997de32b4c --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorProperties.java @@ -0,0 +1,44 @@ +/* + * 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 the creation of health indicators for AbstractRoutingDatasource. + */ + 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..0f66699075 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 @@ -82,12 +82,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 From b627918011bc7a7de0122cd911630f664d5a8040 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 7 Jul 2020 09:42:36 +0100 Subject: [PATCH 2/2] Polish "Optionally ignore routing data sources when creating DB health indicators" See gh-22222 --- .../jdbc/DataSourceHealthContributorAutoConfiguration.java | 3 ++- .../jdbc/DataSourceHealthIndicatorProperties.java | 3 ++- .../DataSourceHealthContributorAutoConfigurationTests.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) 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 8c7e916722..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. @@ -55,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) 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 index 997de32b4c..5efe2583e7 100644 --- 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 @@ -29,7 +29,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class DataSourceHealthIndicatorProperties { /** - * Whether to ignore the creation of health indicators for AbstractRoutingDatasource. + * Whether to ignore AbstractRoutingDataSources when creating database health + * indicators. */ private boolean ignoreRoutingDataSources = false; 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 0f66699075..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 {