From 260d301100a7dc9f4c5188ee46383e8ad46a1525 Mon Sep 17 00:00:00 2001 From: "nataliya.valtman" Date: Wed, 28 Jul 2021 05:42:15 +0300 Subject: [PATCH] Report compiler performance data to ES --- .../build/report/metrics/BuildMetrics.kt | 2 ++ .../report/metrics/BuildMetricsReporter.kt | 4 ++- .../metrics/BuildMetricsReporterImpl.kt | 11 +++++-- .../report/metrics/BuildPerformanceMetric.kt | 25 ++++++++++++++++ .../report/metrics/BuildPerformanceMetrics.kt | 30 +++++++++++++++++++ .../kotlin/build/report/metrics/BuildTime.kt | 7 +++-- .../metrics/DoNothingBuildMetricsReporter.kt | 6 +++- .../builtins/BuiltInsSerializer.kt | 3 ++ .../kotlin/daemon/CompileServiceImpl.kt | 7 ++++- .../incremental/IncrementalCompilerRunner.kt | 15 ++++++++-- .../IncrementalJsCompilerRunner.kt | 6 ++-- .../IncrementalJvmCompilerRunner.kt | 3 +- .../build/metrics/GradleBuildMetricsData.kt | 1 + .../incremental/ClasspathChangesComputer.kt | 8 ++--- .../statistics/KotlinBuildEsStatListener.kt | 6 ++-- .../plugin/statistics/ReportStatistics.kt | 4 ++- .../statistics/ReportStatisticsToBuildScan.kt | 3 +- .../kotlin/gradle/report/MetricsWriter.kt | 2 ++ .../report/PlainTextBuildReportWriter.kt | 18 ++++++++--- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 4 +-- 20 files changed, 136 insertions(+), 29 deletions(-) create mode 100644 build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt create mode 100644 build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetrics.kt diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetrics.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetrics.kt index 94c48e07579..68d92fe9d00 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetrics.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetrics.kt @@ -9,10 +9,12 @@ import java.io.Serializable data class BuildMetrics( val buildTimes: BuildTimes = BuildTimes(), + val buildPerformanceMetrics: BuildPerformanceMetrics = BuildPerformanceMetrics(), val buildAttributes: BuildAttributes = BuildAttributes() ) : Serializable { fun addAll(other: BuildMetrics) { buildTimes.addAll(other.buildTimes) + buildPerformanceMetrics.addAll(other.buildPerformanceMetrics) buildAttributes.addAll(other.buildAttributes) } diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporter.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporter.kt index a633b8319c6..65555b8c0bd 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporter.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporter.kt @@ -8,7 +8,9 @@ package org.jetbrains.kotlin.build.report.metrics interface BuildMetricsReporter { fun startMeasure(time: BuildTime, startNs: Long) fun endMeasure(time: BuildTime, endNs: Long) - fun addMetric(metric: BuildTime, value: Long) + fun addTimeMetric(time: BuildTime, durationMs: Long) + + fun addMetric(metric: BuildPerformanceMetric, value: Long) fun addAttribute(attribute: BuildAttribute) diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporterImpl.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporterImpl.kt index 79de9b22501..87505ca1329 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporterImpl.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildMetricsReporterImpl.kt @@ -13,6 +13,7 @@ class BuildMetricsReporterImpl : BuildMetricsReporter { BuildTime::class.java ) private val myBuildTimes = BuildTimes() + private val myBuildMetrics = BuildPerformanceMetrics() private val myBuildAttributes = BuildAttributes() override fun startMeasure(time: BuildTime, startNs: Long) { @@ -28,8 +29,12 @@ class BuildMetricsReporterImpl : BuildMetricsReporter { myBuildTimes.add(time, durationMs) } - override fun addMetric(metric: BuildTime, value: Long) { - myBuildTimes.add(metric, value) + override fun addTimeMetric(time: BuildTime, durationMs: Long) { + myBuildTimes.add(time, durationMs) + } + + override fun addMetric(metric: BuildPerformanceMetric, value: Long) { + myBuildMetrics.add(metric, value) } override fun addAttribute(attribute: BuildAttribute) { @@ -39,6 +44,7 @@ class BuildMetricsReporterImpl : BuildMetricsReporter { override fun getMetrics(): BuildMetrics = BuildMetrics( buildTimes = myBuildTimes, + buildPerformanceMetrics = myBuildMetrics, buildAttributes = myBuildAttributes ) @@ -47,5 +53,6 @@ class BuildMetricsReporterImpl : BuildMetricsReporter { myBuildAttributes.addAll(metrics.buildAttributes) myBuildTimes.addAll(metrics.buildTimes) + myBuildMetrics.addAll(metrics.buildPerformanceMetrics) } } \ No newline at end of file diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt new file mode 100644 index 00000000000..909b2586398 --- /dev/null +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.build.report.metrics + +import java.io.Serializable + + +@Suppress("Reformat") +enum class BuildPerformanceMetric(val parent: BuildPerformanceMetric? = null, val readableString: String) : Serializable { + OUTPUT_SIZE(readableString = "Total output size"), + LOOKUP_SIZE(OUTPUT_SIZE, "Lookups size"), + SNAPSHOT_SIZE(OUTPUT_SIZE, "ABI snapshot size"), + ; + + companion object { + const val serialVersionUID = 0L + + val children by lazy { + values().filter { it.parent != null }.groupBy { it.parent } + } + } +} \ No newline at end of file diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetrics.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetrics.kt new file mode 100644 index 00000000000..af93cb04477 --- /dev/null +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetrics.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.build.report.metrics + +import java.io.Serializable +import java.util.* + +class BuildPerformanceMetrics : Serializable { + companion object { + const val serialVersionUID = 0L + } + + private val myBuildMetrics = EnumMap(BuildPerformanceMetric::class.java) + + fun addAll(other: BuildPerformanceMetrics) { + for ((bt, timeNs) in other.myBuildMetrics) { + add(bt, timeNs) + } + } + + fun add(metric: BuildPerformanceMetric, value: Long) { + myBuildMetrics[metric] = myBuildMetrics.getOrDefault(metric, 0) + value + } + + fun asMap(): Map = myBuildMetrics + +} \ No newline at end of file diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt index c17136c9c6c..23f4ff420aa 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTime.kt @@ -38,9 +38,10 @@ enum class BuildTime(val parent: BuildTime? = null, val readableString: String) INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Incremental iteration"), NON_INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Non-incremental iteration"), IC_WRITE_HISTORY_FILE(INCREMENTAL_COMPILATION, "Write history file"), - OUTPUT_SIZE(readableString = "Total output size"), - LOOKUP_SIZE(OUTPUT_SIZE, "Lookups size"), - SNAPSHOT_SIZE(OUTPUT_SIZE, "ABI snapshot size") + COMPILER_PERFORMANCE(readableString = "Compiler time"), + COMPILER_INITIALIZATION(COMPILER_PERFORMANCE, "Compiler initialization time"), + CODE_ANALYSIS(COMPILER_PERFORMANCE, "Compiler code analyse"), + CODE_GENERATION(COMPILER_PERFORMANCE, "Compiler code generation"), ; companion object { diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/DoNothingBuildMetricsReporter.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/DoNothingBuildMetricsReporter.kt index 00f5c770d4a..5e0d76a3f33 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/DoNothingBuildMetricsReporter.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/DoNothingBuildMetricsReporter.kt @@ -12,7 +12,10 @@ object DoNothingBuildMetricsReporter : BuildMetricsReporter { override fun endMeasure(time: BuildTime, endNs: Long) { } - override fun addMetric(time: BuildTime, value: Long) { + override fun addTimeMetric(time: BuildTime, durationMs: Long) { + } + + override fun addMetric(metric: BuildPerformanceMetric, value: Long) { } override fun addAttribute(attribute: BuildAttribute) { @@ -21,6 +24,7 @@ object DoNothingBuildMetricsReporter : BuildMetricsReporter { override fun getMetrics(): BuildMetrics = BuildMetrics( BuildTimes(), + BuildPerformanceMetrics(), BuildAttributes() ) diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index 80c80e2374a..f703c23cc87 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.util.Disposer import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInClassDescriptorFactory import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots import org.jetbrains.kotlin.cli.common.messages.* import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles @@ -41,6 +42,7 @@ class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(Buil ) { val rootDisposable = Disposer.newDisposable() val messageCollector = createMessageCollector() + val performanceManager = object : CommonCompilerPerformanceManager(presentableName = "test") {} try { val configuration = CompilerConfiguration().apply { put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) @@ -50,6 +52,7 @@ class BuiltInsSerializer(dependOnOldBuiltIns: Boolean) : MetadataSerializer(Buil put(CLIConfigurationKeys.METADATA_DESTINATION_DIRECTORY, destDir) put(CommonConfigurationKeys.MODULE_NAME, "module for built-ins serialization") + put(CLIConfigurationKeys.PERF_MANAGER, performanceManager) } val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 71dedf3f782..9ea20ad875f 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -329,7 +329,12 @@ abstract class CompileServiceImplBase( val exitCode = compiler.exec(messageCollector, Services.EMPTY, k2PlatformArgs) val perfString = compiler.defaultPerformanceManager.renderCompilerPerformance() - (compilationResults as CompilationResults).add(CompilationResultCategory.BUILD_REPORT_LINES.code, arrayListOf(perfString)) + compilationResults?.also { + (it as CompilationResults).add( + CompilationResultCategory.BUILD_REPORT_LINES.code, + arrayListOf(perfString) + ) + } exitCode } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt index 59c660885a6..8289a459c32 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt @@ -21,12 +21,11 @@ import org.jetbrains.kotlin.build.GeneratedFile import org.jetbrains.kotlin.build.report.BuildReporter import org.jetbrains.kotlin.build.report.metrics.BuildTime import org.jetbrains.kotlin.build.report.metrics.BuildAttribute +import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric import org.jetbrains.kotlin.build.report.metrics.measure -import org.jetbrains.kotlin.cli.common.CompilerSystemProperties -import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.toBooleanLenient import org.jetbrains.kotlin.compilerRunner.MessageCollectorToOutputItemsCollectorAdapter import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.compilerRunner.SimpleOutputItem @@ -497,5 +496,15 @@ abstract class IncrementalCompilerRunner< override fun checkCanceled() { } } + + protected fun reportPerformanceData(defaultPerformanceManager: CommonCompilerPerformanceManager) { + defaultPerformanceManager.getMeasurementResults().forEach { + when (it) { + is CompilerInitializationMeasurement -> reporter.addTimeMetric(BuildTime.COMPILER_INITIALIZATION, it.milliseconds) + is CodeAnalysisMeasurement -> reporter.addTimeMetric(BuildTime.CODE_ANALYSIS, it.milliseconds) + is CodeGenerationMeasurement -> reporter.addTimeMetric(BuildTime.CODE_GENERATION, it.milliseconds) + } + } + } } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt index 67b731f99bf..56dc18cca22 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt @@ -20,8 +20,9 @@ import org.jetbrains.kotlin.build.GeneratedFile 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.BuildPerformanceMetric import org.jetbrains.kotlin.build.report.metrics.DoNothingBuildMetricsReporter -import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.isIrBackendEnabled import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -192,7 +193,8 @@ class IncrementalJsCompilerRunner( compiler.exec(messageCollector, services, args) } finally { args.freeArgs = freeArgsBackup - reporter.report { compiler.defaultPerformanceManager.renderCompilerPerformance() } +// reporter.report { compiler.defaultPerformanceManager.renderCompilerPerformance() } + reportPerformanceData(compiler.defaultPerformanceManager) } } diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index 3932af62ea9..7bf4987d5e5 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -433,7 +433,8 @@ class IncrementalJvmCompilerRunner( args.allowNoSourceFiles = true val exitCode = compiler.exec(messageCollector, services, args) args.freeArgs = freeArgsBackup - reporter.report { compiler.defaultPerformanceManager.renderCompilerPerformance() } +// reporter.report { compiler.defaultPerformanceManager.renderCompilerPerformance() } + reportPerformanceData(compiler.defaultPerformanceManager) return exitCode } } diff --git a/libraries/tools/kotlin-gradle-build-metrics/src/org/jetbrains/kotlin/gradle/internal/build/metrics/GradleBuildMetricsData.kt b/libraries/tools/kotlin-gradle-build-metrics/src/org/jetbrains/kotlin/gradle/internal/build/metrics/GradleBuildMetricsData.kt index b7596751395..e28af47f9cb 100644 --- a/libraries/tools/kotlin-gradle-build-metrics/src/org/jetbrains/kotlin/gradle/internal/build/metrics/GradleBuildMetricsData.kt +++ b/libraries/tools/kotlin-gradle-build-metrics/src/org/jetbrains/kotlin/gradle/internal/build/metrics/GradleBuildMetricsData.kt @@ -21,6 +21,7 @@ data class TaskData( val path: String, val typeFqName: String, val timeMetrics: Map, + val performanceMetrics: Map, val buildAttributes: Map, val didWork: Boolean ) : Serializable { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/incremental/ClasspathChangesComputer.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/incremental/ClasspathChangesComputer.kt index 06aa528bedc..3f7fc32f70f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/incremental/ClasspathChangesComputer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/incremental/ClasspathChangesComputer.kt @@ -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?) {} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildEsStatListener.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildEsStatListener.kt index cc181fc002c..a76b212c59e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildEsStatListener.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildEsStatListener.kt @@ -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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatistics.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatistics.kt index 0bd2a67757c..aec286bee6d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatistics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatistics.kt @@ -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, - val statData: Map + val timeData: Map, + val perfData: Map ) interface ReportStatistics { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatisticsToBuildScan.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatisticsToBuildScan.kt index b3d6e13ad15..e9689cfc70d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatisticsToBuildScan.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/ReportStatisticsToBuildScan.kt @@ -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() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/MetricsWriter.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/MetricsWriter.kt index 3067d9e9a29..4d9b938f285 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/MetricsWriter.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/MetricsWriter.kt @@ -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 ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/PlainTextBuildReportWriter.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/PlainTextBuildReportWriter.kt index 4587e449592..7fd5bc7b60e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/PlainTextBuildReportWriter.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/PlainTextBuildReportWriter.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 7259cea6afb..a427865c672 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -347,12 +347,12 @@ abstract class AbstractKotlinCompile : 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() )