diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt index 9810a544a53..a7e4958ab22 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/report/BuildMetricsService.kt @@ -10,6 +10,7 @@ import org.gradle.api.logging.Logging import org.gradle.api.provider.Provider import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters +import org.gradle.tooling.events.FailureResult import org.gradle.tooling.events.FinishEvent import org.gradle.tooling.events.OperationCompletionListener import org.gradle.tooling.events.task.TaskExecutionResult @@ -18,9 +19,13 @@ import org.gradle.tooling.events.task.TaskFinishEvent import org.gradle.tooling.events.task.TaskSkippedResult 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.gradle.plugin.internal.state.TaskExecutionResults +import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.report.data.BuildOperationRecord +import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics +import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentLinkedQueue @@ -72,7 +77,32 @@ abstract class BuildMetricsService : BuildService, buildMetrics.addAll(it.getMetrics()) } val taskExecutionResult = TaskExecutionResults[taskPath] - taskExecutionResult?.buildMetrics?.also { buildMetrics.addAll(it) } + taskExecutionResult?.buildMetrics?.also { + buildMetrics.addAll(it) + + KotlinBuildStatsService.applyIfInitialised { collector -> + collector.report(NumericalMetrics.COMPILATION_DURATION, totalTimeMs) + collector.report(BooleanMetrics.KOTLIN_COMPILATION_FAILED, event.result is FailureResult) + val metricsMap = buildMetrics.buildPerformanceMetrics.asMap() + + val linesOfCode = metricsMap[BuildPerformanceMetric.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 { + collector.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, it, null, linesOfCode) + } + metricsMap[BuildPerformanceMetric.CODE_GENERATION_LPS]?.also { value -> + collector.report(NumericalMetrics.CODE_GENERATION_LINES_PER_SECOND, value, null, linesOfCode) + } + } + collector.report(NumericalMetrics.COMPILATIONS_COUNT, 1) + collector.report( + NumericalMetrics.INCREMENTAL_COMPILATIONS_COUNT, + if (taskExecutionResult.buildMetrics.buildAttributes.asMap().isEmpty()) 1 else 0 + ) + } + } buildOperationRecords.add( TaskRecord( diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/statistics/BuildSessionLoggerTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/statistics/BuildSessionLoggerTest.kt index 412b36e4229..a32a7811e1f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/statistics/BuildSessionLoggerTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/statistics/BuildSessionLoggerTest.kt @@ -208,4 +208,18 @@ class BuildSessionLoggerTest { } } } + + @Test + fun testWeight() { + val logger = BuildSessionLogger(rootFolder) + logger.startBuildSession(1, 1) + + logger.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, 10, null, 9) + logger.report(NumericalMetrics.ANALYSIS_LINES_PER_SECOND, 100, null, 1) + + logger.finishBuildSession("Build", null) + MetricsContainer.readFromFile(rootFolder.listFiles()?.single()?.listFiles()?.single() ?: fail("Could not find stat file")) { + assertEquals(19L, it.getMetric(NumericalMetrics.ANALYSIS_LINES_PER_SECOND)?.getValue()) + } + } } diff --git a/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt b/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt index 78ad28c8837..7951204ff40 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt @@ -52,5 +52,6 @@ enum class BooleanMetrics(val type: BooleanOverridePolicy, val anonymization: Bo COMPILATION_STARTED(OVERRIDE, SAFE), TESTS_EXECUTED(OVERRIDE, SAFE), MAVEN_PUBLISH_EXECUTED(OVERRIDE, SAFE), - BUILD_FAILED(OVERRIDE, SAFE) + BUILD_FAILED(OVERRIDE, SAFE), + KOTLIN_COMPILATION_FAILED(OR, SAFE) } diff --git a/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt b/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt index 93f3dacb9c0..a9ce40e0577 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/common/kotlin/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt @@ -45,6 +45,15 @@ enum class NumericalMetrics(val type: NumberOverridePolicy, val anonymization: N //duration of the execution gradle phase GRADLE_EXECUTION_DURATION(OVERRIDE, SAFE), + //performance of compiler + COMPILATIONS_COUNT(SUM, RANDOM_10_PERCENT), + INCREMENTAL_COMPILATIONS_COUNT(SUM, RANDOM_10_PERCENT), + COMPILATION_DURATION(SUM, SAFE), + COMPILED_LINES_OF_CODE(SUM, RANDOM_10_PERCENT), + COMPILATION_LINES_PER_SECOND(OVERRIDE, SAFE), + ANALYSIS_LINES_PER_SECOND(AVERAGE, SAFE), + CODE_GENERATION_LINES_PER_SECOND(AVERAGE, SAFE), + NUMBER_OF_SUBPROJECTS(SUM, RANDOM_10_PERCENT), STATISTICS_VISIT_ALL_PROJECTS_OVERHEAD(SUM, RANDOM_10_PERCENT),