From d7652e8f144dbc19d501e95452e6f802e4707fc6 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 28 Oct 2019 12:24:09 +0100 Subject: [PATCH] Make sure Reactive health indicators take precedence This commit restores the highest precedence of reactive HealthContributor over imperative one. Previously, both would be registered, leading to duplicate entries in health output. Closes gh-18748 --- ...ssandraHealthContributorAutoConfiguration.java | 3 ++- ...eactiveHealthContributorAutoConfiguration.java | 4 ++-- ...uchbaseHealthContributorAutoConfiguration.java | 4 ++-- ...eactiveHealthContributorAutoConfiguration.java | 4 ++-- .../MongoHealthContributorAutoConfiguration.java | 3 ++- ...eactiveHealthContributorAutoConfiguration.java | 5 ++--- .../RedisHealthContributorAutoConfiguration.java | 2 +- ...eactiveHealthContributorAutoConfiguration.java | 4 ++-- ...veHealthContributorAutoConfigurationTests.java | 15 +++++++++++++-- ...veHealthContributorAutoConfigurationTests.java | 12 ++++++++++-- ...veHealthContributorAutoConfigurationTests.java | 11 +++++++++-- ...veHealthContributorAutoConfigurationTests.java | 14 ++++++++++---- 12 files changed, 57 insertions(+), 24 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java index 9e035ebf7d..cf4f87aa89 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java @@ -47,7 +47,8 @@ import org.springframework.data.cassandra.core.CassandraOperations; @ConditionalOnClass({ Cluster.class, CassandraOperations.class }) @ConditionalOnBean(CassandraOperations.class) @ConditionalOnEnabledHealthIndicator("cassandra") -@AutoConfigureAfter({ CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class }) +@AutoConfigureAfter({ CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class, + CassandraReactiveHealthContributorAutoConfiguration.class }) public class CassandraHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java index 39123a0491..45ba39a5b0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java @@ -51,8 +51,8 @@ public class CassandraReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { @Bean - @ConditionalOnMissingBean(name = { "cassandraReactiveHealthIndicator", "cassandraReactiveHealthContributor" }) - public ReactiveHealthContributor cassandraReactiveHealthContributor( + @ConditionalOnMissingBean(name = { "cassandraHealthIndicator", "cassandraHealthContributor" }) + public ReactiveHealthContributor cassandraHealthContributor( Map reactiveCassandraOperations) { return createContributor(reactiveCassandraOperations); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java index 8965a1a08d..ede9c1353c 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java @@ -45,12 +45,12 @@ import org.springframework.context.annotation.Configuration; @ConditionalOnClass(Cluster.class) @ConditionalOnBean(Cluster.class) @ConditionalOnEnabledHealthIndicator("couchbase") -@AutoConfigureAfter({ CouchbaseAutoConfiguration.class }) +@AutoConfigureAfter({ CouchbaseAutoConfiguration.class, CouchbaseReactiveHealthContributorAutoConfiguration.class }) public class CouchbaseHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { @Bean - @ConditionalOnMissingBean(name = { "couchbaseHealthContributor", "couchbaseHealthContributor" }) + @ConditionalOnMissingBean(name = { "couchbaseHealthIndicator", "couchbaseHealthContributor" }) public HealthContributor couchbaseHealthContributor(Map clusters) { return createContributor(clusters); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java index 7770ef7006..9343848a53 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java @@ -50,8 +50,8 @@ public class CouchbaseReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { @Bean - @ConditionalOnMissingBean(name = { "couchbaseReactiveHealthIndicator", "couchbaseReactiveHealthContributor" }) - public ReactiveHealthContributor couchbaseReactiveHealthContributor(Map clusters) { + @ConditionalOnMissingBean(name = { "couchbaseHealthIndicator", "couchbaseHealthContributor" }) + public ReactiveHealthContributor couchbaseHealthContributor(Map clusters) { return createContributor(clusters); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoHealthContributorAutoConfiguration.java index 3bea0b712d..c239a83c3b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoHealthContributorAutoConfiguration.java @@ -43,7 +43,8 @@ import org.springframework.data.mongodb.core.MongoTemplate; @ConditionalOnClass(MongoTemplate.class) @ConditionalOnBean(MongoTemplate.class) @ConditionalOnEnabledHealthIndicator("mongo") -@AutoConfigureAfter({ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class }) +@AutoConfigureAfter({ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + MongoReactiveHealthContributorAutoConfiguration.class }) public class MongoHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfiguration.java index 3177a80eac..6ec83dcb55 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfiguration.java @@ -50,9 +50,8 @@ public class MongoReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { @Bean - @ConditionalOnMissingBean(name = { "mongoReactiveHealthIndicator", "mongoReactiveHealthContributor" }) - public ReactiveHealthContributor mongoReactiveHealthContributor( - Map reactiveMongoTemplates) { + @ConditionalOnMissingBean(name = { "mongoHealthIndicator", "mongoHealthContributor" }) + public ReactiveHealthContributor mongoHealthContributor(Map reactiveMongoTemplates) { return createContributor(reactiveMongoTemplates); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisHealthContributorAutoConfiguration.java index 6ddd4863ef..4dc44d3c25 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisHealthContributorAutoConfiguration.java @@ -45,7 +45,7 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; @ConditionalOnClass(RedisConnectionFactory.class) @ConditionalOnBean(RedisConnectionFactory.class) @ConditionalOnEnabledHealthIndicator("redis") -@AutoConfigureAfter(RedisAutoConfiguration.class) +@AutoConfigureAfter({ RedisAutoConfiguration.class, RedisReactiveHealthContributorAutoConfiguration.class }) public class RedisHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfiguration.java index ec58887925..4ac2cd9948 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfiguration.java @@ -60,8 +60,8 @@ public class RedisReactiveHealthContributorAutoConfiguration extends } @Bean - @ConditionalOnMissingBean(name = { "redisReactiveHealthIndicator", "redisReactiveHealthContributor" }) - public ReactiveHealthContributor redisReactiveHealthContributor() { + @ConditionalOnMissingBean(name = { "redisHealthIndicator", "redisHealthContributor" }) + public ReactiveHealthContributor redisHealthContributor() { return createContributor(this.redisConnectionFactories); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfigurationTests.java index 081048afcd..94d5495135 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfigurationTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cassandra; import org.junit.jupiter.api.Test; +import org.springframework.boot.actuate.autoconfigure.cassandra.CassandraHealthContributorAutoConfigurationTests.CassandraConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration; import org.springframework.boot.actuate.cassandra.CassandraHealthIndicator; import org.springframework.boot.actuate.cassandra.CassandraReactiveHealthIndicator; @@ -44,13 +45,23 @@ class CassandraReactiveHealthContributorAutoConfigurationTests { @Test void runShouldCreateIndicator() { this.contextRunner.run((context) -> assertThat(context).hasSingleBean(CassandraReactiveHealthIndicator.class) - .doesNotHaveBean(CassandraHealthIndicator.class)); + .hasBean("cassandraHealthContributor")); + } + + @Test + void runWithRegularIndicatorShouldOnlyCreateReactiveIndicator() { + this.contextRunner + .withConfiguration(AutoConfigurations.of(CassandraConfiguration.class, + CassandraHealthContributorAutoConfiguration.class)) + .run((context) -> assertThat(context).hasSingleBean(CassandraReactiveHealthIndicator.class) + .hasBean("cassandraHealthContributor").doesNotHaveBean(CassandraHealthIndicator.class)); } @Test void runWhenDisabledShouldNotCreateIndicator() { this.contextRunner.withPropertyValues("management.health.cassandra.enabled:false") - .run((context) -> assertThat(context).doesNotHaveBean(CassandraReactiveHealthIndicator.class)); + .run((context) -> assertThat(context).doesNotHaveBean(CassandraReactiveHealthIndicator.class) + .doesNotHaveBean("cassandraHealthContributor")); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfigurationTests.java index f433176235..b3cbe62b19 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfigurationTests.java @@ -43,13 +43,21 @@ class CouchbaseReactiveHealthContributorAutoConfigurationTests { @Test void runShouldCreateIndicator() { this.contextRunner.run((context) -> assertThat(context).hasSingleBean(CouchbaseReactiveHealthIndicator.class) - .doesNotHaveBean(CouchbaseHealthIndicator.class)); + .hasBean("couchbaseHealthContributor")); + } + + @Test + void runWithRegularIndicatorShouldOnlyCreateReactiveIndicator() { + this.contextRunner.withConfiguration(AutoConfigurations.of(CouchbaseHealthContributorAutoConfiguration.class)) + .run((context) -> assertThat(context).hasSingleBean(CouchbaseReactiveHealthIndicator.class) + .hasBean("couchbaseHealthContributor").doesNotHaveBean(CouchbaseHealthIndicator.class)); } @Test void runWhenDisabledShouldNotCreateIndicator() { this.contextRunner.withPropertyValues("management.health.couchbase.enabled:false") - .run((context) -> assertThat(context).doesNotHaveBean(CouchbaseReactiveHealthIndicator.class)); + .run((context) -> assertThat(context).doesNotHaveBean(CouchbaseReactiveHealthIndicator.class) + .doesNotHaveBean("couchbaseHealthContributor")); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfigurationTests.java index 116d68af48..7268d9c53e 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoReactiveHealthContributorAutoConfigurationTests.java @@ -45,14 +45,21 @@ class MongoReactiveHealthContributorAutoConfigurationTests { @Test void runShouldCreateIndicator() { this.contextRunner.run((context) -> assertThat(context).hasSingleBean(MongoReactiveHealthIndicator.class) - .doesNotHaveBean(MongoHealthIndicator.class)); + .hasBean("mongoHealthContributor")); + } + + @Test + void runWithRegularIndicatorShouldOnlyCreateReactiveIndicator() { + this.contextRunner.withConfiguration(AutoConfigurations.of(MongoHealthContributorAutoConfiguration.class)) + .run((context) -> assertThat(context).hasSingleBean(MongoReactiveHealthIndicator.class) + .hasBean("mongoHealthContributor").doesNotHaveBean(MongoHealthIndicator.class)); } @Test void runWhenDisabledShouldNotCreateIndicator() { this.contextRunner.withPropertyValues("management.health.mongo.enabled:false") .run((context) -> assertThat(context).doesNotHaveBean(MongoReactiveHealthIndicator.class) - .doesNotHaveBean(MongoHealthIndicator.class)); + .doesNotHaveBean("mongoHealthContributor")); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfigurationTests.java index 8745f59fda..d5a6e0f0cf 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/redis/RedisReactiveHealthContributorAutoConfigurationTests.java @@ -40,16 +40,22 @@ class RedisReactiveHealthContributorAutoConfigurationTests { @Test void runShouldCreateIndicator() { - this.contextRunner.run( - (context) -> assertThat(context).hasSingleBean(RedisReactiveHealthContributorAutoConfiguration.class) - .doesNotHaveBean(RedisHealthIndicator.class)); + this.contextRunner.run((context) -> assertThat(context).hasSingleBean(RedisReactiveHealthIndicator.class) + .hasBean("redisHealthContributor")); + } + + @Test + void runWithRegularIndicatorShouldOnlyCreateReactiveIndicator() { + this.contextRunner.withConfiguration(AutoConfigurations.of(RedisHealthContributorAutoConfiguration.class)) + .run((context) -> assertThat(context).hasSingleBean(RedisReactiveHealthIndicator.class) + .hasBean("redisHealthContributor").doesNotHaveBean(RedisHealthIndicator.class)); } @Test void runWhenDisabledShouldNotCreateIndicator() { this.contextRunner.withPropertyValues("management.health.redis.enabled:false") .run((context) -> assertThat(context).doesNotHaveBean(RedisReactiveHealthIndicator.class) - .doesNotHaveBean(RedisHealthIndicator.class)); + .doesNotHaveBean("redisHealthContributor")); } }