From 282ac1f432bb8f8818a5daa6a83d7f172714f441 Mon Sep 17 00:00:00 2001
From: Leonardo Menezes <mail@lmenezes.com>
Date: Mon, 16 Oct 2017 10:59:17 +0200
Subject: [PATCH] created data service for cluster overview

---
 .../ClusterOverviewController.scala           | 32 ++----------
 app/models/overview/ClusterOverview.scala     |  3 +-
 .../overview/OverviewDataService.scala        | 51 +++++++++++++++++++
 3 files changed, 55 insertions(+), 31 deletions(-)
 create mode 100644 app/services/overview/OverviewDataService.scala

diff --git a/app/controllers/ClusterOverviewController.scala b/app/controllers/ClusterOverviewController.scala
index 5d253db..cf201b5 100644
--- a/app/controllers/ClusterOverviewController.scala
+++ b/app/controllers/ClusterOverviewController.scala
@@ -6,44 +6,18 @@ import controllers.auth.AuthenticationModule
 import elastic.{ElasticClient, Error}
 import models.overview.ClusterOverview
 import models.{CerebroResponse, Hosts, ShardStats}
+import services.overview.OverviewDataService
 
 import scala.concurrent.ExecutionContext.Implicits.global
 import scala.concurrent.Future
 
 class ClusterOverviewController @Inject()(val authentication: AuthenticationModule,
                                           val hosts: Hosts,
+                                          val service: OverviewDataService,
                                           client: ElasticClient) extends BaseController {
 
   def index = process { request =>
-    Future.sequence(
-      Seq(
-        client.clusterState(request.target),
-        client.nodesStats(Seq("jvm","fs","os","process"), request.target),
-        client.indicesStats(request.target),
-        client.clusterSettings(request.target),
-        client.aliases(request.target),
-        client.clusterHealth(request.target),
-        client.nodes(Seq("os","jvm"), request.target),
-        client.main(request.target)
-      )
-    ).map { responses =>
-      val failed = responses.find(_.isInstanceOf[Error])
-      failed match {
-        case Some(f) => CerebroResponse(f.status, f.body)
-        case None =>
-          val overview = ClusterOverview(
-            responses(0).body,
-            responses(1).body,
-            responses(2).body,
-            responses(3).body,
-            responses(4).body,
-            responses(5).body,
-            responses(6).body,
-            responses(7).body
-          )
-          CerebroResponse(200, overview)
-      }
-    }
+    service.overview(request.target).map(CerebroResponse(200, _))
   }
 
   def disableShardAllocation = process { request =>
diff --git a/app/models/overview/ClusterOverview.scala b/app/models/overview/ClusterOverview.scala
index e53e930..4326cf0 100644
--- a/app/models/overview/ClusterOverview.scala
+++ b/app/models/overview/ClusterOverview.scala
@@ -6,8 +6,7 @@ object ClusterOverview {
 
   def apply(clusterState: JsValue, nodesStats: JsValue, indicesStats: JsValue,
             clusterSettings: JsValue, aliases: JsValue, clusterHealth: JsValue,
-            nodesInfo: JsValue, main: JsValue): JsValue = {
-
+            nodesInfo: JsValue): JsValue = {
     val indices = buildIndices(clusterState, indicesStats, aliases)
 
     val masterNodeId = (clusterState \ "master_node").as[String]
diff --git a/app/services/overview/OverviewDataService.scala b/app/services/overview/OverviewDataService.scala
new file mode 100644
index 0000000..aa6b1df
--- /dev/null
+++ b/app/services/overview/OverviewDataService.scala
@@ -0,0 +1,51 @@
+package services.overview
+
+import com.google.inject.Inject
+import elastic.{ElasticClient, Error}
+import models.ElasticServer
+import models.overview.ClusterOverview
+import play.api.libs.json.JsValue
+import services.exception.RequestFailedException
+
+import scala.concurrent.ExecutionContext.Implicits.global
+import scala.concurrent.Future
+
+class OverviewDataService @Inject()(client: ElasticClient) {
+
+  def overview(target: ElasticServer): Future[JsValue] = {
+    val apis = Seq(
+      "_cluster/state/master_node,routing_table,routing_nodes,blocks",
+      "_nodes/stats/jvm,fs,os,process?human=true",
+      "_stats/docs,store",
+      "_cluster/settings",
+      "_aliases",
+      "_cluster/health",
+      s"_nodes/_all/os,jvm?human=true",
+      ""
+    )
+
+    val start = System.currentTimeMillis()
+    Future.sequence(apis.map(client.executeRequest("GET", _, None, target))).map { responses =>
+      responses.zipWithIndex.find(_._1.isInstanceOf[Error]) match {
+        case Some((failed, idx)) =>
+          throw RequestFailedException(apis(idx), failed.status, failed.body.toString())
+
+        case None =>
+          val end = System.currentTimeMillis()
+          val overview = ClusterOverview(
+            responses(0).body,
+            responses(1).body,
+            responses(2).body,
+            responses(3).body,
+            responses(4).body,
+            responses(5).body,
+            responses(6).body,
+            responses(7).body
+          )
+          println(s"Requesting took [${end - start}]")
+          overview
+      }
+    }
+  }
+
+}
-- 
GitLab