Use server version from database in Neo4j health details

See gh-27294
This commit is contained in:
Gerrit Meier
2021-07-12 16:49:47 +02:00
committed by Andy Wilkinson
parent 8db63db564
commit f7fd0ac527
6 changed files with 38 additions and 32 deletions

View File

@@ -33,14 +33,13 @@ class Neo4jHealthDetailsHandler {
/**
* Add health details for the specified {@link ResultSummary} and {@code edition}.
* @param builder the {@link Builder} to use
* @param version the version of the server
* @param edition the edition of the server
* @param resultSummary server information
*/
@SuppressWarnings("deprecation")
void addHealthDetails(Builder builder, String edition, ResultSummary resultSummary) {
void addHealthDetails(Builder builder, String version, String edition, ResultSummary resultSummary) {
ServerInfo serverInfo = resultSummary.server();
builder.up().withDetail("server", serverInfo.version() + "@" + serverInfo.address()).withDetail("edition",
edition);
builder.up().withDetail("server", version + "@" + serverInfo.address()).withDetail("edition", edition);
DatabaseInfo databaseInfo = resultSummary.database();
if (StringUtils.hasText(databaseInfo.name())) {
builder.withDetail("database", databaseInfo.name());

View File

@@ -20,6 +20,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.neo4j.driver.AccessMode;
import org.neo4j.driver.Driver;
import org.neo4j.driver.Record;
import org.neo4j.driver.Result;
import org.neo4j.driver.Session;
import org.neo4j.driver.SessionConfig;
@@ -46,7 +47,7 @@ public class Neo4jHealthIndicator extends AbstractHealthIndicator {
/**
* The Cypher statement used to verify Neo4j is up.
*/
static final String CYPHER = "CALL dbms.components() YIELD name, edition WHERE name = 'Neo4j Kernel' RETURN edition";
static final String CYPHER = "CALL dbms.components() YIELD versions, name, edition WHERE name = 'Neo4j Kernel' RETURN edition, versions[0] as version";
/**
* Message logged before retrying a health check.
@@ -91,9 +92,11 @@ public class Neo4jHealthIndicator extends AbstractHealthIndicator {
// all possible workloads
try (Session session = this.driver.session(DEFAULT_SESSION_CONFIG)) {
Result result = session.run(CYPHER);
String edition = result.single().get("edition").asString();
Record record = result.single();
String edition = record.get("edition").asString();
String version = record.get("version").asString();
ResultSummary resultSummary = result.consume();
this.healthDetailsHandler.addHealthDetails(builder, edition, resultSummary);
this.healthDetailsHandler.addHealthDetails(builder, version, edition, resultSummary);
}
}

View File

@@ -25,6 +25,7 @@ import org.neo4j.driver.reactive.RxSession;
import org.neo4j.driver.summary.ResultSummary;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuples;
import reactor.util.retry.Retry;
import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator;
@@ -58,18 +59,21 @@ public final class Neo4jReactiveHealthIndicator extends AbstractReactiveHealthIn
.doOnError(SessionExpiredException.class,
(e) -> logger.warn(Neo4jHealthIndicator.MESSAGE_SESSION_EXPIRED))
.retryWhen(Retry.max(1).filter(SessionExpiredException.class::isInstance)).map((result) -> {
this.healthDetailsHandler.addHealthDetails(builder, result.getT1(), result.getT2());
this.healthDetailsHandler.addHealthDetails(builder, result.getT1().getT1(), result.getT1().getT2(),
result.getT2());
return builder.build();
});
}
Mono<Tuple2<String, ResultSummary>> runHealthCheckQuery() {
Mono<Tuple2<Tuple2<String, String>, ResultSummary>> runHealthCheckQuery() {
// We use WRITE here to make sure UP is returned for a server that supports
// all possible workloads
return Mono.using(() -> this.driver.rxSession(Neo4jHealthIndicator.DEFAULT_SESSION_CONFIG), (session) -> {
RxResult result = session.run(Neo4jHealthIndicator.CYPHER);
return Mono.from(result.records()).map((record) -> record.get("edition").asString())
.zipWhen((edition) -> Mono.from(result.consume()));
return Mono.from(result.records())
.flatMap((record) -> Mono
.just(Tuples.of(record.get("version").asString(), record.get("edition").asString()))
.zipWhen((edition) -> Mono.from(result.consume())));
}, RxSession::close);
}