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 9e035ebf7d6..cf4f87aa89b 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 39123a04915..45ba39a5b0e 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 8965a1a08d8..ede9c1353c0 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 7770ef70068..9343848a538 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 3bea0b712db..c239a83c3bc 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 3177a80eac6..6ec83dcb553 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 6ddd4863eff..4dc44d3c25a 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 ec588879254..4ac2cd9948e 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 081048afcd7..94d5495135f 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 f433176235e..b3cbe62b196 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 116d68af489..7268d9c53ef 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 8745f59fda1..d5a6e0f0cfe 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")); } }