pekko/akka-remote-tests/src/multi-jvm/scala/akka/remote/artery/BenchmarkFileReporter.scala

86 lines
2.8 KiB
Scala

/**
* Copyright (C) 2016-2018 Lightbend Inc. <https://www.lightbend.com>
*/
package akka.remote.artery
import java.io.File
import java.nio.file.Files
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import akka.actor.ActorSystem
import scala.util.Try
/**
* Simple to file logger for benchmark results. Will log relevant settings first to make sure
* results can be understood later.
*/
trait BenchmarkFileReporter {
def testName: String
def reportResults(result: String): Unit
def close(): Unit
}
object BenchmarkFileReporter {
val targetDirectory = {
val target = new File("akka-stream-tests/target/benchmark-results")
target.mkdirs()
target
}
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")
def apply(test: String, system: ActorSystem): BenchmarkFileReporter =
new BenchmarkFileReporter {
override val testName = test
val gitCommit = {
import sys.process._
Try("git describe".!!.trim).getOrElse("[unknown]")
}
val testResultFile: File = {
val timestamp = formatter.format(LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()))
val fileName = s"$timestamp-Artery-$testName-$gitCommit-results.txt"
new File(targetDirectory, fileName)
}
val config = system.settings.config
val fos = Files.newOutputStream(testResultFile.toPath)
reportResults(s"Git commit: $gitCommit")
val settingsToReport =
Seq(
"akka.test.MaxThroughputSpec.totalMessagesFactor",
"akka.test.MaxThroughputSpec.real-message",
"akka.test.LatencySpec.totalMessagesFactor",
"akka.test.LatencySpec.repeatCount",
"akka.test.LatencySpec.real-message",
"akka.remote.artery.enabled",
"akka.remote.artery.advanced.inbound-lanes",
"akka.remote.artery.advanced.idle-cpu-level",
"akka.remote.artery.advanced.buffer-pool-size",
"akka.remote.artery.advanced.embedded-media-driver",
"akka.remote.default-remote-dispatcher.throughput",
"akka.remote.default-remote-dispatcher.fork-join-executor.parallelism-factor",
"akka.remote.default-remote-dispatcher.fork-join-executor.parallelism-min",
"akka.remote.default-remote-dispatcher.fork-join-executor.parallelism-max"
)
settingsToReport.foreach(reportSetting)
def reportResults(result: String): Unit = synchronized {
println(result)
fos.write(result.getBytes("utf8"))
fos.write('\n')
fos.flush()
}
def reportSetting(name: String): Unit = {
val value = if (config.hasPath(name)) config.getString(name) else "[unset]"
reportResults(s"$name: $value")
}
def close(): Unit = fos.close()
}
}