in riff-raff/app/controllers/Testing.scala [261:299]
def S3LatencyList(csv: Boolean) = authAction { implicit request =>
val filter = DeployFilter.fromRequest
val pagination = PaginationView.fromRequest
val allDeploys = documentStoreConverter
.getDeployList(filter, pagination, fetchLog = true)
.logAndSquashException(Nil)
val times = allDeploys.map { deploy =>
val taskRunLines = deploy.messages.flatMap { message =>
message.stack.top match {
case StartContext(TaskRun(detail)) => Some(message -> detail)
case _ => None
}
}
log.info(s"got ${taskRunLines.length} lines")
val s3UploadTasks =
taskRunLines.dropWhile(!_._2.name.contains("S3Upload"))
val endOfS3UploadTasks =
s3UploadTasks.dropWhile(_._2.name.contains("S3Upload"))
val s3Start = s3UploadTasks.headOption.map(_._1.stack.time)
val s3End = endOfS3UploadTasks.headOption.map(_._1.stack.time)
deploy -> s3Start
.zip(s3End)
.map { case (start, end) => new Duration(start, end) }
.headOption
}
if (csv) {
val formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss")
val csvLines = s"Time,Project,S3 Duration" +:
times.map { case (deploy, duration) =>
s"${formatter.print(deploy.time)},${deploy.parameters.build.projectName},${duration.map(_.getStandardSeconds).getOrElse("")}"
}
Ok(csvLines.mkString("\n"))
.as("text/csv")
.withHeaders(
"Content-Disposition" -> "attachment; filename=s3Latencies.csv"
)
} else
Ok(views.html.test.s3Latencies(config, menu)(request, times))
}