diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildAttribute.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildAttribute.kt index 1b48a7563c7..7a17eecc12d 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildAttribute.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildAttribute.kt @@ -15,22 +15,22 @@ enum class BuildAttributeKind : Serializable { } } -enum class BuildAttribute(val kind: BuildAttributeKind) : Serializable { - NO_BUILD_HISTORY(BuildAttributeKind.REBUILD_REASON), - NO_ABI_SNAPSHOT(BuildAttributeKind.REBUILD_REASON), - CACHE_CORRUPTION(BuildAttributeKind.REBUILD_REASON), - UNKNOWN_CHANGES_IN_GRADLE_INPUTS(BuildAttributeKind.REBUILD_REASON), - JAVA_CHANGE_UNTRACKED_FILE_IS_REMOVED(BuildAttributeKind.REBUILD_REASON), - JAVA_CHANGE_UNEXPECTED_PSI(BuildAttributeKind.REBUILD_REASON), - JAVA_CHANGE_UNKNOWN_QUALIFIER(BuildAttributeKind.REBUILD_REASON), - DEP_CHANGE_REMOVED_ENTRY(BuildAttributeKind.REBUILD_REASON), - DEP_CHANGE_HISTORY_IS_NOT_FOUND(BuildAttributeKind.REBUILD_REASON), - DEP_CHANGE_HISTORY_CANNOT_BE_READ(BuildAttributeKind.REBUILD_REASON), - DEP_CHANGE_HISTORY_NO_KNOWN_BUILDS(BuildAttributeKind.REBUILD_REASON), - DEP_CHANGE_NON_INCREMENTAL_BUILD_IN_DEP(BuildAttributeKind.REBUILD_REASON), - IN_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON), - OUT_OF_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON), - IC_IS_NOT_ENABLED(BuildAttributeKind.REBUILD_REASON); +enum class BuildAttribute(val kind: BuildAttributeKind, val readableString: String) : Serializable { + NO_BUILD_HISTORY(BuildAttributeKind.REBUILD_REASON, "Build history file not found"), + NO_ABI_SNAPSHOT(BuildAttributeKind.REBUILD_REASON, "ABI snapshot not found"), + CACHE_CORRUPTION(BuildAttributeKind.REBUILD_REASON, "Cache corrupted"), + UNKNOWN_CHANGES_IN_GRADLE_INPUTS(BuildAttributeKind.REBUILD_REASON, "Unknown Gradle changes"), + JAVA_CHANGE_UNTRACKED_FILE_IS_REMOVED(BuildAttributeKind.REBUILD_REASON, "Untracked Java file is removed"), + JAVA_CHANGE_UNEXPECTED_PSI(BuildAttributeKind.REBUILD_REASON, "Java PSI file is expected"), + JAVA_CHANGE_UNKNOWN_QUALIFIER(BuildAttributeKind.REBUILD_REASON, "Unknown Java qualifier name"), + DEP_CHANGE_REMOVED_ENTRY(BuildAttributeKind.REBUILD_REASON, "Jar file is removed form dependency"), + DEP_CHANGE_HISTORY_IS_NOT_FOUND(BuildAttributeKind.REBUILD_REASON, "Dependency history not found"), + DEP_CHANGE_HISTORY_CANNOT_BE_READ(BuildAttributeKind.REBUILD_REASON, "Dependency history can not be read"), + DEP_CHANGE_HISTORY_NO_KNOWN_BUILDS(BuildAttributeKind.REBUILD_REASON, "Dependency history id not available"), + DEP_CHANGE_NON_INCREMENTAL_BUILD_IN_DEP(BuildAttributeKind.REBUILD_REASON, "Non incremental build in history"), + IN_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON, "In-process execution"), + OUT_OF_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON, "Out of process execution"), + IC_IS_NOT_ENABLED(BuildAttributeKind.REBUILD_REASON, "Incremental compilation is not enabled"); companion object { const val serialVersionUID = 0L 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 be6a28b28cc..62ec6d75345 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 @@ -24,8 +24,8 @@ class BuildMetricsReporterImpl : BuildMetricsReporter { override fun endMeasure(metric: BuildTime, endNs: Long) { val startNs = myBuildTimeStartNs.remove(metric) ?: error("$metric finished before it started") - val durationNs = endNs - startNs - myBuildTimes.add(metric, durationNs) + val durationMs = (endNs - startNs) / 1_000_000 + myBuildTimes.add(metric, durationMs) } override fun addAttribute(attribute: BuildAttribute) { 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 4e37017bb2b..b12eb0d46cf 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 @@ -8,35 +8,35 @@ package org.jetbrains.kotlin.build.report.metrics import java.io.Serializable @Suppress("Reformat") -enum class BuildTime(val parent: BuildTime? = null) : Serializable { - GRADLE_TASK_ACTION, - GRADLE_TASK, - CLEAR_OUTPUT(GRADLE_TASK), - BACKUP_OUTPUT(GRADLE_TASK), - RESTORE_OUTPUT_FROM_BACKUP(GRADLE_TASK), - CONNECT_TO_DAEMON(GRADLE_TASK), - CLEAR_JAR_CACHE(GRADLE_TASK), - RUN_COMPILER(GRADLE_TASK), - NON_INCREMENTAL_COMPILATION_IN_PROCESS(RUN_COMPILER), - NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS(RUN_COMPILER), - NON_INCREMENTAL_COMPILATION_DAEMON(RUN_COMPILER), - INCREMENTAL_COMPILATION(RUN_COMPILER), - STORE_BUILD_INFO(INCREMENTAL_COMPILATION), - JAR_SNAPSHOT(INCREMENTAL_COMPILATION), - SET_UP_ABI_SNAPSHOTS(JAR_SNAPSHOT), - IC_ANALYZE_JAR_FILES(JAR_SNAPSHOT), - IC_CALCULATE_INITIAL_DIRTY_SET(INCREMENTAL_COMPILATION), - IC_ANALYZE_CHANGES_IN_DEPENDENCIES(IC_CALCULATE_INITIAL_DIRTY_SET), - IC_FIND_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES), - IC_ANALYZE_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES), - IC_ANALYZE_CHANGES_IN_JAVA_SOURCES(IC_CALCULATE_INITIAL_DIRTY_SET), - IC_ANALYZE_CHANGES_IN_ANDROID_LAYOUTS(IC_CALCULATE_INITIAL_DIRTY_SET), - IC_DETECT_REMOVED_CLASSES(IC_CALCULATE_INITIAL_DIRTY_SET), - CLEAR_OUTPUT_ON_REBUILD(INCREMENTAL_COMPILATION), - IC_UPDATE_CACHES(INCREMENTAL_COMPILATION), - INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION), - NON_INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION), - IC_WRITE_HISTORY_FILE(INCREMENTAL_COMPILATION); +enum class BuildTime(val parent: BuildTime? = null, val readableString: String) : Serializable { + GRADLE_TASK_ACTION(readableString = "Task execution"), + GRADLE_TASK(readableString = "Total time"), + CLEAR_OUTPUT(GRADLE_TASK, "Clear output"), + BACKUP_OUTPUT(GRADLE_TASK, "Backup output"), + RESTORE_OUTPUT_FROM_BACKUP(GRADLE_TASK, "Restore output"), + CONNECT_TO_DAEMON(GRADLE_TASK, "Connect to Kotlin daemon"), + CLEAR_JAR_CACHE(GRADLE_TASK, "Clear jar cache"), + RUN_COMPILER(GRADLE_TASK, "Run compiler"), + NON_INCREMENTAL_COMPILATION_IN_PROCESS(RUN_COMPILER, "Inprocess compilation"), + NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS(RUN_COMPILER, "Out of process compilation"), + NON_INCREMENTAL_COMPILATION_DAEMON(RUN_COMPILER, "Non incremental compilation"), + INCREMENTAL_COMPILATION(RUN_COMPILER, "Incremental compilation"), + STORE_BUILD_INFO(INCREMENTAL_COMPILATION, "Store build info"), + JAR_SNAPSHOT(INCREMENTAL_COMPILATION, "ABI JAR Snapshot support"), + SET_UP_ABI_SNAPSHOTS(JAR_SNAPSHOT, "Set up ABI snapshot"), + IC_ANALYZE_JAR_FILES(JAR_SNAPSHOT, "Analyze jar files"), + IC_CALCULATE_INITIAL_DIRTY_SET(INCREMENTAL_COMPILATION, "Init dirty symbols set"), + IC_ANALYZE_CHANGES_IN_DEPENDENCIES(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze dependency changes"), + IC_FIND_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES, "Find history files"), + IC_ANALYZE_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES, "Analyze history files"), + IC_ANALYZE_CHANGES_IN_JAVA_SOURCES(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze Java file changes"), + IC_ANALYZE_CHANGES_IN_ANDROID_LAYOUTS(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze Android layouts"), + IC_DETECT_REMOVED_CLASSES(IC_CALCULATE_INITIAL_DIRTY_SET, "Detect removed classes"), + CLEAR_OUTPUT_ON_REBUILD(INCREMENTAL_COMPILATION, "Clear outputs on rebuild"), + IC_UPDATE_CACHES(INCREMENTAL_COMPILATION, "Update caches"), + INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Incremental iteration"), + NON_INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Non-incremental iteration"), + IC_WRITE_HISTORY_FILE(INCREMENTAL_COMPILATION, "Write history file"); companion object { const val serialVersionUID = 0L diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTimes.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTimes.kt index a052c1af2c3..9de86fd360c 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTimes.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildTimes.kt @@ -12,13 +12,13 @@ class BuildTimes : Serializable { private val myBuildTimes = EnumMap(BuildTime::class.java) fun addAll(other: BuildTimes) { - for ((bt, timeNs) in other.myBuildTimes) { - add(bt, timeNs) + for ((bt, timeMs) in other.myBuildTimes) { + add(bt, timeMs) } } - fun add(buildTime: BuildTime, timeNs: Long) { - myBuildTimes[buildTime] = myBuildTimes.getOrDefault(buildTime, 0) + timeNs + fun add(buildTime: BuildTime, timeMs: Long) { + myBuildTimes[buildTime] = myBuildTimes.getOrDefault(buildTime, 0) + timeMs } fun asMap(): Map = myBuildTimes diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt index 67273644c5f..3e9f69700c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt @@ -83,19 +83,14 @@ internal class KotlinGradleBuildServices private constructor( } - listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider) - listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider) - if (instance != null) { log.kotlinDebug(ALREADY_INITIALIZED_MESSAGE) -// instance!!.gradleListenerProviders.forEach { listenerRegistryHolder.listenerRegistry.onTaskCompletion(it) } +// instance!!.gradleListenerProviders.forEach { listenerRegistry.onTaskCompletion(it) } return instance!! } val gradle = project.gradle val services = KotlinGradleBuildServices(gradle, kotlinGradleListenerProvider, kotlinGradleEsListenerProvider) -// listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider) -// listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider) if (isConfigurationCacheAvailable(gradle)) { listenerRegistryHolder.listenerRegistry!!.onTaskCompletion(kotlinGradleListenerProvider) listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider) @@ -104,11 +99,6 @@ internal class KotlinGradleBuildServices private constructor( gradle.taskGraph.addTaskExecutionListener(kotlinGradleEsListenerProvider.get()) log.kotlinDebug(INIT_MESSAGE) } - - -// listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider) -// listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider) - instance = services services.buildStarted() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index e9671b56394..63ac7b13ff0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -49,7 +49,7 @@ import org.jetbrains.kotlin.statistics.metrics.StringMetrics import javax.inject.Inject import kotlin.reflect.KClass -abstract class KotlinBasePluginWrapper : Plugin { +abstract class KotlinBasePluginWrapper: Plugin { private val log = Logging.getLogger(this.javaClass) @@ -70,7 +70,6 @@ abstract class KotlinBasePluginWrapper : Plugin { override fun apply(project: Project) { val kotlinPluginVersion = project.getKotlinPluginVersion() - val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project) val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project) statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion) @@ -88,7 +87,7 @@ abstract class KotlinBasePluginWrapper : Plugin { } project.registerCommonizerClasspathConfigurationIfNecessary() - val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project, listenerRegistryHolder) + val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project, BuildEventsListenerRegistryHolder.getInstance(project)) kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) @@ -195,8 +194,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor( get() = Kotlin2JsProjectExtension::class } -open class KotlinJsPluginWrapper @Inject constructor( -) : KotlinBasePluginWrapper() { +open class KotlinJsPluginWrapper : KotlinBasePluginWrapper() { override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = KotlinJsPlugin(project.getKotlinPluginVersion()) @@ -227,8 +225,7 @@ open class KotlinJsPluginWrapper @Inject constructor( override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test") } -open class KotlinMultiplatformPluginWrapper @Inject constructor( -) : KotlinBasePluginWrapper() { +open class KotlinMultiplatformPluginWrapper : KotlinBasePluginWrapper() { override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = KotlinMultiplatformPlugin() @@ -251,7 +248,9 @@ open class KotlinMultiplatformPluginWrapper @Inject constructor( } } -open class KotlinPm20PluginWrapper @Inject constructor(private val objectFactory: ObjectFactory) : KotlinBasePluginWrapper() { +open class KotlinPm20PluginWrapper @Inject constructor( + private val objectFactory: ObjectFactory +) : KotlinBasePluginWrapper() { override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = objectFactory.newInstance(KotlinPm20GradlePlugin::class.java) 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 5525f196b25..1dbc0cba489 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 @@ -27,7 +27,7 @@ enum class TaskExecutionState { ; } -class KotlinBuildEsStatListener(val projectName: String, val reportStatistics : List) : OperationCompletionListener, AutoCloseable, TaskExecutionListener { +class KotlinBuildEsStatListener(val projectName: String, val reportStatistics: List) : OperationCompletionListener, AutoCloseable, TaskExecutionListener { val label by lazy { CompilerSystemProperties.KOTLIN_STAT_LABEl_PROPERTY.value } @@ -37,9 +37,11 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics : val taskPath = event.descriptor.taskPath val duration = event.result.endTime - event.result.startTime val taskResult = when (result) { - is TaskSuccessResult -> if (result.isFromCache) TaskExecutionState.FROM_CACHE - else if (result.isUpToDate) TaskExecutionState.UP_TO_DATE - else TaskExecutionState.SUCCESS + is TaskSuccessResult -> when { + result.isFromCache -> TaskExecutionState.FROM_CACHE + result.isUpToDate -> TaskExecutionState.UP_TO_DATE + else -> TaskExecutionState.SUCCESS + } is TaskSkippedResult -> TaskExecutionState.SKIPPED is TaskFailureResult -> TaskExecutionState.FAILED @@ -55,9 +57,8 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics : return; } val taskExecutionResult = TaskExecutionResults[taskPath] - val statData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap()?.mapKeys { (key, _) -> key.name } ?: emptyMap() - val changedFiles = taskExecutionResult?.taskInfo?.changedFiles - val changes = when (changedFiles) { + val statData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap() ?: 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 } else -> emptyList() @@ -67,13 +68,13 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics : duration = duration, taskResult = taskResult.name, label = label, statData = statData, projectName = projectName, taskName = taskPath, changes = changes, tags = taskExecutionResult?.taskInfo?.properties?.map { it.name } ?: emptyList(), - nonIncrementalAttributes = taskExecutionResult?.buildMetrics?.buildAttributes?.asMap()?.mapKeys { (key, _) -> key.name }?: emptyMap() + nonIncrementalAttributes = taskExecutionResult?.buildMetrics?.buildAttributes?.asMap()?: emptyMap() ) reportStatistics.forEach { it.report(compileStatData) } } private fun availableForStat(taskPath: String): Boolean { - return taskPath.contains("Kotlin") + return taskPath.contains("Kotlin") && (TaskExecutionResults[taskPath] != null) } override fun afterExecute(task: Task, taskState: TaskState) { 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 dd61a05b004..3b3379ac912 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 @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.gradle.plugin.stat +import org.jetbrains.kotlin.build.report.metrics.BuildAttribute +import org.jetbrains.kotlin.build.report.metrics.BuildTime + data class CompileStatData( val version: Int = 1, val projectName: String?, @@ -14,8 +17,8 @@ data class CompileStatData( val duration: Long, val tags: List, val changes: List, - val nonIncrementalAttributes: Map, - val statData: Map + val nonIncrementalAttributes: Map, + val statData: 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 38485496a6b..8c0aa07555c 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 @@ -5,17 +5,30 @@ package org.jetbrains.kotlin.gradle.plugin.statistics -import com.google.gson.Gson import com.gradle.scan.plugin.BuildScanExtension import org.jetbrains.kotlin.gradle.plugin.stat.CompileStatData import org.jetbrains.kotlin.gradle.plugin.stat.ReportStatistics +import org.jetbrains.kotlin.konan.file.File -class ReportStatisticsToBuildScan(val buildScan: BuildScanExtension) : ReportStatistics { +class ReportStatisticsToBuildScan(private val buildScan: BuildScanExtension) : ReportStatistics { override fun report(data: CompileStatData) { - buildScan.value(data.taskName, Gson().toJson(data).toString()) - val keys = data.nonIncrementalAttributes.filterValues { it > 0 }.keys.joinToString() - if (keys.isNotEmpty()) { - buildScan.value("${data.taskName}_nonIncremental", keys) + buildScan.value(data.taskName, readableString(data)) + data.tags.forEach { buildScan.tag(it) } + } + + private fun readableString(data: CompileStatData): String { + val nonIncrementalReasons = data.nonIncrementalAttributes.filterValues { it > 0 }.keys + val readableString = StringBuilder() + if (nonIncrementalReasons.isEmpty()) { + readableString.append("Incremental build; ") + } else { + nonIncrementalReasons.joinTo(readableString, prefix = "Non incremental build because: [", postfix = "]; ") { it.readableString } } + 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, ") } + readableString.append("]; ") + return readableString.toString() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/BuildDataRecorder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/BuildDataRecorder.kt index 3bbca37209f..1c3fec64031 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/BuildDataRecorder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/BuildDataRecorder.kt @@ -72,8 +72,8 @@ private class TaskRecord( override val endNs: Long get() = myEndNs - override val totalTimeNs: Long - get() = endNs - startNs + override val totalTimeMs: Long + get() = (endNs - startNs) / 1_000_000 override val resultState: TaskState get() = myTaskState @@ -87,7 +87,7 @@ private class TaskRecord( fun processResult(state: TaskState, executionResult: TaskExecutionResult?) { myEndNs = System.nanoTime() myTaskState = state - myBuildMetrics.buildTimes.add(BuildTime.GRADLE_TASK, totalTimeNs) + myBuildMetrics.buildTimes.add(BuildTime.GRADLE_TASK, totalTimeMs) if (executionResult != null) { myBuildMetrics.addAll(executionResult.buildMetrics) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/KotlinBuildReporterHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/KotlinBuildReporterHandler.kt index f25fa28eaf5..886b52df2c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/KotlinBuildReporterHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/KotlinBuildReporterHandler.kt @@ -102,7 +102,7 @@ class KotlinBuildReporterHandler { } internal fun formatTime(ns: Long): String { - val seconds = ns.toDouble() / 1_000_000_000 + val seconds = ns.toDouble() / 1_000 return seconds.asString(2) + " s" } 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 1154926496c..4587e449592 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 @@ -76,8 +76,8 @@ internal class PlainTextBuildReportWriter( fun printBuildTime(buildTime: BuildTime) { if (!visitedBuildTimes.add(buildTime)) return - val timeNs = collectedBuildTimes[buildTime] ?: return - p.println("${buildTime.name}: ${formatTime(timeNs)}") + val timeMs = collectedBuildTimes[buildTime] ?: return + p.println("${buildTime.name}: ${formatTime(timeMs)}") p.withIndent { BuildTime.children[buildTime]?.forEach { printBuildTime(it) } } @@ -106,16 +106,16 @@ internal class PlainTextBuildReportWriter( } private fun printTaskOverview(build: BuildExecutionData) { - var allTasksTimeNs = 0L - var kotlinTotalTimeNs = 0L + var allTasksTimeMs = 0L + var kotlinTotalTimeMs = 0L val kotlinTasks = ArrayList() for (task in build.taskExecutionData) { - val taskTimeNs = task.totalTimeNs - allTasksTimeNs += taskTimeNs + val taskTimeMs = task.totalTimeMs + allTasksTimeMs += taskTimeMs if (task.isKotlinTask) { - kotlinTotalTimeNs += taskTimeNs + kotlinTotalTimeMs += taskTimeMs kotlinTasks.add(task) } } @@ -125,14 +125,14 @@ internal class PlainTextBuildReportWriter( return } - val ktTaskPercent = (kotlinTotalTimeNs.toDouble() / allTasksTimeNs * 100).asString(1) - p.println("Total time for Kotlin tasks: ${formatTime(kotlinTotalTimeNs)} ($ktTaskPercent % of all tasks time)") + val ktTaskPercent = (kotlinTotalTimeMs.toDouble() / allTasksTimeMs * 100).asString(1) + p.println("Total time for Kotlin tasks: ${formatTime(kotlinTotalTimeMs)} ($ktTaskPercent % of all tasks time)") val table = TextTable("Time", "% of Kotlin time", "Task") - for (task in kotlinTasks.sortedByDescending { it.totalTimeNs }) { - val timeNs = task.totalTimeNs - val percent = (timeNs.toDouble() / kotlinTotalTimeNs * 100).asString(1) - table.addRow(formatTime(timeNs), "$percent %", task.task.path) + for (task in kotlinTasks.sortedByDescending { it.totalTimeMs }) { + val timeMs = task.totalTimeMs + val percent = (timeMs.toDouble() / kotlinTotalTimeMs * 100).asString(1) + table.addRow(formatTime(timeMs), "$percent %", task.task.path) } table.printTo(p) p.println() @@ -150,7 +150,7 @@ internal class PlainTextBuildReportWriter( if (skipMessage != null) { p.println("Task '${task.task.path}' was skipped: $skipMessage") } else { - p.println("Task '${task.task.path}' finished in ${formatTime(task.totalTimeNs)}") + p.println("Task '${task.task.path}' finished in ${formatTime(task.totalTimeMs)}") } if (task.icLogLines.isNotEmpty()) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/data/TaskExecutionData.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/data/TaskExecutionData.kt index c521f682512..b6b095a89a5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/data/TaskExecutionData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/report/data/TaskExecutionData.kt @@ -13,7 +13,7 @@ internal interface TaskExecutionData { val task: Task val startNs: Long val endNs: Long - val totalTimeNs: Long + val totalTimeMs: Long val resultState: TaskState val icLogLines: List val buildMetrics: BuildMetrics