app/model/ElasticsearchStatsGroups.scala (31 lines of code) (raw):

package model import play.api.libs.json.{JsObject, JsValue} import lib.UptimeDisplay import org.joda.time.Duration object ElasticsearchStatsGroups { def parse(js: JsValue): List[Node] = { val JsObject(nodes) = (js \ "nodes").get nodes.toList.map { case (_, json) => Node(json) } } case class StatsGroup(name: String, queryTime: Long, queryCount: Long) { lazy val averageRequestTime = if (queryCount == 0) 0 else queryTime / queryCount lazy val humanTime = UptimeDisplay.print(new Duration(queryTime)) } object StatsGroup { def apply(name: String, v: JsValue): StatsGroup = StatsGroup(name, (v \ "query_time_in_millis").as[Long], (v \ "query_total").as[Long]) def withOverallTotal(s: List[StatsGroup]): List[StatsGroup] = { val total = StatsGroup("(overall)", s.map(_.queryTime).sum, s.map(_.queryCount).sum) total :: s.sortBy(- _.queryTime) } } case class Node(name: String, statsGroups: Seq[StatsGroup]) object Node { def apply(nodeInfo: JsValue): Node = { val nodeName = (nodeInfo \ "name").as[String] val JsObject(groupsJson) = (nodeInfo \ "indices" \ "search" \ "groups").get val stats = for ((name, groups) <- groupsJson) yield StatsGroup(name, groups) Node(nodeName, StatsGroup.withOverallTotal(stats.toList)) } } }