def S3LatencyList()

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))
  }