diff --git a/app/controllers/ClusterOverviewController.scala b/app/controllers/ClusterOverviewController.scala index 5d253dbeab671cf1603649dbd975b72dac73c14c..cf201b58a78ebc7e3f314c00bb0a095191c8954f 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 e53e9307c945a0a6ea7cca1a2f607c4726f70c9d..4326cf01693ad357c387a209ecee58accb44ad85 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 0000000000000000000000000000000000000000..aa6b1df940378679750cc68a3c0c2e8f271045d5 --- /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 + } + } + } + +}