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
}