Split Gradle and JPS metrics
#KT-58026 In progress
This commit is contained in:
committed by
Space Team
parent
524df83265
commit
ed2dd4b2ae
+32
-31
@@ -20,6 +20,7 @@ import io.ktor.util.collections.*
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.build.report.statistics.*
|
||||
import org.jetbrains.kotlin.gradle.report.BuildReportType
|
||||
import org.jetbrains.kotlin.gradle.report.data.GradleCompileStatisticsData
|
||||
import org.jetbrains.kotlin.gradle.testbase.*
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import java.io.IOException
|
||||
@@ -129,11 +130,11 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
}
|
||||
}
|
||||
|
||||
fun validateTaskData(port: Int, validate: (CompileStatisticsData) -> Unit) {
|
||||
fun validateTaskData(port: Int, validate: (GradleCompileStatisticsData) -> Unit) {
|
||||
validateCall(port) { jsonObject ->
|
||||
val type = jsonObject["type"].asString
|
||||
assertEquals(BuildDataType.TASK_DATA, BuildDataType.valueOf(type))
|
||||
val taskData = Gson().fromJson(jsonObject, CompileStatisticsData::class.java)
|
||||
val taskData = Gson().fromJson(jsonObject, GradleCompileStatisticsData::class.java)
|
||||
validate(taskData)
|
||||
}
|
||||
}
|
||||
@@ -165,7 +166,7 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
private fun simpleTestHttpReport(
|
||||
gradleVersion: GradleVersion,
|
||||
additionalProjectSetup: (TestProject) -> Unit = {},
|
||||
compileTaskAssertions: (CompileStatisticsData) -> Unit,
|
||||
compileTaskAssertions: (GradleCompileStatisticsData) -> Unit,
|
||||
) {
|
||||
runWithKtorService { port ->
|
||||
project("incrementalMultiproject", gradleVersion) {
|
||||
@@ -176,11 +177,11 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
}
|
||||
}
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":lib:compileKotlin", taskData.taskName)
|
||||
assertEquals(":lib:compileKotlin", taskData.getTaskName())
|
||||
compileTaskAssertions(taskData)
|
||||
}
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":app:compileKotlin", taskData.taskName)
|
||||
assertEquals(":app:compileKotlin", taskData.getTaskName())
|
||||
compileTaskAssertions(taskData)
|
||||
}
|
||||
validateBuildData(port) { buildData ->
|
||||
@@ -193,14 +194,14 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
@GradleTest
|
||||
fun testHttpRequest(gradleVersion: GradleVersion) {
|
||||
simpleTestHttpReport(gradleVersion) { taskData ->
|
||||
assertContains(taskData.tags, StatTag.NON_INCREMENTAL)
|
||||
assertContains(taskData.nonIncrementalAttributes.map { it.name }, "UNKNOWN_CHANGES_IN_GRADLE_INPUTS")
|
||||
assertFalse(taskData.performanceMetrics.keys.isEmpty())
|
||||
assertFalse(taskData.buildTimesMetrics.keys.isEmpty())
|
||||
assertFalse(taskData.compilerArguments.isEmpty())
|
||||
assertContains(taskData.getTags(), StatTag.NON_INCREMENTAL)
|
||||
assertContains(taskData.getNonIncrementalAttributes().map { it.name }, "UNKNOWN_CHANGES_IN_GRADLE_INPUTS")
|
||||
assertFalse(taskData.getPerformanceMetrics().keys.isEmpty())
|
||||
assertFalse(taskData.getBuildTimesMetrics().keys.isEmpty())
|
||||
assertFalse(taskData.getCompilerArguments().isEmpty())
|
||||
assertEquals(
|
||||
defaultBuildOptions.kotlinVersion, taskData.kotlinVersion,
|
||||
"Unexpected kotlinVersion: ${taskData.kotlinVersion} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
|
||||
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -216,14 +217,14 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
""".trimMargin()
|
||||
)
|
||||
}) { taskData ->
|
||||
assertContains(taskData.tags, StatTag.NON_INCREMENTAL)
|
||||
assertContains(taskData.nonIncrementalAttributes.map { it.name }, "UNKNOWN_CHANGES_IN_GRADLE_INPUTS")
|
||||
assertFalse(taskData.performanceMetrics.keys.isEmpty())
|
||||
assertFalse(taskData.buildTimesMetrics.keys.isEmpty())
|
||||
assertTrue(taskData.compilerArguments.isEmpty())
|
||||
assertContains(taskData.getTags(), StatTag.NON_INCREMENTAL)
|
||||
assertContains(taskData.getNonIncrementalAttributes().map { it.name }, "UNKNOWN_CHANGES_IN_GRADLE_INPUTS")
|
||||
assertFalse(taskData.getPerformanceMetrics().keys.isEmpty())
|
||||
assertFalse(taskData.getBuildTimesMetrics().keys.isEmpty())
|
||||
assertTrue(taskData.getCompilerArguments().isEmpty())
|
||||
assertEquals(
|
||||
defaultBuildOptions.kotlinVersion, taskData.kotlinVersion,
|
||||
"Unexpected kotlinVersion: ${taskData.kotlinVersion} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
|
||||
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -245,26 +246,26 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
}
|
||||
}
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":lib:compileKotlin", taskData.taskName)
|
||||
assertEquals(":lib:compileKotlin", taskData.getTaskName())
|
||||
assertContentEquals(
|
||||
listOf(
|
||||
StatTag.ARTIFACT_TRANSFORM,
|
||||
StatTag.NON_INCREMENTAL,
|
||||
StatTag.CONFIGURATION_CACHE,
|
||||
StatTag.KOTLIN_1,
|
||||
), taskData.tags.sorted(),
|
||||
), taskData.getTags().sorted(),
|
||||
)
|
||||
assertEquals(
|
||||
defaultBuildOptions.kotlinVersion, taskData.kotlinVersion,
|
||||
"Unexpected kotlinVersion: ${taskData.kotlinVersion} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
|
||||
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
)
|
||||
}
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":app:compileKotlin", taskData.taskName)
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.NON_INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.tags.sorted())
|
||||
assertEquals(":app:compileKotlin", taskData.getTaskName())
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.NON_INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
|
||||
assertEquals(
|
||||
defaultBuildOptions.kotlinVersion, taskData.kotlinVersion,
|
||||
"Unexpected kotlinVersion: ${taskData.kotlinVersion} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
defaultBuildOptions.kotlinVersion, taskData.getKotlinVersion(),
|
||||
"Unexpected kotlinVersion: ${taskData.getKotlinVersion()} instead of ${defaultBuildOptions.kotlinVersion}"
|
||||
)
|
||||
}
|
||||
validateBuildData(port) { buildData ->
|
||||
@@ -272,12 +273,12 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
|
||||
}
|
||||
//second build
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":lib:compileKotlin", taskData.taskName)
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.tags.sorted())
|
||||
assertEquals(":lib:compileKotlin", taskData.getTaskName())
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
|
||||
}
|
||||
validateTaskData(port) { taskData ->
|
||||
assertEquals(":app:compileKotlin", taskData.taskName)
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.tags.sorted())
|
||||
assertEquals(":app:compileKotlin", taskData.getTaskName())
|
||||
assertContentEquals(listOf(StatTag.ARTIFACT_TRANSFORM, StatTag.INCREMENTAL, StatTag.CONFIGURATION_CACHE, StatTag.KOTLIN_1), taskData.getTags().sorted())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-7
@@ -1,8 +1,6 @@
|
||||
package org.jetbrains.kotlin.compilerRunner
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.buildtools.api.KotlinLogger
|
||||
import org.jetbrains.kotlin.daemon.common.*
|
||||
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
|
||||
@@ -23,8 +21,8 @@ internal class GradleCompilationResults(
|
||||
) {
|
||||
|
||||
var icLogLines: List<String> = emptyList()
|
||||
private val buildMetricsReporter = BuildMetricsReporterImpl()
|
||||
val buildMetrics: BuildMetrics
|
||||
private val buildMetricsReporter = BuildMetricsReporterImpl<GradleBuildTime, GradleBuildPerformanceMetric>()
|
||||
val buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>
|
||||
get() = buildMetricsReporter.getMetrics()
|
||||
|
||||
@Throws(RemoteException::class)
|
||||
@@ -37,7 +35,7 @@ internal class GradleCompilationResults(
|
||||
val sourceFiles = compileIterationResult.sourceFiles
|
||||
if (sourceFiles.any()) {
|
||||
log.kotlinDebug { "compile iteration: ${sourceFiles.pathsAsStringRelativeTo(projectRootFile)}" }
|
||||
buildMetrics.buildPerformanceMetrics.add(BuildPerformanceMetric.COMPILE_ITERATION)
|
||||
buildMetrics.buildPerformanceMetrics.add(GradleBuildPerformanceMetric.COMPILE_ITERATION)
|
||||
}
|
||||
val exitCode = compileIterationResult.exitCode
|
||||
log.kotlinDebug { "compiler exit code: $exitCode" }
|
||||
@@ -49,7 +47,7 @@ internal class GradleCompilationResults(
|
||||
(value as? List<String>)?.let { icLogLines = it }
|
||||
}
|
||||
CompilationResultCategory.BUILD_METRICS.code -> {
|
||||
(value as? BuildMetrics)?.let { buildMetricsReporter.addMetrics(it) }
|
||||
(value as? BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>)?.let { buildMetricsReporter.addMetrics(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-8
@@ -14,10 +14,7 @@ import org.gradle.workers.WorkAction
|
||||
import org.gradle.workers.WorkParameters
|
||||
import org.gradle.workers.WorkQueue
|
||||
import org.gradle.workers.WorkerExecutor
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.measure
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.gradle.tasks.*
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
@@ -29,7 +26,7 @@ internal class GradleCompilerRunnerWithWorkers(
|
||||
taskProvider: GradleCompileTaskProvider,
|
||||
jdkToolsJar: File?,
|
||||
compilerExecutionSettings: CompilerExecutionSettings,
|
||||
buildMetrics: BuildMetricsReporter,
|
||||
buildMetrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
private val workerExecutor: WorkerExecutor
|
||||
) : GradleCompilerRunner(taskProvider, jdkToolsJar, compilerExecutionSettings, buildMetrics) {
|
||||
override fun runCompilerAsync(
|
||||
@@ -37,7 +34,7 @@ internal class GradleCompilerRunnerWithWorkers(
|
||||
taskOutputsBackup: TaskOutputsBackup?
|
||||
): WorkQueue {
|
||||
|
||||
buildMetrics.addTimeMetric(BuildPerformanceMetric.CALL_WORKER)
|
||||
buildMetrics.addTimeMetric(GradleBuildPerformanceMetric.CALL_WORKER)
|
||||
val workQueue = workerExecutor.noIsolation()
|
||||
workQueue.submit(GradleKotlinCompilerWorkAction::class.java) { params ->
|
||||
params.compilerWorkArguments.set(workArgs)
|
||||
@@ -82,7 +79,7 @@ internal class GradleCompilerRunnerWithWorkers(
|
||||
// Otherwise, the next build(s) will likely fail in exactly the same way as this build because their inputs and outputs are
|
||||
// the same.
|
||||
if (taskOutputsBackup != null && (e is CompilationErrorException || e is OOMErrorException)) {
|
||||
parameters.metricsReporter.get().measure(BuildTime.RESTORE_OUTPUT_FROM_BACKUP) {
|
||||
parameters.metricsReporter.get().measure(GradleBuildTime.RESTORE_OUTPUT_FROM_BACKUP) {
|
||||
logger.info("Restoring task outputs to pre-compilation state")
|
||||
taskOutputsBackup.restoreOutputs()
|
||||
}
|
||||
@@ -100,6 +97,6 @@ internal class GradleCompilerRunnerWithWorkers(
|
||||
val taskOutputsToRestore: ListProperty<File>
|
||||
val snapshotsDir: DirectoryProperty
|
||||
val buildDir: DirectoryProperty
|
||||
val metricsReporter: Property<BuildMetricsReporter>
|
||||
val metricsReporter: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>>
|
||||
}
|
||||
}
|
||||
+5
-8
@@ -14,10 +14,7 @@ import org.gradle.api.tasks.bundling.Zip
|
||||
import org.gradle.jvm.tasks.Jar
|
||||
import org.gradle.workers.WorkQueue
|
||||
import org.gradle.workers.WorkerExecutor
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.measure
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.cli.common.arguments.*
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
import org.jetbrains.kotlin.compilerRunner.btapi.GradleBuildToolsApiCompilerRunner
|
||||
@@ -60,7 +57,7 @@ internal fun createGradleCompilerRunner(
|
||||
taskProvider: GradleCompileTaskProvider,
|
||||
toolsJar: File?,
|
||||
compilerExecutionSettings: CompilerExecutionSettings,
|
||||
buildMetricsReporter: BuildMetricsReporter,
|
||||
buildMetricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
workerExecutor: WorkerExecutor,
|
||||
runViaBuildToolsApi: Boolean,
|
||||
cachedClassLoadersService: Property<ClassLoadersCachingBuildService>
|
||||
@@ -94,7 +91,7 @@ internal open class GradleCompilerRunner(
|
||||
protected val taskProvider: GradleCompileTaskProvider,
|
||||
protected val jdkToolsJar: File?,
|
||||
protected val compilerExecutionSettings: CompilerExecutionSettings,
|
||||
protected val buildMetrics: BuildMetricsReporter,
|
||||
protected val buildMetrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
) {
|
||||
|
||||
internal val pathProvider = taskProvider.path.get()
|
||||
@@ -250,13 +247,13 @@ internal open class GradleCompilerRunner(
|
||||
taskOutputsBackup: TaskOutputsBackup?
|
||||
): WorkQueue? {
|
||||
try {
|
||||
buildMetrics.addTimeMetric(BuildPerformanceMetric.CALL_WORKER)
|
||||
buildMetrics.addTimeMetric(GradleBuildPerformanceMetric.CALL_WORKER)
|
||||
val kotlinCompilerRunnable = GradleKotlinCompilerWork(workArgs)
|
||||
kotlinCompilerRunnable.run()
|
||||
} catch (e: FailedCompilationException) {
|
||||
// Restore outputs only for CompilationErrorException or OOMErrorException (see GradleKotlinCompilerWorkAction.execute)
|
||||
if (taskOutputsBackup != null && (e is CompilationErrorException || e is OOMErrorException)) {
|
||||
buildMetrics.measure(BuildTime.RESTORE_OUTPUT_FROM_BACKUP) {
|
||||
buildMetrics.measure(GradleBuildTime.RESTORE_OUTPUT_FROM_BACKUP) {
|
||||
taskOutputsBackup.restoreOutputs()
|
||||
}
|
||||
}
|
||||
|
||||
+14
-14
@@ -131,8 +131,8 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
get() = incrementalCompilationEnvironment != null
|
||||
|
||||
override fun run() {
|
||||
metrics.addTimeMetric(BuildPerformanceMetric.START_WORKER_EXECUTION)
|
||||
metrics.startMeasure(BuildTime.RUN_COMPILATION_IN_WORKER)
|
||||
metrics.addTimeMetric(GradleBuildPerformanceMetric.START_WORKER_EXECUTION)
|
||||
metrics.startMeasure(GradleBuildTime.RUN_COMPILATION_IN_WORKER)
|
||||
try {
|
||||
val gradlePrintingMessageCollector = GradlePrintingMessageCollector(log, allWarningsAsErrors)
|
||||
val gradleMessageCollector = GradleErrorMessageCollector(gradlePrintingMessageCollector, kotlinPluginVersion = kotlinPluginVersion)
|
||||
@@ -150,7 +150,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
compilerArguments = if (reportingSettings.includeCompilerArguments) compilerArgs else emptyArray(),
|
||||
tags = collectStatTags(),
|
||||
)
|
||||
metrics.endMeasure(BuildTime.RUN_COMPILATION_IN_WORKER)
|
||||
metrics.endMeasure(GradleBuildTime.RUN_COMPILATION_IN_WORKER)
|
||||
val result = TaskExecutionResult(buildMetrics = metrics.getMetrics(), icLogLines = icLogLines, taskInfo = taskInfo)
|
||||
TaskExecutionResults[taskPath] = result
|
||||
}
|
||||
@@ -210,7 +210,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
val daemonMessageCollector =
|
||||
if (isDebugEnabled) messageCollector else MessageCollector.NONE
|
||||
val connection =
|
||||
metrics.measure(BuildTime.CONNECT_TO_DAEMON) {
|
||||
metrics.measure(GradleBuildTime.CONNECT_TO_DAEMON) {
|
||||
GradleCompilerRunner.getDaemonConnectionImpl(
|
||||
clientIsAliveFlagFile,
|
||||
sessionFlagFile,
|
||||
@@ -261,8 +261,8 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
if (memoryUsageAfterBuild == null || memoryUsageBeforeBuild == null) {
|
||||
log.debug("Unable to calculate memory usage")
|
||||
} else {
|
||||
metrics.addMetric(BuildPerformanceMetric.DAEMON_INCREASED_MEMORY, memoryUsageAfterBuild - memoryUsageBeforeBuild)
|
||||
metrics.addMetric(BuildPerformanceMetric.DAEMON_MEMORY_USAGE, memoryUsageAfterBuild)
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.DAEMON_INCREASED_MEMORY, memoryUsageAfterBuild - memoryUsageBeforeBuild)
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.DAEMON_MEMORY_USAGE, memoryUsageAfterBuild)
|
||||
}
|
||||
|
||||
|
||||
@@ -270,7 +270,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
// often source of the NoSuchObjectException and UnmarshalException, probably caused by the failed/crashed/exited daemon
|
||||
// TODO: implement a proper logic to avoid remote calls in such cases
|
||||
try {
|
||||
metrics.measure(BuildTime.CLEAR_JAR_CACHE) {
|
||||
metrics.measure(GradleBuildTime.CLEAR_JAR_CACHE) {
|
||||
daemon.clearJarCache()
|
||||
}
|
||||
} catch (e: RemoteException) {
|
||||
@@ -298,7 +298,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
)
|
||||
val servicesFacade = GradleCompilerServicesFacadeImpl(log, bufferingMessageCollector)
|
||||
val compilationResults = GradleCompilationResults(log, projectRootFile)
|
||||
return metrics.measure(BuildTime.NON_INCREMENTAL_COMPILATION_DAEMON) {
|
||||
return metrics.measure(GradleBuildTime.NON_INCREMENTAL_COMPILATION_DAEMON) {
|
||||
daemon.compile(sessionId, compilerArgs, compilationOptions, servicesFacade, compilationResults)
|
||||
}.also {
|
||||
metrics.addMetrics(compilationResults.buildMetrics)
|
||||
@@ -339,8 +339,8 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
log.info("Options for KOTLIN DAEMON: $compilationOptions")
|
||||
val servicesFacade = GradleIncrementalCompilerServicesFacadeImpl(log, bufferingMessageCollector)
|
||||
val compilationResults = GradleCompilationResults(log, projectRootFile)
|
||||
metrics.addTimeMetric(BuildPerformanceMetric.CALL_KOTLIN_DAEMON)
|
||||
return metrics.measure(BuildTime.RUN_COMPILATION) {
|
||||
metrics.addTimeMetric(GradleBuildPerformanceMetric.CALL_KOTLIN_DAEMON)
|
||||
return metrics.measure(GradleBuildTime.RUN_COMPILATION) {
|
||||
daemon.compile(sessionId, compilerArgs, compilationOptions, servicesFacade, compilationResults)
|
||||
}.also {
|
||||
metrics.addMetrics(compilationResults.buildMetrics)
|
||||
@@ -352,7 +352,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
metrics.addAttribute(BuildAttribute.OUT_OF_PROCESS_EXECUTION)
|
||||
cleanOutputsAndLocalState(outputFiles, log, metrics, reason = "out-of-process execution strategy is non-incremental")
|
||||
|
||||
return metrics.measure(BuildTime.NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS) {
|
||||
return metrics.measure(GradleBuildTime.NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS) {
|
||||
runToolInSeparateProcess(compilerArgs, compilerClassName, compilerFullClasspath, log, buildDir)
|
||||
}
|
||||
}
|
||||
@@ -361,7 +361,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
metrics.addAttribute(BuildAttribute.IN_PROCESS_EXECUTION)
|
||||
cleanOutputsAndLocalState(outputFiles, log, metrics, reason = "in-process execution strategy is non-incremental")
|
||||
|
||||
metrics.startMeasure(BuildTime.NON_INCREMENTAL_COMPILATION_IN_PROCESS)
|
||||
metrics.startMeasure(GradleBuildTime.NON_INCREMENTAL_COMPILATION_IN_PROCESS)
|
||||
// in-process compiler should always be run in a different thread
|
||||
// to avoid leaking thread locals from compiler (see KT-28037)
|
||||
val threadPool = Executors.newSingleThreadExecutor()
|
||||
@@ -375,7 +375,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
bufferingMessageCollector.flush(messageCollector)
|
||||
threadPool.shutdown()
|
||||
|
||||
metrics.endMeasure(BuildTime.NON_INCREMENTAL_COMPILATION_IN_PROCESS)
|
||||
metrics.endMeasure(GradleBuildTime.NON_INCREMENTAL_COMPILATION_IN_PROCESS)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,7 +404,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
|
||||
exitCode
|
||||
)
|
||||
try {
|
||||
metrics.measure(BuildTime.CLEAR_JAR_CACHE) {
|
||||
metrics.measure(GradleBuildTime.CLEAR_JAR_CACHE) {
|
||||
val coreEnvironment = Class.forName("org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment", true, classLoader)
|
||||
val dispose = coreEnvironment.getMethod("disposeApplicationEnvironment")
|
||||
dispose.invoke(null)
|
||||
|
||||
+3
-1
@@ -11,6 +11,8 @@ import org.gradle.api.provider.Property
|
||||
import org.gradle.workers.WorkAction
|
||||
import org.gradle.workers.WorkParameters
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.buildtools.api.CompilationService
|
||||
import org.jetbrains.kotlin.buildtools.api.ExperimentalBuildToolsApi
|
||||
import org.jetbrains.kotlin.buildtools.api.SharedApiClassesClassLoader
|
||||
@@ -27,7 +29,7 @@ internal abstract class BuildToolsApiCompilationWork : WorkAction<BuildToolsApiC
|
||||
val taskOutputsToRestore: ListProperty<File>
|
||||
val snapshotsDir: DirectoryProperty
|
||||
val buildDir: DirectoryProperty
|
||||
val metricsReporter: Property<BuildMetricsReporter>
|
||||
val metricsReporter: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>>
|
||||
}
|
||||
|
||||
private val workArguments
|
||||
|
||||
+4
-2
@@ -10,6 +10,8 @@ import org.gradle.workers.WorkQueue
|
||||
import org.gradle.workers.WorkerExecutor
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.compilerRunner.CompilerExecutionSettings
|
||||
import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
|
||||
import org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWorkArguments
|
||||
@@ -22,7 +24,7 @@ internal class GradleBuildToolsApiCompilerRunner(
|
||||
taskProvider: GradleCompileTaskProvider,
|
||||
jdkToolsJar: File?,
|
||||
compilerExecutionSettings: CompilerExecutionSettings,
|
||||
buildMetrics: BuildMetricsReporter,
|
||||
buildMetrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
private val workerExecutor: WorkerExecutor,
|
||||
private val cachedClassLoadersService: Provider<ClassLoadersCachingBuildService>
|
||||
) : GradleCompilerRunner(taskProvider, jdkToolsJar, compilerExecutionSettings, buildMetrics) {
|
||||
@@ -32,7 +34,7 @@ internal class GradleBuildToolsApiCompilerRunner(
|
||||
workArgs: GradleKotlinCompilerWorkArguments,
|
||||
taskOutputsBackup: TaskOutputsBackup?
|
||||
): WorkQueue {
|
||||
buildMetrics.addTimeMetric(BuildPerformanceMetric.CALL_WORKER)
|
||||
buildMetrics.addTimeMetric(GradleBuildPerformanceMetric.CALL_WORKER)
|
||||
val workQueue = workerExecutor.noIsolation()
|
||||
workQueue.submit(BuildToolsApiCompilationWork::class.java) { params ->
|
||||
params.compilerWorkArguments.set(workArgs)
|
||||
|
||||
+5
-3
@@ -13,7 +13,8 @@ import org.gradle.work.Incremental
|
||||
import org.gradle.work.InputChanges
|
||||
import org.gradle.work.NormalizeLineEndings
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.ClasspathSnapshot
|
||||
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.KaptClasspathChanges
|
||||
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.KaptIncrementalChanges
|
||||
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState
|
||||
import org.jetbrains.kotlin.gradle.plugin.CompilerPluginConfig
|
||||
import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor
|
||||
import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime
|
||||
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
|
||||
import org.jetbrains.kotlin.gradle.tasks.*
|
||||
import org.jetbrains.kotlin.gradle.utils.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||
@@ -101,8 +103,8 @@ abstract class KaptTask @Inject constructor(
|
||||
var useBuildCache: Boolean = false
|
||||
|
||||
@get:Internal
|
||||
override val metrics: Property<BuildMetricsReporter> = objectFactory
|
||||
.property(BuildMetricsReporterImpl())
|
||||
override val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
||||
.property(GradleBuildMetricsReporter())
|
||||
|
||||
@get:Input
|
||||
abstract val verbose: Property<Boolean>
|
||||
|
||||
+3
-1
@@ -10,6 +10,8 @@ import org.gradle.api.file.ConfigurableFileCollection
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import java.io.File
|
||||
|
||||
internal interface TaskWithLocalState : Task {
|
||||
@@ -17,7 +19,7 @@ internal interface TaskWithLocalState : Task {
|
||||
val localStateDirectories: ConfigurableFileCollection
|
||||
|
||||
@get:Internal
|
||||
val metrics: Property<BuildMetricsReporter>
|
||||
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>>
|
||||
}
|
||||
|
||||
internal fun TaskWithLocalState.allOutputFiles(): List<File> =
|
||||
|
||||
+7
-7
@@ -84,22 +84,22 @@ abstract class ClasspathEntrySnapshotTransform : TransformAction<ClasspathEntryS
|
||||
|
||||
private fun doTransform(
|
||||
classpathEntryInputDirOrJar: File, snapshotOutputFile: File,
|
||||
granularity: ClassSnapshotGranularity, metrics: BuildMetricsReporter
|
||||
granularity: ClassSnapshotGranularity, metrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>
|
||||
) {
|
||||
metrics.measure(BuildTime.CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM) {
|
||||
metrics.measure(GradleBuildTime.CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM) {
|
||||
val snapshot = ClasspathEntrySnapshotter.snapshot(classpathEntryInputDirOrJar, granularity, metrics)
|
||||
metrics.measure(BuildTime.SAVE_CLASSPATH_ENTRY_SNAPSHOT) {
|
||||
metrics.measure(GradleBuildTime.SAVE_CLASSPATH_ENTRY_SNAPSHOT) {
|
||||
ClasspathEntrySnapshotExternalizer.saveToFile(snapshotOutputFile, snapshot)
|
||||
}
|
||||
}
|
||||
|
||||
metrics.addMetric(BuildPerformanceMetric.CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM_EXECUTION_COUNT, 1)
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.CLASSPATH_ENTRY_SNAPSHOT_TRANSFORM_EXECUTION_COUNT, 1)
|
||||
if (classpathEntryInputDirOrJar.extension.equals("jar", ignoreCase = true)) {
|
||||
metrics.addMetric(BuildPerformanceMetric.JAR_CLASSPATH_ENTRY_SIZE, classpathEntryInputDirOrJar.length())
|
||||
metrics.addMetric(BuildPerformanceMetric.JAR_CLASSPATH_ENTRY_SNAPSHOT_SIZE, snapshotOutputFile.length())
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.JAR_CLASSPATH_ENTRY_SIZE, classpathEntryInputDirOrJar.length())
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.JAR_CLASSPATH_ENTRY_SNAPSHOT_SIZE, snapshotOutputFile.length())
|
||||
} else {
|
||||
// Only compute the size of the snapshot, not the size of the input directory as walking the file tree has a small overhead
|
||||
metrics.addMetric(BuildPerformanceMetric.DIRECTORY_CLASSPATH_ENTRY_SNAPSHOT_SIZE, snapshotOutputFile.length())
|
||||
metrics.addMetric(GradleBuildPerformanceMetric.DIRECTORY_CLASSPATH_ENTRY_SNAPSHOT_SIZE, snapshotOutputFile.length())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
-14
@@ -24,10 +24,7 @@ import org.gradle.tooling.events.task.TaskFailureResult
|
||||
import org.gradle.tooling.events.task.TaskFinishEvent
|
||||
import org.gradle.tooling.events.task.TaskSkippedResult
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.build.report.statistics.HttpReportService
|
||||
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
|
||||
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
||||
@@ -76,10 +73,10 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
private val failureMessages = ConcurrentLinkedQueue<String>()
|
||||
|
||||
// Info for tasks only
|
||||
private val taskPathToMetricsReporter = ConcurrentHashMap<String, BuildMetricsReporter>()
|
||||
private val taskPathToMetricsReporter = ConcurrentHashMap<String, BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>>()
|
||||
private val taskPathToTaskClass = ConcurrentHashMap<String, String>()
|
||||
|
||||
open fun addTask(taskPath: String, taskClass: Class<*>, metricsReporter: BuildMetricsReporter) {
|
||||
open fun addTask(taskPath: String, taskClass: Class<*>, metricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>) {
|
||||
taskPathToMetricsReporter.put(taskPath, metricsReporter).also {
|
||||
if (it != null) log.warn("Duplicate task path: $taskPath") // Should never happen but log it just in case
|
||||
}
|
||||
@@ -94,7 +91,7 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
isKotlinTransform: Boolean,
|
||||
startTimeMs: Long,
|
||||
totalTimeMs: Long,
|
||||
buildMetrics: BuildMetrics,
|
||||
buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
failureMessage: String?
|
||||
) {
|
||||
buildOperationRecords.add(
|
||||
@@ -108,8 +105,8 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
val taskPath = event.descriptor.taskPath
|
||||
val totalTimeMs = result.endTime - result.startTime
|
||||
|
||||
val buildMetrics = BuildMetrics()
|
||||
buildMetrics.buildTimes.addTimeMs(BuildTime.GRADLE_TASK, totalTimeMs)
|
||||
val buildMetrics = BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>()
|
||||
buildMetrics.buildTimes.addTimeMs(GradleBuildTime.GRADLE_TASK, totalTimeMs)
|
||||
taskPathToMetricsReporter[taskPath]?.let {
|
||||
buildMetrics.addAll(it.getMetrics())
|
||||
}
|
||||
@@ -122,14 +119,14 @@ abstract class BuildMetricsService : BuildService<BuildMetricsService.Parameters
|
||||
collector.report(BooleanMetrics.KOTLIN_COMPILATION_FAILED, event.result is FailureResult)
|
||||
val metricsMap = buildMetrics.buildPerformanceMetrics.asMap()
|
||||
|
||||
val linesOfCode = metricsMap[BuildPerformanceMetric.ANALYZED_LINES_NUMBER]
|
||||
val linesOfCode = metricsMap[GradleBuildPerformanceMetric.ANALYZED_LINES_NUMBER]
|
||||
if (linesOfCode != null && linesOfCode > 0 && totalTimeMs > 0) {
|
||||
collector.report(NumericalMetrics.COMPILED_LINES_OF_CODE, linesOfCode)
|
||||
collector.report(NumericalMetrics.COMPILATION_LINES_PER_SECOND, linesOfCode * 1000 / totalTimeMs, null, linesOfCode)
|
||||
metricsMap[BuildPerformanceMetric.ANALYSIS_LPS]?.also { value ->
|
||||
metricsMap[GradleBuildPerformanceMetric.ANALYSIS_LPS]?.also { value ->
|
||||
collector.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, value, null, linesOfCode)
|
||||
}
|
||||
metricsMap[BuildPerformanceMetric.CODE_GENERATION_LPS]?.also { value ->
|
||||
metricsMap[GradleBuildPerformanceMetric.CODE_GENERATION_LPS]?.also { value ->
|
||||
collector.report(NumericalMetrics.CODE_GENERATION_LINES_PER_SECOND, value, null, linesOfCode)
|
||||
}
|
||||
}
|
||||
@@ -326,7 +323,7 @@ internal class TaskRecord(
|
||||
override val classFqName: String,
|
||||
override val startTimeMs: Long,
|
||||
override val totalTimeMs: Long,
|
||||
override val buildMetrics: BuildMetrics,
|
||||
override val buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
override val didWork: Boolean,
|
||||
override val skipMessage: String?,
|
||||
override val icLogLines: List<String>,
|
||||
@@ -344,7 +341,7 @@ private class TransformRecord(
|
||||
override val isFromKotlinPlugin: Boolean,
|
||||
override val startTimeMs: Long,
|
||||
override val totalTimeMs: Long,
|
||||
override val buildMetrics: BuildMetrics
|
||||
override val buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>
|
||||
) : BuildOperationRecord {
|
||||
override val didWork: Boolean = true
|
||||
override val skipMessage: String? = null
|
||||
|
||||
+16
-16
@@ -13,12 +13,12 @@ import org.jetbrains.kotlin.build.report.statistics.HttpReportService
|
||||
import org.jetbrains.kotlin.build.report.statistics.file.FileReportService
|
||||
import org.jetbrains.kotlin.build.report.statistics.formatSize
|
||||
import org.jetbrains.kotlin.build.report.statistics.BuildFinishStatisticsData
|
||||
import org.jetbrains.kotlin.build.report.statistics.CompileStatisticsData
|
||||
import org.jetbrains.kotlin.build.report.statistics.BuildStartParameters
|
||||
import org.jetbrains.kotlin.build.report.statistics.StatTag
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
|
||||
import org.jetbrains.kotlin.gradle.report.data.BuildExecutionData
|
||||
import org.jetbrains.kotlin.gradle.report.data.BuildOperationRecord
|
||||
import org.jetbrains.kotlin.gradle.report.data.GradleCompileStatisticsData
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult
|
||||
import java.io.File
|
||||
import java.net.InetAddress
|
||||
@@ -230,9 +230,9 @@ class BuildReportsService {
|
||||
}
|
||||
}
|
||||
|
||||
private fun addBuildScanReport(data: CompileStatisticsData, customValuesLimit: Int, buildScan: BuildScanExtensionHolder) {
|
||||
private fun addBuildScanReport(data: GradleCompileStatisticsData, customValuesLimit: Int, buildScan: BuildScanExtensionHolder) {
|
||||
val elapsedTime = measureTimeMillis {
|
||||
tags.addAll(data.tags)
|
||||
tags.addAll(data.getTags())
|
||||
if (customValues < customValuesLimit) {
|
||||
readableString(data).forEach {
|
||||
if (customValues < customValuesLimit) {
|
||||
@@ -240,7 +240,7 @@ class BuildReportsService {
|
||||
} else {
|
||||
log.debug(
|
||||
"Can't add any more custom values into build scan." +
|
||||
" Statistic data for ${data.taskName} was cut due to custom values limit."
|
||||
" Statistic data for ${data.getTaskName()} was cut due to custom values limit."
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -254,10 +254,10 @@ class BuildReportsService {
|
||||
|
||||
private fun addBuildScanValue(
|
||||
buildScan: BuildScanExtensionHolder,
|
||||
data: CompileStatisticsData,
|
||||
data: GradleCompileStatisticsData,
|
||||
customValue: String
|
||||
) {
|
||||
buildScan.buildScan.value(data.taskName, customValue)
|
||||
buildScan.buildScan.value(data.getTaskName(), customValue)
|
||||
customValues++
|
||||
}
|
||||
|
||||
@@ -289,30 +289,30 @@ class BuildReportsService {
|
||||
}
|
||||
}
|
||||
|
||||
private fun readableString(data: CompileStatisticsData): List<String> {
|
||||
private fun readableString(data: GradleCompileStatisticsData): List<String> {
|
||||
val readableString = StringBuilder()
|
||||
if (data.nonIncrementalAttributes.isEmpty()) {
|
||||
if (data.getNonIncrementalAttributes().isEmpty()) {
|
||||
readableString.append("Incremental build; ")
|
||||
data.changes.joinTo(readableString, prefix = "Changes: [", postfix = "]; ") { it.substringAfterLast(File.separator) }
|
||||
data.getChanges().joinTo(readableString, prefix = "Changes: [", postfix = "]; ") { it.substringAfterLast(File.separator) }
|
||||
} else {
|
||||
data.nonIncrementalAttributes.joinTo(
|
||||
data.getNonIncrementalAttributes().joinTo(
|
||||
readableString,
|
||||
prefix = "Non incremental build because: [",
|
||||
postfix = "]; "
|
||||
) { it.readableString }
|
||||
}
|
||||
|
||||
data.kotlinLanguageVersion?.also {
|
||||
data.getKotlinLanguageVersion()?.also {
|
||||
readableString.append("Kotlin language version: $it; ")
|
||||
}
|
||||
|
||||
val timeData =
|
||||
data.buildTimesMetrics.map { (key, value) -> "${key.readableString}: ${value}ms" } //sometimes it is better to have separate variable to be able debug
|
||||
val perfData = data.performanceMetrics.map { (key, value) ->
|
||||
when (key.type) {
|
||||
ValueType.BYTES -> "${key.readableString}: ${formatSize(value)}"
|
||||
data.getBuildTimesMetrics().map { (key, value) -> "${key.getReadableString()}: ${value}ms" } //sometimes it is better to have separate variable to be able debug
|
||||
val perfData = data.getPerformanceMetrics().map { (key, value) ->
|
||||
when (key.getType()) {
|
||||
ValueType.BYTES -> "${key.getReadableString()}: ${formatSize(value)}"
|
||||
ValueType.MILLISECONDS -> DATE_FORMATTER.format(value)
|
||||
else -> "${key.readableString}: $value"
|
||||
else -> "${key.getReadableString()}: $value"
|
||||
}
|
||||
}
|
||||
timeData.union(perfData).joinTo(readableString, ",", "Performance: [", "]")
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* Copyright 2010-2023 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.gradle.report
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
|
||||
class GradleBuildMetricsReporter : BuildMetricsReporterImpl<GradleBuildTime, GradleBuildPerformanceMetric>() {
|
||||
}
|
||||
+3
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.report
|
||||
import org.gradle.api.logging.Logger
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildAttribute
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.gradle.internal.build.metrics.GradleBuildMetricsData
|
||||
import org.jetbrains.kotlin.gradle.internal.build.metrics.BuildOperationData
|
||||
import org.jetbrains.kotlin.gradle.logging.kotlinDebug
|
||||
@@ -26,8 +27,8 @@ internal class MetricsWriter(
|
||||
outputFile.parentFile?.apply { mkdirs() }
|
||||
|
||||
val buildMetricsData = GradleBuildMetricsData()
|
||||
for (metric in BuildTime.values()) {
|
||||
buildMetricsData.parentMetric[metric.name] = metric.parent?.name
|
||||
for (metric in GradleBuildTime.values()) {
|
||||
buildMetricsData.parentMetric[metric.name] = metric.getParent()?.getName()
|
||||
}
|
||||
for (attr in BuildAttribute.values()) {
|
||||
buildMetricsData.buildAttributeKind[attr.name] = attr.kind.name
|
||||
|
||||
+3
-1
@@ -6,12 +6,14 @@
|
||||
package org.jetbrains.kotlin.gradle.report
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
|
||||
import org.jetbrains.kotlin.build.report.statistics.StatTag
|
||||
import org.jetbrains.kotlin.incremental.ChangedFiles
|
||||
|
||||
internal class TaskExecutionResult(
|
||||
val buildMetrics: BuildMetrics,
|
||||
val buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
val taskInfo: TaskExecutionInfo = TaskExecutionInfo(),
|
||||
val icLogLines: List<String> = emptyList()
|
||||
)
|
||||
|
||||
+3
-1
@@ -10,13 +10,15 @@ import org.jetbrains.kotlin.build.report.FileReportSettings
|
||||
import org.jetbrains.kotlin.build.report.HttpReportSettings
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_SINGLE_FILE
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_HTTP_URL
|
||||
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
|
||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
|
||||
|
||||
private val availableMetrics = BuildTime.values().map { it.name } + BuildPerformanceMetric.values().map { it.name }
|
||||
private val availableMetrics = GradleBuildTime.values().map { it.name } + GradleBuildPerformanceMetric.values().map { it.name }
|
||||
|
||||
internal fun reportingSettings(project: Project): ReportingSettings {
|
||||
val properties = PropertiesProvider(project)
|
||||
|
||||
+3
-1
@@ -6,6 +6,8 @@
|
||||
package org.jetbrains.kotlin.gradle.report.data
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.build.report.statistics.BuildStartParameters
|
||||
|
||||
class BuildExecutionData(
|
||||
@@ -14,7 +16,7 @@ class BuildExecutionData(
|
||||
val buildOperationRecord: Collection<BuildOperationRecord>
|
||||
) {
|
||||
val aggregatedMetrics by lazy {
|
||||
BuildMetrics().also { acc ->
|
||||
BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>().also { acc ->
|
||||
buildOperationRecord.forEach { acc.addAll(it.buildMetrics) }
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -6,6 +6,8 @@
|
||||
package org.jetbrains.kotlin.gradle.report.data
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
|
||||
/** Data for a build operation (e.g., task or transform). */
|
||||
interface BuildOperationRecord {
|
||||
@@ -14,7 +16,7 @@ interface BuildOperationRecord {
|
||||
val isFromKotlinPlugin: Boolean
|
||||
val startTimeMs: Long // Measured by System.currentTimeMillis()
|
||||
val totalTimeMs: Long
|
||||
val buildMetrics: BuildMetrics
|
||||
val buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>
|
||||
val didWork: Boolean
|
||||
val skipMessage: String?
|
||||
val icLogLines: List<String>
|
||||
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright 2010-2023 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.gradle.report.data
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildAttribute
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.build.report.statistics.BuildDataType
|
||||
import org.jetbrains.kotlin.build.report.statistics.CompileStatisticsData
|
||||
import org.jetbrains.kotlin.build.report.statistics.StatTag
|
||||
|
||||
class GradleCompileStatisticsData(
|
||||
private val projectName: String?,
|
||||
private val label: String?,
|
||||
private val taskName: String,
|
||||
private val taskResult: String?,
|
||||
private val startTimeMs: Long,
|
||||
private val durationMs: Long,
|
||||
private val tags: Set<StatTag>,
|
||||
private val changes: List<String>,
|
||||
private val buildUuid: String = "Unset",
|
||||
private val kotlinVersion: String,
|
||||
private val kotlinLanguageVersion: String?,
|
||||
private val hostName: String? = "Unset",
|
||||
private val finishTime: Long,
|
||||
private val compilerArguments: List<String>,
|
||||
private val nonIncrementalAttributes: Set<BuildAttribute>,
|
||||
private val buildTimesMetrics: Map<GradleBuildTime, Long>,
|
||||
private val performanceMetrics: Map<GradleBuildPerformanceMetric, Long>,
|
||||
private val gcTimeMetrics: Map<String, Long>?,
|
||||
private val gcCountMetrics: Map<String, Long>?,
|
||||
private val type: String = BuildDataType.TASK_DATA.name,
|
||||
private val fromKotlinPlugin: Boolean?,
|
||||
private val compiledSources: List<String> = emptyList(),
|
||||
private val skipMessage: String?,
|
||||
private val icLogLines: List<String>,
|
||||
) : CompileStatisticsData<GradleBuildTime, GradleBuildPerformanceMetric> {
|
||||
override fun getProjectName(): String? = projectName
|
||||
|
||||
override fun getLabel(): String? = label
|
||||
|
||||
override fun getTaskName(): String = taskName
|
||||
|
||||
override fun getTaskResult(): String? = taskResult
|
||||
|
||||
override fun getStartTimeMs(): Long = startTimeMs
|
||||
|
||||
override fun getDurationMs(): Long = durationMs
|
||||
|
||||
override fun getTags(): Set<StatTag> = tags
|
||||
|
||||
override fun getChanges(): List<String> = changes
|
||||
|
||||
|
||||
override fun getKotlinVersion(): String = kotlinVersion
|
||||
|
||||
override fun getKotlinLanguageVersion(): String? = kotlinLanguageVersion
|
||||
|
||||
override fun getFinishTime(): Long = finishTime
|
||||
|
||||
override fun getCompilerArguments(): List<String> = compilerArguments
|
||||
|
||||
override fun getNonIncrementalAttributes(): Set<BuildAttribute> = nonIncrementalAttributes
|
||||
|
||||
override fun getBuildTimesMetrics(): Map<GradleBuildTime, Long> = buildTimesMetrics
|
||||
|
||||
override fun getPerformanceMetrics(): Map<GradleBuildPerformanceMetric, Long> = performanceMetrics
|
||||
|
||||
override fun getGcTimeMetrics(): Map<String, Long>? = gcTimeMetrics
|
||||
|
||||
override fun getGcCountMetrics(): Map<String, Long>? = gcCountMetrics
|
||||
|
||||
override fun getFromKotlinPlugin(): Boolean? = fromKotlinPlugin
|
||||
|
||||
override fun getSkipMessage(): String? = skipMessage
|
||||
|
||||
override fun getIcLogLines(): List<String> = icLogLines
|
||||
|
||||
}
|
||||
+23
-23
@@ -10,12 +10,12 @@ import org.gradle.tooling.events.task.TaskFinishEvent
|
||||
import org.gradle.tooling.events.task.TaskSkippedResult
|
||||
import org.gradle.tooling.events.task.TaskSuccessResult
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.build.report.statistics.CompileStatisticsData
|
||||
import org.jetbrains.kotlin.build.report.statistics.StatTag
|
||||
import org.jetbrains.kotlin.gradle.report.data.BuildOperationRecord
|
||||
import org.jetbrains.kotlin.incremental.ChangedFiles
|
||||
import java.util.concurrent.TimeUnit
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
|
||||
import org.jetbrains.kotlin.gradle.report.data.GradleCompileStatisticsData
|
||||
|
||||
|
||||
internal fun getTaskResult(event: TaskFinishEvent) = when (val result = event.result) {
|
||||
@@ -40,7 +40,7 @@ internal fun prepareData(
|
||||
onlyKotlinTask: Boolean = true,
|
||||
additionalTags: Set<StatTag> = emptySet(),
|
||||
metricsToShow: Set<String>? = null
|
||||
): CompileStatisticsData? {
|
||||
): GradleCompileStatisticsData? {
|
||||
val result = event.result
|
||||
val taskPath = event.descriptor.taskPath
|
||||
return prepareData(getTaskResult(event), taskPath, result.startTime, result.endTime - result.startTime, projectName, uuid,
|
||||
@@ -60,7 +60,7 @@ internal fun prepareData(
|
||||
onlyKotlinTask: Boolean = true,
|
||||
additionalTags: Set<StatTag> = emptySet(),
|
||||
metricsToShow: Set<String>? = null
|
||||
): CompileStatisticsData? {
|
||||
): GradleCompileStatisticsData? {
|
||||
if (onlyKotlinTask && !(buildOperationRecord is TaskRecord && buildOperationRecord.isFromKotlinPlugin)) {
|
||||
return null
|
||||
}
|
||||
@@ -78,7 +78,7 @@ internal fun prepareData(
|
||||
}
|
||||
val kotlinLanguageVersion = if (buildOperationRecord is TaskRecord) buildOperationRecord.kotlinLanguageVersion else null
|
||||
|
||||
return CompileStatisticsData(
|
||||
return GradleCompileStatisticsData(
|
||||
durationMs = buildOperationRecord.totalTimeMs,
|
||||
taskResult = taskResult?.name,
|
||||
label = label,
|
||||
@@ -110,51 +110,51 @@ fun collectCompilerArguments(buildOperationRecord: BuildOperationRecord?): List<
|
||||
} else emptyList()
|
||||
}
|
||||
|
||||
private fun <E : Enum<E>> filterMetrics(
|
||||
private fun <E : BuildTime> filterMetrics(
|
||||
expectedMetrics: Set<String>?,
|
||||
buildTimesMetrics: Map<E, Long>
|
||||
): Map<E, Long> = expectedMetrics?.let { buildTimesMetrics.filterKeys { metric -> it.contains(metric.name) } } ?: buildTimesMetrics
|
||||
): Map<E, Long> = expectedMetrics?.let { buildTimesMetrics.filterKeys { metric -> it.contains(metric.getName()) } } ?: buildTimesMetrics
|
||||
|
||||
private fun collectBuildAttributes(buildMetrics: BuildMetrics?): Set<BuildAttribute> {
|
||||
private fun collectBuildAttributes(buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>?): Set<BuildAttribute> {
|
||||
return buildMetrics?.buildAttributes?.asMap()?.filter { it.value > 0 }?.keys ?: emptySet()
|
||||
}
|
||||
|
||||
|
||||
private fun collectBuildPerformanceMetrics(
|
||||
buildMetrics: BuildMetrics?
|
||||
): Map<BuildPerformanceMetric, Long> {
|
||||
buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>?
|
||||
): Map<GradleBuildPerformanceMetric, Long> {
|
||||
return buildMetrics?.buildPerformanceMetrics?.asMap()
|
||||
?.filterValues { value -> value != 0L }
|
||||
?.filterKeys { key ->
|
||||
key !in listOf(
|
||||
BuildPerformanceMetric.START_WORKER_EXECUTION,
|
||||
BuildPerformanceMetric.CALL_WORKER,
|
||||
BuildPerformanceMetric.CALL_KOTLIN_DAEMON,
|
||||
BuildPerformanceMetric.START_KOTLIN_DAEMON_EXECUTION
|
||||
GradleBuildPerformanceMetric.START_WORKER_EXECUTION,
|
||||
GradleBuildPerformanceMetric.CALL_WORKER,
|
||||
GradleBuildPerformanceMetric.CALL_KOTLIN_DAEMON,
|
||||
GradleBuildPerformanceMetric.START_KOTLIN_DAEMON_EXECUTION
|
||||
)
|
||||
}
|
||||
?: emptyMap()
|
||||
}
|
||||
private fun collectBuildMetrics(
|
||||
buildMetrics: BuildMetrics?,
|
||||
buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>?,
|
||||
gradleTaskStartTime: Long? = null,
|
||||
taskFinishEventTime: Long? = null,
|
||||
): Map<BuildTime, Long> {
|
||||
val taskBuildMetrics = HashMap<BuildTime, Long>(buildMetrics?.buildTimes?.asMapMs())
|
||||
): Map<GradleBuildTime, Long> {
|
||||
val taskBuildMetrics = HashMap<GradleBuildTime, Long>(buildMetrics?.buildTimes?.asMapMs())
|
||||
val performanceMetrics = buildMetrics?.buildPerformanceMetrics?.asMap() ?: emptyMap()
|
||||
gradleTaskStartTime?.let { startTime ->
|
||||
performanceMetrics[BuildPerformanceMetric.START_TASK_ACTION_EXECUTION]?.let { actionStartTime ->
|
||||
taskBuildMetrics.put(BuildTime.GRADLE_TASK_PREPARATION, actionStartTime - startTime)
|
||||
performanceMetrics[GradleBuildPerformanceMetric.START_TASK_ACTION_EXECUTION]?.let { actionStartTime ->
|
||||
taskBuildMetrics.put(GradleBuildTime.GRADLE_TASK_PREPARATION, actionStartTime - startTime)
|
||||
}
|
||||
}
|
||||
taskFinishEventTime?.let { listenerNotificationTime ->
|
||||
performanceMetrics[BuildPerformanceMetric.FINISH_KOTLIN_DAEMON_EXECUTION]?.let { daemonFinishTime ->
|
||||
taskBuildMetrics.put(BuildTime.TASK_FINISH_LISTENER_NOTIFICATION, listenerNotificationTime - daemonFinishTime)
|
||||
performanceMetrics[GradleBuildPerformanceMetric.FINISH_KOTLIN_DAEMON_EXECUTION]?.let { daemonFinishTime ->
|
||||
taskBuildMetrics.put(GradleBuildTime.TASK_FINISH_LISTENER_NOTIFICATION, listenerNotificationTime - daemonFinishTime)
|
||||
}
|
||||
}
|
||||
performanceMetrics[BuildPerformanceMetric.CALL_WORKER]?.let { callWorkerTime ->
|
||||
performanceMetrics[BuildPerformanceMetric.START_WORKER_EXECUTION]?.let { startWorkerExecutionTime ->
|
||||
taskBuildMetrics.put(BuildTime.RUN_WORKER_DELAY, TimeUnit.NANOSECONDS.toMillis(startWorkerExecutionTime - callWorkerTime))
|
||||
performanceMetrics[GradleBuildPerformanceMetric.CALL_WORKER]?.let { callWorkerTime ->
|
||||
performanceMetrics[GradleBuildPerformanceMetric.START_WORKER_EXECUTION]?.let { startWorkerExecutionTime ->
|
||||
taskBuildMetrics.put(GradleBuildTime.RUN_WORKER_DELAY, TimeUnit.NANOSECONDS.toMillis(startWorkerExecutionTime - callWorkerTime))
|
||||
}
|
||||
}
|
||||
return taskBuildMetrics.filterValues { value -> value != 0L }
|
||||
|
||||
+3
-5
@@ -22,9 +22,7 @@ import org.gradle.deployment.internal.DeploymentRegistry
|
||||
import org.gradle.process.internal.ExecHandle
|
||||
import org.gradle.process.internal.ExecHandleFactory
|
||||
import org.gradle.work.NormalizeLineEndings
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
|
||||
@@ -67,7 +65,7 @@ constructor(
|
||||
open val execHandleFactory: ExecHandleFactory
|
||||
get() = injected
|
||||
|
||||
private val metrics: Property<BuildMetricsReporter> = project.objects
|
||||
private val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
||||
.property(BuildMetricsReporterImpl())
|
||||
|
||||
@Suppress("unused")
|
||||
@@ -299,7 +297,7 @@ constructor(
|
||||
.map { it.length() }
|
||||
.sum()
|
||||
.let {
|
||||
buildMetrics.addMetric(BuildPerformanceMetric.BUNDLE_SIZE, it)
|
||||
buildMetrics.addMetric(GradleBuildPerformanceMetric.BUNDLE_SIZE, it)
|
||||
}
|
||||
|
||||
buildMetricsService.orNull?.also { it.addTask(path, this.javaClass, buildMetrics) }
|
||||
|
||||
+4
-6
@@ -17,9 +17,7 @@ import org.gradle.api.provider.SetProperty
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.*
|
||||
import org.gradle.workers.WorkerExecutor
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.measure
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.cli.common.CompilerSystemProperties
|
||||
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
||||
import org.jetbrains.kotlin.compilerRunner.CompilerExecutionSettings
|
||||
@@ -234,8 +232,8 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
|
||||
fun execute(inputChanges: InputChanges) {
|
||||
notifyUserAboutExperimentalICOptimizations()
|
||||
val buildMetrics = metrics.get()
|
||||
buildMetrics.addTimeMetric(BuildPerformanceMetric.START_TASK_ACTION_EXECUTION)
|
||||
buildMetrics.measure(BuildTime.OUT_OF_WORKER_TASK_ACTION) {
|
||||
buildMetrics.addTimeMetric(GradleBuildPerformanceMetric.START_TASK_ACTION_EXECUTION)
|
||||
buildMetrics.measure(GradleBuildTime.OUT_OF_WORKER_TASK_ACTION) {
|
||||
KotlinBuildStatsService.applyIfInitialised {
|
||||
if (name.contains("Test"))
|
||||
it.report(BooleanMetrics.TESTS_EXECUTED, true)
|
||||
@@ -252,7 +250,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
|
||||
// To prevent this, we backup outputs before incremental build and restore when exception is thrown
|
||||
val outputsBackup: TaskOutputsBackup? =
|
||||
if (isIncrementalCompilationEnabled() && inputChanges.isIncremental)
|
||||
buildMetrics.measure(BuildTime.BACKUP_OUTPUT) {
|
||||
buildMetrics.measure(GradleBuildTime.BACKUP_OUTPUT) {
|
||||
TaskOutputsBackup(
|
||||
fileSystemOperations,
|
||||
layout.buildDirectory,
|
||||
|
||||
+5
-3
@@ -20,11 +20,13 @@ import org.gradle.api.tasks.util.PatternSet
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||
import org.jetbrains.kotlin.cli.common.arguments.CommonToolArguments
|
||||
import org.jetbrains.kotlin.gradle.internal.CompilerArgumentAware
|
||||
import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerArgumentsProducer
|
||||
import org.jetbrains.kotlin.gradle.report.GradleBuildMetricsReporter
|
||||
import org.jetbrains.kotlin.gradle.utils.fileExtensionCasePermutations
|
||||
import org.jetbrains.kotlin.gradle.utils.property
|
||||
import javax.inject.Inject
|
||||
@@ -113,8 +115,8 @@ abstract class AbstractKotlinCompileTool<T : CommonToolArguments> @Inject constr
|
||||
}
|
||||
|
||||
@get:Internal
|
||||
final override val metrics: Property<BuildMetricsReporter> = project.objects
|
||||
.property(BuildMetricsReporterImpl())
|
||||
final override val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
||||
.property(GradleBuildMetricsReporter())
|
||||
|
||||
/**
|
||||
* By default, should be set by plugin from [COMPILER_CLASSPATH_CONFIGURATION_NAME] configuration.
|
||||
|
||||
+3
-5
@@ -1,8 +1,6 @@
|
||||
package org.jetbrains.kotlin.gradle.tasks
|
||||
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||
import org.jetbrains.kotlin.build.report.metrics.measure
|
||||
import org.jetbrains.kotlin.build.report.metrics.*
|
||||
import org.jetbrains.kotlin.cli.common.ExitCode
|
||||
import org.jetbrains.kotlin.buildtools.api.KotlinLogger
|
||||
import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState
|
||||
@@ -71,7 +69,7 @@ internal fun TaskWithLocalState.cleanOutputsAndLocalState(reason: String? = null
|
||||
internal fun cleanOutputsAndLocalState(
|
||||
outputFiles: Iterable<File>,
|
||||
log: KotlinLogger,
|
||||
metrics: BuildMetricsReporter,
|
||||
metrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
|
||||
reason: String? = null
|
||||
) {
|
||||
log.kotlinDebug {
|
||||
@@ -79,7 +77,7 @@ internal fun cleanOutputsAndLocalState(
|
||||
"Cleaning output$suffix:"
|
||||
}
|
||||
|
||||
metrics.measure(BuildTime.CLEAR_OUTPUT) {
|
||||
metrics.measure(GradleBuildTime.CLEAR_OUTPUT) {
|
||||
for (file in outputFiles) {
|
||||
when {
|
||||
file.isDirectory -> {
|
||||
|
||||
+35
-35
@@ -43,12 +43,12 @@ class ReportDataTest {
|
||||
)
|
||||
|
||||
assertNotNull(statisticData)
|
||||
assertTrue(statisticData.tags.contains(StatTag.KOTLIN_DEBUG))
|
||||
assertTrue(statisticData.tags.contains(StatTag.NON_INCREMENTAL))
|
||||
assertTrue(statisticData.tags.contains(StatTag.KOTLIN_1))
|
||||
assertTrue(statisticData.getTags().contains(StatTag.KOTLIN_DEBUG))
|
||||
assertTrue(statisticData.getTags().contains(StatTag.NON_INCREMENTAL))
|
||||
assertTrue(statisticData.getTags().contains(StatTag.KOTLIN_1))
|
||||
}
|
||||
|
||||
private fun taskRecord(buildMetrics: BuildMetrics) = TaskRecord(
|
||||
private fun taskRecord(buildMetrics: BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>) = TaskRecord(
|
||||
path = kotlinTaskPath,
|
||||
classFqName = "org.jetbrains.kotlin.TestTask",
|
||||
startTimeMs = 10,
|
||||
@@ -67,17 +67,17 @@ class ReportDataTest {
|
||||
fun testMetricFilter() {
|
||||
val buildOperationRecord = taskRecord(
|
||||
BuildMetrics(
|
||||
buildPerformanceMetrics = BuildPerformanceMetrics().also {
|
||||
it.add(BuildPerformanceMetric.COMPILE_ITERATION)
|
||||
it.add(BuildPerformanceMetric.CLASSPATH_ENTRY_COUNT)
|
||||
it.add(BuildPerformanceMetric.BUNDLE_SIZE)
|
||||
it.add(BuildPerformanceMetric.CACHE_DIRECTORY_SIZE)
|
||||
buildPerformanceMetrics = BuildPerformanceMetrics<GradleBuildPerformanceMetric>().also {
|
||||
it.add(GradleBuildPerformanceMetric.COMPILE_ITERATION)
|
||||
it.add(GradleBuildPerformanceMetric.CLASSPATH_ENTRY_COUNT)
|
||||
it.add(GradleBuildPerformanceMetric.BUNDLE_SIZE)
|
||||
it.add(GradleBuildPerformanceMetric.CACHE_DIRECTORY_SIZE)
|
||||
},
|
||||
buildTimes = BuildTimes().also {
|
||||
it.addTimeMs(BuildTime.STORE_BUILD_INFO, 20)
|
||||
it.addTimeMs(BuildTime.GRADLE_TASK_ACTION, 100)
|
||||
it.addTimeMs(BuildTime.RESTORE_OUTPUT_FROM_BACKUP, 10)
|
||||
it.addTimeMs(BuildTime.IC_ANALYZE_JAR_FILES, 10)
|
||||
buildTimes = BuildTimes<GradleBuildTime>().also {
|
||||
it.addTimeMs(GradleBuildTime.STORE_BUILD_INFO, 20)
|
||||
it.addTimeMs(GradleBuildTime.GRADLE_TASK_ACTION, 100)
|
||||
it.addTimeMs(GradleBuildTime.RESTORE_OUTPUT_FROM_BACKUP, 10)
|
||||
it.addTimeMs(GradleBuildTime.IC_ANALYZE_JAR_FILES, 10)
|
||||
}
|
||||
)
|
||||
)
|
||||
@@ -92,22 +92,22 @@ class ReportDataTest {
|
||||
onlyKotlinTask = true,
|
||||
additionalTags = setOf(StatTag.KOTLIN_DEBUG),
|
||||
metricsToShow = setOf(
|
||||
BuildPerformanceMetric.BUNDLE_SIZE.name,// from TaskExecutionResult
|
||||
BuildTime.GRADLE_TASK_ACTION.name,// from buildOperationRecord
|
||||
BuildPerformanceMetric.COMPILE_ITERATION.name, //from buildOperationRecord
|
||||
BuildTime.IC_CALCULATE_INITIAL_DIRTY_SET.name, //not set
|
||||
BuildPerformanceMetric.START_WORKER_EXECUTION.name, //not set
|
||||
BuildTime.RESTORE_OUTPUT_FROM_BACKUP.name, //from TaskExecutionResult
|
||||
GradleBuildPerformanceMetric.BUNDLE_SIZE.name,// from TaskExecutionResult
|
||||
GradleBuildTime.GRADLE_TASK_ACTION.name,// from buildOperationRecord
|
||||
GradleBuildPerformanceMetric.COMPILE_ITERATION.name, //from buildOperationRecord
|
||||
GradleBuildTime.IC_CALCULATE_INITIAL_DIRTY_SET.name, //not set
|
||||
GradleBuildPerformanceMetric.START_WORKER_EXECUTION.name, //not set
|
||||
GradleBuildTime.RESTORE_OUTPUT_FROM_BACKUP.name, //from TaskExecutionResult
|
||||
)
|
||||
)
|
||||
|
||||
assertNotNull(statisticData)
|
||||
assertEquals(2, statisticData.performanceMetrics.size)
|
||||
assertTrue(statisticData.performanceMetrics.containsKey(BuildPerformanceMetric.BUNDLE_SIZE))
|
||||
assertTrue(statisticData.performanceMetrics.containsKey(BuildPerformanceMetric.COMPILE_ITERATION))
|
||||
assertEquals(2, statisticData.buildTimesMetrics.size)
|
||||
assertTrue(statisticData.buildTimesMetrics.containsKey(BuildTime.GRADLE_TASK_ACTION))
|
||||
assertTrue(statisticData.buildTimesMetrics.containsKey(BuildTime.RESTORE_OUTPUT_FROM_BACKUP))
|
||||
assertEquals(2, statisticData.getPerformanceMetrics().size)
|
||||
assertTrue(statisticData.getPerformanceMetrics().containsKey(GradleBuildPerformanceMetric.BUNDLE_SIZE))
|
||||
assertTrue(statisticData.getPerformanceMetrics().containsKey(GradleBuildPerformanceMetric.COMPILE_ITERATION))
|
||||
assertEquals(2, statisticData.getBuildTimesMetrics().size)
|
||||
assertTrue(statisticData.getBuildTimesMetrics().containsKey(GradleBuildTime.GRADLE_TASK_ACTION))
|
||||
assertTrue(statisticData.getBuildTimesMetrics().containsKey(GradleBuildTime.RESTORE_OUTPUT_FROM_BACKUP))
|
||||
}
|
||||
|
||||
@Ignore //temporary ignore flaky test
|
||||
@@ -120,12 +120,12 @@ class ReportDataTest {
|
||||
val finishGradleTask = System.nanoTime()
|
||||
|
||||
val buildOperationRecord = taskRecord(
|
||||
BuildMetrics(
|
||||
buildPerformanceMetrics = BuildPerformanceMetrics().also {
|
||||
it.add(BuildPerformanceMetric.FINISH_KOTLIN_DAEMON_EXECUTION, System.currentTimeMillis())
|
||||
it.add(BuildPerformanceMetric.START_WORKER_EXECUTION, TimeUnit.MILLISECONDS.toNanos(startWorker))
|
||||
it.add(BuildPerformanceMetric.START_TASK_ACTION_EXECUTION, startTaskAction)
|
||||
it.add(BuildPerformanceMetric.CALL_WORKER, TimeUnit.MILLISECONDS.toNanos(callWorker))
|
||||
BuildMetrics<GradleBuildTime, GradleBuildPerformanceMetric>(
|
||||
buildPerformanceMetrics = BuildPerformanceMetrics<GradleBuildPerformanceMetric>().also {
|
||||
it.add(GradleBuildPerformanceMetric.FINISH_KOTLIN_DAEMON_EXECUTION, System.currentTimeMillis())
|
||||
it.add(GradleBuildPerformanceMetric.START_WORKER_EXECUTION, TimeUnit.MILLISECONDS.toNanos(startWorker))
|
||||
it.add(GradleBuildPerformanceMetric.START_TASK_ACTION_EXECUTION, startTaskAction)
|
||||
it.add(GradleBuildPerformanceMetric.CALL_WORKER, TimeUnit.MILLISECONDS.toNanos(callWorker))
|
||||
}
|
||||
)
|
||||
)
|
||||
@@ -141,9 +141,9 @@ class ReportDataTest {
|
||||
additionalTags = setOf(StatTag.KOTLIN_DEBUG),
|
||||
)
|
||||
assertNotNull(statisticData)
|
||||
assertEquals(startTaskAction - startGradleTask, statisticData.buildTimesMetrics[BuildTime.GRADLE_TASK_PREPARATION])
|
||||
assertEquals(1, statisticData.buildTimesMetrics[BuildTime.TASK_FINISH_LISTENER_NOTIFICATION]?.sign)
|
||||
assertEquals(startWorker - callWorker, statisticData.buildTimesMetrics[BuildTime.RUN_WORKER_DELAY])
|
||||
assertEquals(startTaskAction - startGradleTask, statisticData.getBuildTimesMetrics()[GradleBuildTime.GRADLE_TASK_PREPARATION])
|
||||
assertEquals(1, statisticData.getBuildTimesMetrics()[GradleBuildTime.TASK_FINISH_LISTENER_NOTIFICATION]?.sign)
|
||||
assertEquals(startWorker - callWorker, statisticData.getBuildTimesMetrics()[GradleBuildTime.RUN_WORKER_DELAY])
|
||||
}
|
||||
|
||||
private fun taskFinishEvent(startTime: Long = 1L, endTime: Long =10L) = object : TaskFinishEvent {
|
||||
|
||||
Reference in New Issue
Block a user