Improve extension of Neo4jHealthIndicator

This commit makes it easier to extend `Neo4jHealthIndicator` for cases
where a custom cypher needs to be executed.

Closes gh-11120
This commit is contained in:
Stephane Nicoll 2017-12-14 10:01:57 +01:00
parent 797ad13bfa
commit 41720ca93d
2 changed files with 42 additions and 3 deletions

View File

@ -17,29 +17,33 @@
package org.springframework.boot.actuate.autoconfigure.neo4j; package org.springframework.boot.actuate.autoconfigure.neo4j;
import org.junit.Test; import org.junit.Test;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory; import org.neo4j.ogm.session.SessionFactory;
import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
import org.springframework.boot.actuate.health.ApplicationHealthIndicator; import org.springframework.boot.actuate.health.ApplicationHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.neo4j.Neo4jHealthIndicator; import org.springframework.boot.actuate.neo4j.Neo4jHealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
/** /**
* Tests for {@link Neo4jHealthIndicatorAutoConfiguration}. * Tests for {@link Neo4jHealthIndicatorAutoConfiguration}.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Stephane Nicoll
*/ */
public class Neo4jHealthIndicatorAutoConfigurationTests { public class Neo4jHealthIndicatorAutoConfigurationTests {
private ApplicationContextRunner contextRunner = new ApplicationContextRunner() private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(Neo4jConfiguration.class, .withUserConfiguration(Neo4jConfiguration.class)
.withConfiguration(AutoConfigurations.of(
Neo4jHealthIndicatorAutoConfiguration.class, Neo4jHealthIndicatorAutoConfiguration.class,
HealthIndicatorAutoConfiguration.class)); HealthIndicatorAutoConfiguration.class));
@ -58,8 +62,19 @@ public class Neo4jHealthIndicatorAutoConfigurationTests {
.hasSingleBean(ApplicationHealthIndicator.class)); .hasSingleBean(ApplicationHealthIndicator.class));
} }
@Test
public void defaultIndicatorCanBeReplaced() {
this.contextRunner
.withUserConfiguration(CustomIndicatorConfiguration.class).run(
(context) -> {
assertThat(context).hasSingleBean(Neo4jHealthIndicator.class);
assertThat(context).doesNotHaveBean(ApplicationHealthIndicator.class);
Health health = context.getBean(Neo4jHealthIndicator.class).health();
assertThat(health.getDetails()).containsOnly(entry("test", true));
});
}
@Configuration @Configuration
@AutoConfigureBefore(Neo4jHealthIndicatorAutoConfiguration.class)
protected static class Neo4jConfiguration { protected static class Neo4jConfiguration {
@Bean @Bean
@ -69,4 +84,18 @@ public class Neo4jHealthIndicatorAutoConfigurationTests {
} }
@Configuration
protected static class CustomIndicatorConfiguration {
@Bean
public Neo4jHealthIndicator neo4jHealthIndicator(SessionFactory sessionFactory) {
return new Neo4jHealthIndicator(sessionFactory) {
@Override
protected void extractResult(Session session, Health.Builder builder) {
builder.up().withDetail("test", true);
}
};
}
}
} }

View File

@ -55,6 +55,16 @@ public class Neo4jHealthIndicator extends AbstractHealthIndicator {
@Override @Override
protected void doHealthCheck(Health.Builder builder) throws Exception { protected void doHealthCheck(Health.Builder builder) throws Exception {
Session session = this.sessionFactory.openSession(); Session session = this.sessionFactory.openSession();
extractResult(session, builder);
}
/**
* Provide health details using the specified {@link Session} and
* {@link Health.Builder Builder}.
* @param session the session to use to execute a cypher statement
* @param builder the builder to add details to
*/
protected void extractResult(Session session, Health.Builder builder) {
Result result = session.query(CYPHER, Collections.emptyMap()); Result result = session.query(CYPHER, Collections.emptyMap());
builder.up().withDetail("nodes", builder.up().withDetail("nodes",
result.queryResults().iterator().next().get("nodes")); result.queryResults().iterator().next().get("nodes"));