in app/model/ELB.scala [25:62]
def statistic(lbName: String)(metricName: String, statistics: Statistic*)(implicit conn: AmazonConnection) =
AWS.futureOf(conn.cloudWatch.getMetricStatisticsAsync, new GetMetricStatisticsRequest()
.withDimensions(new Dimension().withName("LoadBalancerName").withValue(lbName))
.withMetricName(metricName).withNamespace("AWS/ELB").withPeriod(60)
.withStatistics(statistics: _*)
.withStartTime(timeSpan(DateTime.now()).toDate).withEndTime(DateTime.now().toDate)
)
def latency(lbName: String)(implicit conn: AmazonConnection) =
statistic(lbName)("Latency", Average, Maximum)
def requestCount(lbName: String)(implicit conn: AmazonConnection) =
statistic(lbName)("RequestCount", Sum)
def errorCount(lbName: String)(implicit conn: AmazonConnection) =
statistic(lbName)("HTTPCode_Backend_5XX", Sum)
def forName(lbName: String)(implicit conn: AmazonConnection): Future[ELB] = for {
elbHealths <- AWS.futureOf(conn.elb.describeInstanceHealthAsync, new DescribeInstanceHealthRequest(lbName))
latency <- latency(lbName)
requestCount <- requestCount(lbName)
errorCount <- errorCount(lbName)
} yield {
val members = elbHealths.getInstanceStates.asScala.toList.map(i => ELBMember(
i.getInstanceId, i.getState,
Option(i.getDescription).filter(_ != "N/A"),
Option(i.getReasonCode).filter(_ != "N/A")
))
val active = requestCount.getDatapoints.asScala.nonEmpty && requestCount.getDatapoints.asScala.map(_.getSum).max > 10
val latencyInMs = latency.getDatapoints.asScala.toSeq.sortBy(_.getTimestamp).map(p =>
new Datapoint().withTimestamp(p.getTimestamp).withAverage(p.getAverage * 1000)
)
val start = extremeTime(latencyInMs)(_.minBy(_.getTimestamp))
val end = extremeTime(latencyInMs)(_.maxBy(_.getTimestamp))
ELB(lbName, members, latencyInMs, zeroFillPerMinute(start, end)(errorCount.getDatapoints.asScala.toSeq), active)
}