Report compiler performance data to ES

This commit is contained in:
nataliya.valtman
2021-07-28 05:42:15 +03:00
parent 7357aeb1c9
commit 260d301100
20 changed files with 136 additions and 29 deletions
@@ -21,6 +21,7 @@ data class TaskData(
val path: String,
val typeFqName: String,
val timeMetrics: Map<String, Long>,
val performanceMetrics: Map<String, Long>,
val buildAttributes: Map<String, Int>,
val didWork: Boolean
) : Serializable {
@@ -9,10 +9,7 @@ import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.build.report.BuildReporter
import org.jetbrains.kotlin.build.report.ICReporter
import org.jetbrains.kotlin.build.report.metrics.BuildAttribute
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.BuildTime
import org.jetbrains.kotlin.build.report.metrics.*
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.incremental.*
import java.io.File
@@ -131,7 +128,8 @@ private object NoOpBuildReporter : BuildReporter(NoOpICReporter, NoOpBuildMetric
object NoOpBuildMetricsReporter : BuildMetricsReporter {
override fun startMeasure(time: BuildTime, startNs: Long) {}
override fun endMeasure(time: BuildTime, endNs: Long) {}
override fun addMetric(metric: BuildTime, value: Long) {}
override fun addTimeMetric(metric: BuildTime, durationMs: Long) {}
override fun addMetric(metric: BuildPerformanceMetric, value: Long) {}
override fun addAttribute(attribute: BuildAttribute) {}
override fun getMetrics(): BuildMetrics = BuildMetrics()
override fun addMetrics(metrics: BuildMetrics?) {}
@@ -60,7 +60,9 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics: L
return;
}
val taskExecutionResult = TaskExecutionResults[taskPath]
val statData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap() ?: emptyMap()
val timeData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap()?.filterValues { value -> value != 0L } ?: emptyMap()
val perfData = taskExecutionResult?.buildMetrics?.buildPerformanceMetrics?.asMap()?.mapValues { it.value / 1000 }
?.filterValues { value -> value != 0L } ?: emptyMap()
val changes = when (val changedFiles = taskExecutionResult?.taskInfo?.changedFiles) {
is ChangedFiles.Known -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
is ChangedFiles.Dependencies -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
@@ -69,7 +71,7 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics: L
}
val compileStatData = CompileStatData(
duration = duration, taskResult = taskResult.name, label = label,
statData = statData, projectName = projectName, taskName = taskPath, changes = changes,
timeData = timeData, perfData = perfData, projectName = projectName, taskName = taskPath, changes = changes,
tags = taskExecutionResult?.taskInfo?.properties?.map { it.name } ?: emptyList(),
nonIncrementalAttributes = taskExecutionResult?.buildMetrics?.buildAttributes?.asMap() ?: emptyMap(),
hostName = hostName, kotlinVersion = "1.6", buildUuid = buildUuid, timeInMillis = System.currentTimeMillis()
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.plugin.stat
import org.jetbrains.kotlin.build.report.metrics.BuildAttribute
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.BuildTime
data class CompileStatData(
@@ -22,7 +23,8 @@ data class CompileStatData(
val hostName: String = "Unset",
val timeInMillis: Long,
val nonIncrementalAttributes: Map<BuildAttribute, Int>,
val statData: Map<BuildTime, Long>
val timeData: Map<BuildTime, Long>,
val perfData: Map<BuildPerformanceMetric, Long>
)
interface ReportStatistics {
@@ -27,7 +27,8 @@ class ReportStatisticsToBuildScan(private val buildScan: BuildScanExtension, pri
data.changes.joinTo(readableString, prefix = "Changes: [", postfix = "]; ") { it.substringAfterLast(File.separator) }
readableString.append("Performance: [")
data.statData.forEach { (key, value) -> readableString.append(key.readableString).append(": ").append(value).append("ms, ") }
data.timeData.forEach { (key, value) -> readableString.append(key.readableString).append(": ").append(value).append("ms, ") }
data.perfData.forEach { (key, value) -> readableString.append(key.readableString).append(": ").append(value).append("kb, ") }
readableString.append("]; ")
return readableString.toString()
}
@@ -38,12 +38,14 @@ internal class MetricsWriter(
val path = data.task.path
val type = data.task::class.java.canonicalName
val buildTimes = data.buildMetrics.buildTimes.asMap().mapKeys { (k, _) -> k.name }
val buildPerfMetrics = data.buildMetrics.buildPerformanceMetrics.asMap().mapKeys { (k, _) -> k.name }
val buildAttributes = data.buildMetrics.buildAttributes.asMap().mapKeys { (k, _) -> k.name }
buildMetricsData.taskData[path] =
TaskData(
path = path,
typeFqName = type,
timeMetrics = buildTimes,
performanceMetrics = buildPerfMetrics,
buildAttributes = buildAttributes,
didWork = data.task.didWork
)
@@ -6,10 +6,7 @@
package org.jetbrains.kotlin.gradle.report
import org.gradle.api.logging.Logger
import org.jetbrains.kotlin.build.report.metrics.BuildAttributes
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.build.report.metrics.BuildTime
import org.jetbrains.kotlin.build.report.metrics.BuildTimes
import org.jetbrains.kotlin.build.report.metrics.*
import org.jetbrains.kotlin.gradle.report.data.BuildExecutionData
import org.jetbrains.kotlin.gradle.report.data.BuildExecutionDataProcessor
import org.jetbrains.kotlin.gradle.report.data.TaskExecutionData
@@ -62,6 +59,7 @@ internal class PlainTextBuildReportWriter(
if (!printMetrics) return
printBuildTimes(buildMetrics.buildTimes)
printBuildPerformanceMetrics(buildMetrics.buildPerformanceMetrics)
printBuildAttributes(buildMetrics.buildAttributes)
}
@@ -92,6 +90,18 @@ internal class PlainTextBuildReportWriter(
p.println()
}
private fun printBuildPerformanceMetrics(buildMetrics: BuildPerformanceMetrics) {
val allBuildMetrics = buildMetrics.asMap()
if (allBuildMetrics.isEmpty()) return
p.withIndent("Build performance metrics:") {
for (metric in BuildPerformanceMetric.values()) {
p.println("${metric.name}: ${allBuildMetrics[metric]}")
}
}
p.println()
}
private fun printBuildAttributes(buildAttributes: BuildAttributes) {
val allAttributes = buildAttributes.asMap()
if (allAttributes.isEmpty()) return
@@ -347,12 +347,12 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> : AbstractKotl
executeImpl(inputChanges)
metrics.measure(BuildTime.CALCULATE_OUTPUT_SIZE) {
metrics.addMetric(
BuildTime.SNAPSHOT_SIZE,
BuildPerformanceMetric.SNAPSHOT_SIZE,
taskBuildDirectory.file("build-history.bin").get().asFile.length() +
taskBuildDirectory.file("last-build.bin").get().asFile.length() +
taskBuildDirectory.file("abi-snapshot.bin").get().asFile.length()
)
metrics.addMetric(BuildTime.OUTPUT_SIZE,
metrics.addMetric(BuildPerformanceMetric.OUTPUT_SIZE,
taskBuildDirectory.dir("caches-jvm").get().asFileTree.files.filter { it.isFile }.map { it.length() }
.sum()
)