Improved collecting compilation metrics in FUS

#KT-55537 Fixed
This commit is contained in:
Andrey Uskov
2022-12-15 22:45:11 +03:00
parent 2be68065af
commit 0f33722124
4 changed files with 56 additions and 2 deletions
@@ -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<BuildServiceParameters.None>,
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(
@@ -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())
}
}
}
@@ -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)
}
@@ -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),