Skip to content

Commit 718bc72

Browse files
committed
Merge pull request #11997 from qinnnyul:add-health-indicator-for-reactive-mongo
* pr/11997: Polish "Add health indicator for reactive MongoDB" Add health indicator for reactive MongoDB
2 parents a02fdc7 + 28f5392 commit 718bc72

File tree

11 files changed

+351
-36
lines changed

11 files changed

+351
-36
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,16 @@
248248
<artifactId>liquibase-core</artifactId>
249249
<optional>true</optional>
250250
</dependency>
251+
<dependency>
252+
<groupId>org.mongodb</groupId>
253+
<artifactId>mongodb-driver-async</artifactId>
254+
<optional>true</optional>
255+
</dependency>
256+
<dependency>
257+
<groupId>org.mongodb</groupId>
258+
<artifactId>mongodb-driver-reactivestreams</artifactId>
259+
<optional>true</optional>
260+
</dependency>
251261
<dependency>
252262
<groupId>org.springframework</groupId>
253263
<artifactId>spring-jdbc</artifactId>

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+
}
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.CompositeReactiveHealthIndicatorConfiguration;
22+
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
23+
import org.springframework.boot.actuate.mongo.MongoReactiveHealthIndicator;
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.ReactiveMongoTemplate;
30+
31+
/**
32+
* Configuration for {@link MongoReactiveHealthIndicator}.
33+
*
34+
* @author Stephane Nicoll
35+
*/
36+
@Configuration
37+
@ConditionalOnClass(ReactiveMongoTemplate.class)
38+
@ConditionalOnBean(ReactiveMongoTemplate.class)
39+
class MongoReactiveHealthIndicatorConfiguration extends
40+
CompositeReactiveHealthIndicatorConfiguration<MongoReactiveHealthIndicator, ReactiveMongoTemplate> {
41+
42+
private final Map<String, ReactiveMongoTemplate> reactiveMongoTemplate;
43+
44+
MongoReactiveHealthIndicatorConfiguration(
45+
Map<String, ReactiveMongoTemplate> reactiveMongoTemplate) {
46+
this.reactiveMongoTemplate = reactiveMongoTemplate;
47+
}
48+
49+
@Bean
50+
@ConditionalOnMissingBean(name = "mongoHealthIndicator")
51+
public ReactiveHealthIndicator mongoHealthIndicator() {
52+
return createHealthIndicator(this.reactiveMongoTemplate);
53+
}
54+
55+
}

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,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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 org.junit.Test;
20+
21+
import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
22+
import org.springframework.boot.actuate.health.ApplicationHealthIndicator;
23+
import org.springframework.boot.actuate.mongo.MongoHealthIndicator;
24+
import org.springframework.boot.actuate.mongo.MongoReactiveHealthIndicator;
25+
import org.springframework.boot.autoconfigure.AutoConfigurations;
26+
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
27+
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
28+
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
29+
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
30+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
31+
32+
import static org.assertj.core.api.Assertions.assertThat;
33+
34+
/**
35+
* Tests for {@link MongoReactiveHealthIndicatorConfiguration}.
36+
*
37+
* @author Yulin Qin
38+
*/
39+
public class MongoReactiveHealthIndicatorConfigurationTests {
40+
41+
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
42+
.withConfiguration(AutoConfigurations.of(
43+
MongoAutoConfiguration.class,
44+
MongoDataAutoConfiguration.class,
45+
MongoReactiveAutoConfiguration.class,
46+
MongoReactiveDataAutoConfiguration.class,
47+
MongoHealthIndicatorAutoConfiguration.class,
48+
HealthIndicatorAutoConfiguration.class));
49+
50+
@Test
51+
public void runShouldCreateIndicator() {
52+
this.contextRunner.run(
53+
(context) -> assertThat(context).hasSingleBean(MongoReactiveHealthIndicator.class)
54+
.doesNotHaveBean(MongoHealthIndicator.class)
55+
.doesNotHaveBean(ApplicationHealthIndicator.class));
56+
}
57+
58+
@Test
59+
public void runWhenDisabledShouldNotCreateIndicator() {
60+
this.contextRunner.withPropertyValues("management.health.mongo.enabled:false")
61+
.run((context) -> assertThat(context)
62+
.doesNotHaveBean(MongoReactiveHealthIndicator.class)
63+
.doesNotHaveBean(MongoHealthIndicator.class)
64+
.hasSingleBean(ApplicationHealthIndicator.class));
65+
}
66+
67+
}

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>
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.mongo;
18+
19+
import org.bson.Document;
20+
import reactor.core.publisher.Mono;
21+
22+
import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator;
23+
import org.springframework.boot.actuate.health.Health;
24+
import org.springframework.boot.actuate.health.ReactiveHealthIndicator;
25+
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
26+
import org.springframework.util.Assert;
27+
28+
/**
29+
* A {@link ReactiveHealthIndicator} for Mongo.
30+
*
31+
* @author Yulin Qin
32+
* @since 2.0.0
33+
*/
34+
public class MongoReactiveHealthIndicator extends AbstractReactiveHealthIndicator {
35+
36+
private final ReactiveMongoTemplate reactiveMongoTemplate;
37+
38+
public MongoReactiveHealthIndicator(ReactiveMongoTemplate reactiveMongoTemplate) {
39+
Assert.notNull(reactiveMongoTemplate, "ReactiveMongoTemplate must not be null");
40+
this.reactiveMongoTemplate = reactiveMongoTemplate;
41+
}
42+
43+
@Override
44+
protected Mono<Health> doHealthCheck(Health.Builder builder) {
45+
Mono<Document> buildInfo = this.reactiveMongoTemplate.executeCommand(
46+
"{ buildInfo: 1 }");
47+
return buildInfo.map(document -> up(builder, document));
48+
}
49+
50+
private Health up(Health.Builder builder, Document document) {
51+
return builder.up().withDetail("version", document.getString("version")).build();
52+
}
53+
54+
}
55+

0 commit comments

Comments
 (0)