From ab9c6018bf52272fd3b50fe60c7813330e56f172 Mon Sep 17 00:00:00 2001 From: Ludovic Claude <ludovic.claude54@gmail.com> Date: Fri, 12 Apr 2019 00:48:51 +0200 Subject: [PATCH] Add active ping to Woken to health checks --- src/main/java/eu/hbp/mip/StartupTasks.java | 6 ++++-- .../java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java | 11 +++++++++-- .../java/eu/hbp/mip/akka/WokenClientController.java | 11 +++++++---- src/main/java/eu/hbp/mip/controllers/DatasetsApi.java | 3 --- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/eu/hbp/mip/StartupTasks.java b/src/main/java/eu/hbp/mip/StartupTasks.java index acbf8f0c9..598e05b17 100644 --- a/src/main/java/eu/hbp/mip/StartupTasks.java +++ b/src/main/java/eu/hbp/mip/StartupTasks.java @@ -46,8 +46,10 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> LOGGER.info("Prefill variable repository with datasets..."); for (int i = 0; i < 5; i++) { try { + StringBuilder fetchedDatasets = new StringBuilder(); for (Dataset dataset : datasetsApi.fetchDatasets()) { final String code = dataset.id().code(); + fetchedDatasets.append(code).append(' '); Variable v = variableRepository.findOne(code); if (v == null) { LOGGER.info("Store additional variable {}", code); @@ -55,7 +57,7 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> variableRepository.save(v); } } - LOGGER.info("Datasets fetched from Woken"); + LOGGER.info("Datasets fetched from Woken: " + fetchedDatasets.toString()); variablesRepositoryOk = true; break; } catch (Exception e) { @@ -80,7 +82,7 @@ public class StartupTasks implements ApplicationListener<ApplicationReadyEvent> } */ - LOGGER.info("MIP Portal backend is ready!"); + LOGGER.info("[OK] MIP Portal backend is ready!"); } } diff --git a/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java b/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java index 8f4b05f99..1af3fdafc 100644 --- a/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java +++ b/src/main/java/eu/hbp/mip/akka/AkkaClusterHealthCheck.java @@ -1,14 +1,16 @@ package eu.hbp.mip.akka; import akka.cluster.Cluster; +import ch.chuv.lren.woken.messages.Ping; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; +import scala.Option; @Component -public class AkkaClusterHealthCheck implements HealthIndicator { +public class AkkaClusterHealthCheck extends WokenClientController implements HealthIndicator { @Autowired private Cluster wokenCluster; @@ -20,7 +22,12 @@ public class AkkaClusterHealthCheck implements HealthIndicator { } else if (!wokenCluster.state().allRoles().contains("woken")) { return Health.down().withDetail("Error", "Woken server cannot be seen in the cluster").build(); } - return Health.up().build(); + try { + askWoken(new Ping(Option.apply("woken")), 5); + return Health.up().build(); + } catch (Exception e) { + return Health.down().withDetail("Error", "Cannot reach Woken: " + e.toString()).build(); + } } } diff --git a/src/main/java/eu/hbp/mip/akka/WokenClientController.java b/src/main/java/eu/hbp/mip/akka/WokenClientController.java index a8bab66fa..e6ef3cdd7 100644 --- a/src/main/java/eu/hbp/mip/akka/WokenClientController.java +++ b/src/main/java/eu/hbp/mip/akka/WokenClientController.java @@ -6,6 +6,7 @@ import akka.cluster.pubsub.DistributedPubSub; import akka.cluster.pubsub.DistributedPubSubMediator; import akka.pattern.Patterns; import akka.util.Timeout; +import ch.chuv.lren.woken.messages.RemoteMessage; import ch.chuv.lren.woken.messages.query.Query; import ch.chuv.lren.woken.messages.query.QueryResult; import org.slf4j.Logger; @@ -36,18 +37,20 @@ public abstract class WokenClientController { private String wokenPath; @SuppressWarnings("unchecked") - protected <A, B> B askWoken(A message, int waitInSeconds) throws Exception { - LOGGER.info("Akka is trying to reach remote " + wokenPath); + protected <A extends RemoteMessage, B> B askWoken(A message, int waitInSeconds) throws Exception { + LOGGER.info("Trying to reach remote Akka actor " + wokenPath + "..."); DistributedPubSubMediator.Send queryMessage = new DistributedPubSubMediator.Send(wokenPath, message, false); Timeout timeout = new Timeout(Duration.create(waitInSeconds, "seconds")); Future<Object> future = Patterns.ask(wokenMediator(), queryMessage, timeout); - return (B) Await.result(future, timeout.duration()); + B result = (B) Await.result(future, timeout.duration()); + LOGGER.info("Akka actor returned a result for message of class " + message.getClass()); + return result; } - protected <A, B> ResponseEntity requestWoken(A message, int waitInSeconds, Function<B, ResponseEntity> handleResponse) { + protected <A extends RemoteMessage, B> ResponseEntity requestWoken(A message, int waitInSeconds, Function<B, ResponseEntity> handleResponse) { try { B result = askWoken(message, waitInSeconds); return handleResponse.apply(result); diff --git a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java index 7798b0ab9..c7bd005ae 100644 --- a/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java +++ b/src/main/java/eu/hbp/mip/controllers/DatasetsApi.java @@ -8,8 +8,6 @@ package eu.hbp.mip.controllers; import ch.chuv.lren.woken.messages.datasets.Dataset; import ch.chuv.lren.woken.messages.datasets.DatasetsQuery; import ch.chuv.lren.woken.messages.datasets.DatasetsResponse; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; import eu.hbp.mip.akka.WokenClientController; import eu.hbp.mip.model.DatasetDescription; import io.swagger.annotations.*; @@ -25,7 +23,6 @@ import scala.Option; import java.util.ArrayList; import java.util.List; -import java.util.Set; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; -- GitLab