Skip to content

Commit 28f5392

Browse files
committed
Polish "Add health indicator for reactive MongoDB"
Closes gh-11997
1 parent eee2694 commit 28f5392

File tree

12 files changed

+116
-72
lines changed

12 files changed

+116
-72
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mongo/MongoHealthIndicatorAutoConfiguration.java

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,51 +16,32 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.mongo;
1818

19-
import java.util.Map;
20-
21-
import org.springframework.boot.actuate.autoconfigure.health.CompositeHealthIndicatorConfiguration;
2219
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
2320
import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
24-
import org.springframework.boot.actuate.health.HealthIndicator;
2521
import org.springframework.boot.actuate.mongo.MongoHealthIndicator;
2622
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2723
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2824
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
29-
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
30-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
31-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3225
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
26+
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
3327
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
34-
import org.springframework.context.annotation.Bean;
3528
import org.springframework.context.annotation.Configuration;
36-
import org.springframework.data.mongodb.core.MongoTemplate;
29+
import org.springframework.context.annotation.Import;
3730

3831
/**
3932
* {@link EnableAutoConfiguration Auto-configuration} for {@link MongoHealthIndicator}.
4033
*
4134
* @author Christian Dupuis
35+
* @author Stephane Nicoll
4236
* @since 2.0.0
4337
*/
4438
@Configuration
45-
@ConditionalOnClass(MongoTemplate.class)
46-
@ConditionalOnBean(MongoTemplate.class)
4739
@ConditionalOnEnabledHealthIndicator("mongo")
4840
@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)
49-
@AutoConfigureAfter({ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class })
50-
public class MongoHealthIndicatorAutoConfiguration extends
51-
CompositeHealthIndicatorConfiguration<MongoHealthIndicator, MongoTemplate> {
52-
53-
private final Map<String, MongoTemplate> mongoTemplates;
54-
55-
public MongoHealthIndicatorAutoConfiguration(
56-
Map<String, MongoTemplate> mongoTemplates) {
57-
this.mongoTemplates = mongoTemplates;
58-
}
59-
60-
@Bean
61-
@ConditionalOnMissingBean(name = "mongoHealthIndicator")
62-
public HealthIndicator mongoHealthIndicator() {
63-
return createHealthIndicator(this.mongoTemplates);
64-
}
41+
@AutoConfigureAfter({ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class,
42+
MongoReactiveDataAutoConfiguration.class })
43+
@Import({ MongoReactiveHealthIndicatorConfiguration.class,
44+
MongoHealthIndicatorConfiguration.class })
45+
public class MongoHealthIndicatorAutoConfiguration {
6546

6647
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright 2012-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.actuate.autoconfigure.mongo;
18+
19+
import java.util.Map;
20+
21+
import org.springframework.boot.actuate.autoconfigure.health.CompositeHealthIndicatorConfiguration;
22+
import org.springframework.boot.actuate.health.HealthIndicator;
23+
import org.springframework.boot.actuate.mongo.MongoHealthIndicator;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
27+
import org.springframework.context.annotation.Bean;
28+
import org.springframework.context.annotation.Configuration;
29+
import org.springframework.data.mongodb.core.MongoTemplate;
30+
31+
/**
32+
* Configuration for {@link MongoHealthIndicator}.
33+
*
34+
* @author Stephane Nicoll
35+
*/
36+
@Configuration
37+
@ConditionalOnClass(MongoTemplate.class)
38+
@ConditionalOnBean(MongoTemplate.class)
39+
class MongoHealthIndicatorConfiguration extends
40+
CompositeHealthIndicatorConfiguration<MongoHealthIndicator, MongoTemplate> {
41+
42+
private final Map<String, MongoTemplate> mongoTemplates;
43+
44+
MongoHealthIndicatorConfiguration(
45+
Map<String, MongoTemplate> mongoTemplates) {
46+
this.mongoTemplates = mongoTemplates;
47+
}
48+
49+
@Bean
50+
@ConditionalOnMissingBean(name = "mongoHealthIndicator")
51+
public HealthIndicator mongoHealthIndicator() {
52+
return createHealthIndicator(this.mongoTemplates);
53+
}
54+
55+
}
Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,48 +19,36 @@
1919
import java.util.Map;
2020

2121
import org.springframework.boot.actuate.autoconfigure.health.CompositeReactiveHealthIndicatorConfiguration;
22-
import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
23-
import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
2422
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
2523
import org.springframework.boot.actuate.mongo.MongoReactiveHealthIndicator;
26-
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
27-
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
28-
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2924
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3025
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3126
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
32-
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
3327
import org.springframework.context.annotation.Bean;
3428
import org.springframework.context.annotation.Configuration;
3529
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
3630

37-
38-
3931
/**
40-
* {@link EnableAutoConfiguration Auto-configuration} for {@link MongoReactiveHealthIndicator}.
32+
* Configuration for {@link MongoReactiveHealthIndicator}.
4133
*
42-
* @author Yulin Qin
43-
* @since 2.0.0
34+
* @author Stephane Nicoll
4435
*/
4536
@Configuration
4637
@ConditionalOnClass(ReactiveMongoTemplate.class)
4738
@ConditionalOnBean(ReactiveMongoTemplate.class)
48-
@ConditionalOnEnabledHealthIndicator("mongo")
49-
@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)
50-
@AutoConfigureAfter(MongoReactiveDataAutoConfiguration.class)
51-
public class MongoReactiveHealthIndicatorAutoConfiguration extends
39+
class MongoReactiveHealthIndicatorConfiguration extends
5240
CompositeReactiveHealthIndicatorConfiguration<MongoReactiveHealthIndicator, ReactiveMongoTemplate> {
5341

5442
private final Map<String, ReactiveMongoTemplate> reactiveMongoTemplate;
5543

56-
public MongoReactiveHealthIndicatorAutoConfiguration(
44+
MongoReactiveHealthIndicatorConfiguration(
5745
Map<String, ReactiveMongoTemplate> reactiveMongoTemplate) {
5846
this.reactiveMongoTemplate = reactiveMongoTemplate;
5947
}
6048

6149
@Bean
62-
@ConditionalOnMissingBean(name = "mongoReactiveHealthIndicator")
63-
public ReactiveHealthIndicator mongoReactiveHealthIndicator() {
50+
@ConditionalOnMissingBean(name = "mongoHealthIndicator")
51+
public ReactiveHealthIndicator mongoHealthIndicator() {
6452
return createHealthIndicator(this.reactiveMongoTemplate);
6553
}
6654

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ org.springframework.boot.actuate.autoconfigure.metrics.web.client.RestTemplateMe
5353
org.springframework.boot.actuate.autoconfigure.metrics.web.reactive.WebFluxMetricsAutoConfiguration,\
5454
org.springframework.boot.actuate.autoconfigure.metrics.web.servlet.WebMvcMetricsAutoConfiguration,\
5555
org.springframework.boot.actuate.autoconfigure.mongo.MongoHealthIndicatorAutoConfiguration,\
56-
org.springframework.boot.actuate.autoconfigure.mongo.MongoReactiveHealthIndicatorAutoConfiguration,\
5756
org.springframework.boot.actuate.autoconfigure.neo4j.Neo4jHealthIndicatorAutoConfiguration,\
5857
org.springframework.boot.actuate.autoconfigure.redis.RedisHealthIndicatorAutoConfiguration,\
5958
org.springframework.boot.actuate.autoconfigure.scheduling.ScheduledTasksEndpointAutoConfiguration,\

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration;
2727
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration;
2828
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
29+
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
2930
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration;
3031
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration;
3132
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
@@ -69,10 +70,11 @@ public void testChild() {
6970
@EnableAutoConfiguration(exclude = { ElasticsearchDataAutoConfiguration.class,
7071
ElasticsearchRepositoriesAutoConfiguration.class,
7172
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class,
72-
MongoDataAutoConfiguration.class, Neo4jDataAutoConfiguration.class,
73-
Neo4jRepositoriesAutoConfiguration.class, RedisAutoConfiguration.class,
74-
RedisRepositoriesAutoConfiguration.class, FlywayAutoConfiguration.class,
75-
JestAutoConfiguration.class, MetricsAutoConfiguration.class }, excludeName = {
73+
MongoDataAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class,
74+
Neo4jDataAutoConfiguration.class, Neo4jRepositoriesAutoConfiguration.class,
75+
RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class,
76+
FlywayAutoConfiguration.class, JestAutoConfiguration.class,
77+
MetricsAutoConfiguration.class }, excludeName = {
7678
"org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration" })
7779
public static class Child {
7880

@@ -81,10 +83,11 @@ public static class Child {
8183
@EnableAutoConfiguration(exclude = { ElasticsearchDataAutoConfiguration.class,
8284
ElasticsearchRepositoriesAutoConfiguration.class,
8385
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class,
84-
MongoDataAutoConfiguration.class, Neo4jDataAutoConfiguration.class,
85-
Neo4jRepositoriesAutoConfiguration.class, RedisAutoConfiguration.class,
86-
RedisRepositoriesAutoConfiguration.class, FlywayAutoConfiguration.class,
87-
JestAutoConfiguration.class, MetricsAutoConfiguration.class }, excludeName = {
86+
MongoDataAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class,
87+
Neo4jDataAutoConfiguration.class, Neo4jRepositoriesAutoConfiguration.class,
88+
RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class,
89+
FlywayAutoConfiguration.class, JestAutoConfiguration.class,
90+
MetricsAutoConfiguration.class }, excludeName = {
8891
"org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration" })
8992
public static class Parent {
9093

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integrationtest/WebEndpointsAutoConfigurationIntegrationTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration;
2929
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration;
3030
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
31+
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
3132
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration;
3233
import org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration;
3334
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
@@ -39,6 +40,7 @@
3940
import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration;
4041
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
4142
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
43+
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
4244
import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration;
4345
import org.springframework.boot.context.annotation.UserConfigurations;
4446
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
@@ -81,8 +83,10 @@ private ReactiveWebApplicationContextRunner reactiveWebRunner() {
8183
LiquibaseAutoConfiguration.class, CassandraAutoConfiguration.class,
8284
CassandraDataAutoConfiguration.class, Neo4jDataAutoConfiguration.class,
8385
Neo4jRepositoriesAutoConfiguration.class, MongoAutoConfiguration.class,
86+
MongoDataAutoConfiguration.class, MongoReactiveAutoConfiguration.class,
87+
MongoReactiveDataAutoConfiguration.class,
8488
RepositoryRestMvcAutoConfiguration.class, HazelcastAutoConfiguration.class,
85-
MongoDataAutoConfiguration.class, ElasticsearchAutoConfiguration.class,
89+
ElasticsearchAutoConfiguration.class,
8690
ElasticsearchDataAutoConfiguration.class, JestAutoConfiguration.class,
8791
SolrRepositoriesAutoConfiguration.class, SolrAutoConfiguration.class,
8892
RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@
3232
import static org.assertj.core.api.Assertions.assertThat;
3333

3434
/**
35-
* Tests for {@link MongoReactiveHealthIndicatorAutoConfiguration}
35+
* Tests for {@link MongoReactiveHealthIndicatorConfiguration}.
3636
*
3737
* @author Yulin Qin
3838
*/
39-
public class MongoReactiveHealthIndicatorAutoConfigurationTests {
39+
public class MongoReactiveHealthIndicatorConfigurationTests {
4040

4141
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4242
.withConfiguration(AutoConfigurations.of(
4343
MongoAutoConfiguration.class,
4444
MongoDataAutoConfiguration.class,
4545
MongoReactiveAutoConfiguration.class,
4646
MongoReactiveDataAutoConfiguration.class,
47-
MongoReactiveHealthIndicatorAutoConfiguration.class,
47+
MongoHealthIndicatorAutoConfiguration.class,
4848
HealthIndicatorAutoConfiguration.class));
4949

5050
@Test

spring-boot-project/spring-boot-actuator/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,16 @@
142142
<artifactId>liquibase-core</artifactId>
143143
<optional>true</optional>
144144
</dependency>
145+
<dependency>
146+
<groupId>org.mongodb</groupId>
147+
<artifactId>mongodb-driver-async</artifactId>
148+
<optional>true</optional>
149+
</dependency>
150+
<dependency>
151+
<groupId>org.mongodb</groupId>
152+
<artifactId>mongodb-driver-reactivestreams</artifactId>
153+
<optional>true</optional>
154+
</dependency>
145155
<dependency>
146156
<groupId>org.springframework</groupId>
147157
<artifactId>spring-jdbc</artifactId>

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/mongo/MongoReactiveHealthIndicator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
2626
import org.springframework.util.Assert;
2727

28-
29-
3028
/**
3129
* A {@link ReactiveHealthIndicator} for Mongo.
3230
*
@@ -44,12 +42,14 @@ public MongoReactiveHealthIndicator(ReactiveMongoTemplate reactiveMongoTemplate)
4442

4543
@Override
4644
protected Mono<Health> doHealthCheck(Health.Builder builder) {
47-
Mono<Document> documentMono = this.reactiveMongoTemplate.executeCommand("{ buildInfo: 1 }");
48-
return documentMono.map(document -> up(builder, document));
45+
Mono<Document> buildInfo = this.reactiveMongoTemplate.executeCommand(
46+
"{ buildInfo: 1 }");
47+
return buildInfo.map(document -> up(builder, document));
4948
}
5049

5150
private Health up(Health.Builder builder, Document document) {
5251
return builder.up().withDetail("version", document.getString("version")).build();
5352
}
53+
5454
}
5555

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/mongo/MongoReactiveHealthIndicatorTest.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@
3838
public class MongoReactiveHealthIndicatorTest {
3939

4040
@Test
41-
public void testMongoIsUp() throws Exception {
42-
Document document = mock(Document.class);
41+
public void testMongoIsUp() {
42+
Document buildInfo = mock(Document.class);
43+
given(buildInfo.getString("version")).willReturn("2.6.4");
4344
ReactiveMongoTemplate reactiveMongoTemplate = mock(ReactiveMongoTemplate.class);
44-
given(reactiveMongoTemplate.executeCommand("{ buildInfo: 1 }")).willReturn(Mono.just(document));
45-
given(document.getString("version")).willReturn("2.6.4");
45+
given(reactiveMongoTemplate.executeCommand("{ buildInfo: 1 }")).willReturn(
46+
Mono.just(buildInfo));
4647

4748
MongoReactiveHealthIndicator mongoReactiveHealthIndicator = new MongoReactiveHealthIndicator(reactiveMongoTemplate);
4849
Mono<Health> health = mongoReactiveHealthIndicator.health();
@@ -54,9 +55,10 @@ public void testMongoIsUp() throws Exception {
5455
}
5556

5657
@Test
57-
public void testMongoIsDown() throws Exception {
58+
public void testMongoIsDown() {
5859
ReactiveMongoTemplate reactiveMongoTemplate = mock(ReactiveMongoTemplate.class);
59-
given(reactiveMongoTemplate.executeCommand("{ buildInfo: 1 }")).willThrow(new MongoException("Connection failed"));
60+
given(reactiveMongoTemplate.executeCommand("{ buildInfo: 1 }")).willThrow(
61+
new MongoException("Connection failed"));
6062

6163
MongoReactiveHealthIndicator mongoReactiveHealthIndicator = new MongoReactiveHealthIndicator(reactiveMongoTemplate);
6264
Mono<Health> health = mongoReactiveHealthIndicator.health();
@@ -65,6 +67,6 @@ public void testMongoIsDown() throws Exception {
6567
assertThat(h.getDetails()).containsOnlyKeys("error");
6668
assertThat(h.getDetails().get("error")).isEqualTo("Connection failed");
6769
}).verifyComplete();
68-
6970
}
71+
7072
}

0 commit comments

Comments
 (0)