def buildMetricData()

in src/main/scala/com/gu/elasticsearchmonitor/CloudwatchMetrics.scala [31:66]


  def buildMetricData(clusterName: String, clusterHealth: ClusterHealth, nodeStats: NodeStats): List[MetricDatum] = {
    val now = Date() // consistent timestamp across metrics

    def elasticSearchStatusToDouble(status: String): Double = status match {
      case "green" => 0d
      case "yellow" => 1d
      case "red" => 2d
      case _ => 3d
    }
    val defaultDimensions = List("Cluster" -> clusterName)

    val clusterMetrics = List(
      metricDatum("NumberOfNodes", clusterHealth.numberOfNodes.toDouble, StandardUnit.Count, defaultDimensions, now),
      metricDatum("NumberOfDataNodes", clusterHealth.numberOfDataNodes.toDouble, StandardUnit.Count, defaultDimensions, now),
      metricDatum("Status", elasticSearchStatusToDouble(clusterHealth.status), StandardUnit.None, defaultDimensions, now))
    val nodeMetrics = nodeStats.nodes.flatMap { node =>
      val dimensions = defaultDimensions ++ List("InstanceId" -> node.name)
      List(
        metricDatum("AvailableDiskSpace", node.dataAvailable.toDouble, StandardUnit.Bytes, dimensions, now),
        metricDatum("TotalDiskSpace", node.dataTotal.toDouble, StandardUnit.Bytes, dimensions, now),
        metricDatum("JvmHeapUsage", node.jvmHeapUsedPercent.toDouble, StandardUnit.Percent, dimensions, now))
    }
    val dataNodes = nodeStats.nodes.filter(_.isDataNode)
    val aggregatedDataNodeMetrics = if (dataNodes.nonEmpty) {
      val minAvailableDiskSpace = dataNodes.minBy(_.dataAvailable).dataAvailable
      val sumAvailableDiskSpace = dataNodes.map(_.dataAvailable).sum
      val sumTotalDiskSpace = dataNodes.map(_.dataTotal).sum
      val maxJvmHeapUsage = dataNodes.maxBy(_.jvmHeapUsedPercent).jvmHeapUsedPercent
      List(
        metricDatum("MinAvailableDiskSpace", minAvailableDiskSpace.toDouble, StandardUnit.Bytes, defaultDimensions, now),
        metricDatum("SumAvailableDiskSpace", sumAvailableDiskSpace.toDouble, StandardUnit.Bytes, defaultDimensions, now),
        metricDatum("SumTotalDiskSpace", sumTotalDiskSpace.toDouble, StandardUnit.Bytes, defaultDimensions, now),
        metricDatum("MaxJvmHeapUsage", maxJvmHeapUsage.toDouble, StandardUnit.Bytes, defaultDimensions, now))
    } else Nil
    clusterMetrics ++ nodeMetrics ++ aggregatedDataNodeMetrics
  }