Commit 556dee76 authored by Leonardo Menezes's avatar Leonardo Menezes
Browse files

consider initializing/relocating/unassigned shards as unhealthy

closes #90
parent 04df5226
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ object ClusterOverview {
            clusterSettings: JsValue, aliases: JsValue, clusterHealth: JsValue,
            nodesInfo: JsValue, main: JsValue): JsValue = {

    val indices = Indices(clusterState, indicesStats, aliases)
    val indices = buildIndices(clusterState, indicesStats, aliases)

    val masterNodeId = (clusterState \ "master_node").as[String]

@@ -47,4 +47,17 @@ object ClusterOverview {
      }.toSeq
    )

  def buildIndices(clusterState: JsValue, indicesStats: JsValue, aliases: JsValue): Seq[JsValue] = {
    val routingTable = (clusterState \ "routing_table" \ "indices").as[JsObject]
    val openIndices = routingTable.value.map { case (index, shards) =>
      val indexStats   = (indicesStats \ "indices" \ index).asOpt[JsObject].getOrElse(Json.obj())
      val indexAliases = (aliases \ index \ "aliases").asOpt[JsObject].getOrElse(Json.obj()) // 1.4 < does not return aliases obj

      Index(index, indexStats, shards, indexAliases)
    }.toSeq

    val closedIndices = ClosedIndices(clusterState)
    openIndices ++ closedIndices
  }

}
+43 −0
Original line number Diff line number Diff line
package models.overview

import play.api.libs.json._

object Index {

  def apply(name: String, stats: JsValue, shards: JsValue, aliases: JsObject): JsValue = {

    val shardsAllocation = (shards \ "shards").as[JsObject].values.flatMap {
      case JsArray(shards) => shards.map { shard =>
        (shard \ "node").asOpt[String].getOrElse("unassigned") -> shard
      }
      case _ => Nil
    }.groupBy(_._1).mapValues { shards => JsArray(shards.map(_._2).toSeq) }.toSeq

    val numShards = (shards \ "shards").as[JsObject].keys.size
    val numReplicas = (shards \ "shards" \ "0").as[JsArray].value.size - 1

    val special = name.startsWith(".")

    JsObject(Seq(
      "name"                -> JsString(name),
      "closed"              -> JsBoolean(false),
      "special"             -> JsBoolean(special),
      "unhealthy"           -> JsBoolean(unhealthyIndex(shardsAllocation)),
      "doc_count"           -> (stats \ "primaries" \ "docs" \ "count").asOpt[JsNumber].getOrElse(JsNumber(0)),
      "deleted_docs"        -> (stats \ "primaries" \ "docs" \ "deleted").asOpt[JsNumber].getOrElse(JsNumber(0)),
      "size_in_bytes"       -> (stats \ "primaries" \ "store" \ "size_in_bytes").asOpt[JsNumber].getOrElse(JsNumber(0)),
      "total_size_in_bytes" -> (stats \ "total" \ "store" \ "size_in_bytes").asOpt[JsNumber].getOrElse(JsNumber(0)),
      "aliases"             -> JsArray(aliases.keys.map(JsString(_)).toSeq), // 1.4 < does not return aliases obj
      "num_shards"          -> JsNumber(numShards),
      "num_replicas"        -> JsNumber(numReplicas),
      "shards"              -> JsObject(shardsAllocation)
    ))
  }

  private def unhealthyIndex(shardAllocation: Seq[(String, JsArray)]): Boolean =
    shardAllocation.exists {
      case ("unassigned", _)    => true
      case (_, JsArray(shards)) => shards.exists(!_.\("state").as[String].equals("STARTED"))
    }

}

app/models/overview/Indices.scala

deleted100644 → 0
+0 −42
Original line number Diff line number Diff line
package models.overview

import play.api.libs.json._

object Indices {

  def apply(clusterState: JsValue, indicesStats: JsValue, aliases: JsValue) = {
    val routingTable = (clusterState \ "routing_table" \ "indices").as[JsObject]
    val openIndices = routingTable.value.map { case (index, shards) =>
      val stats = (indicesStats \ "indices" \ index).asOpt[JsObject].getOrElse(Json.obj())
      val indexShards = (shards \ "shards").as[JsObject].values.flatMap { case shards =>
        shards.as[JsArray].value.map { instance =>
          (instance \ "node").asOpt[String].getOrElse("unassigned") -> instance
        }
      }.groupBy(_._1).mapValues { shards => JsArray(shards.map(_._2).toSeq) }.toSeq

      val numShards = (shards \ "shards").as[JsObject].keys.size
      val numReplicas = (shards \ "shards" \ "0").as[JsArray].value.size - 1

      val unhealthy = indexShards.find(_._1.equals("unassigned")).isDefined
      val special = index.startsWith(".")

      JsObject(Seq(
        "name"                -> JsString(index),
        "closed"              -> JsBoolean(false),
        "special"             -> JsBoolean(special),
        "unhealthy"           -> JsBoolean(unhealthy),
        "doc_count"           -> (stats \ "primaries" \ "docs" \ "count").asOpt[JsNumber].getOrElse(JsNumber(0)),
        "deleted_docs"        -> (stats \ "primaries" \ "docs" \ "deleted").asOpt[JsNumber].getOrElse(JsNumber(0)),
        "size_in_bytes"       -> (stats \ "primaries" \ "store" \ "size_in_bytes").asOpt[JsNumber].getOrElse(JsNumber(0)),
        "total_size_in_bytes" -> (stats \ "total" \ "store" \ "size_in_bytes").asOpt[JsNumber].getOrElse(JsNumber(0)),
        "aliases"             -> JsArray((aliases \ index \ "aliases").asOpt[JsObject].getOrElse(Json.obj()).keys.map(JsString(_)).toSeq), // 1.4 < does not return aliases obj
        "num_shards"          -> JsNumber(numShards),
        "num_replicas"        -> JsNumber(numReplicas),
        "shards"              -> JsObject(indexShards)
      ))
    }.toSeq

    openIndices ++ ClosedIndices(clusterState)
  }

}
+1 −1
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@
          <i class="fa fa-spinner fa-spin"> </i> {{initializing_shards}} initializing shards
        </div>
        <div>
          <span class="normal-action" ng-show="indices_filter.healthy" ng-click="indices_filter.healthy = false"><i><small>show only unhealthy indices</small></i></span>
          <span class="normal-action" ng-show="indices_filter.healthy" ng-click="indices_filter.healthy = false"><i><small>show only affected indices</small></i></span>
          <span class="normal-action" ng-hide="indices_filter.healthy" ng-click="indices_filter.healthy = true"><i><small>show all indices</small></i></span>
        </div>
      </td>