More stable reporting of compilation in statistics

This commit is contained in:
Andrey Uskov
2021-11-09 21:58:50 +03:00
committed by TeamCityServer
parent 2fe337f58a
commit b5456539aa
3 changed files with 19 additions and 13 deletions
@@ -70,9 +70,7 @@ class KotlinBuildStatHandler {
internal fun reportGlobalMetrics(gradle: Gradle, sessionLogger: BuildSessionLogger) {
sessionLogger.report(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath)
System.getProperty("os.name")?.also {
sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name"))
}
System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) }
sessionLogger.report(NumericalMetrics.CPU_NUMBER_OF_CORES, Runtime.getRuntime().availableProcessors().toLong())
sessionLogger.report(StringMetrics.GRADLE_VERSION, gradle.gradleVersion)
sessionLogger.report(BooleanMetrics.EXECUTED_FROM_IDEA, System.getProperty("idea.active") != null)
@@ -84,15 +82,12 @@ class KotlinBuildStatHandler {
gradle.taskGraph.whenReady() { taskExecutionGraph ->
val executedTaskNames = taskExecutionGraph.allTasks.map { it.name }.distinct()
report(sessionLogger, BooleanMetrics.COMPILATION_STARTED, executedTaskNames.contains("compileKotlin"), null)
report(sessionLogger, BooleanMetrics.TESTS_EXECUTED, executedTaskNames.contains("compileTestKotlin"), null)
report(sessionLogger, BooleanMetrics.MAVEN_PUBLISH_EXECUTED, executedTaskNames.contains("install"), null)
}
fun buildSrcExists(project: Project) = File(project.projectDir, "buildSrc").exists()
if (buildSrcExists(gradle.rootProject)) {
sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, true)
}
sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, buildSrcExists(gradle.rootProject))
val statisticOverhead = measureTimeMillis {
gradle.allprojects { project ->
for (configuration in project.configurations) {
@@ -56,6 +56,8 @@ import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.incremental.ChangedFiles
import org.jetbrains.kotlin.incremental.ClasspathChanges
import org.jetbrains.kotlin.incremental.IncrementalCompilerRunner
import org.jetbrains.kotlin.library.impl.isKotlinLibrary
import org.jetbrains.kotlin.statistics.BuildSessionLogger
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
import org.jetbrains.kotlin.utils.JsLibraryUtils
import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -330,6 +332,12 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> : AbstractKotl
@TaskAction
fun execute(inputChanges: InputChanges) {
KotlinBuildStatsService.applyIfInitialised {
if (name.contains("Test"))
it.report(BooleanMetrics.TESTS_EXECUTED, true)
else
it.report(BooleanMetrics.COMPILATION_STARTED, true)
}
val buildMetrics = metrics.get()
buildMetrics.measure(BuildTime.GRADLE_TASK_ACTION) {
systemPropertiesService.get().startIntercept()
@@ -842,7 +850,7 @@ abstract class KotlinCompile @Inject constructor(
private fun getClasspathChanges(inputChanges: InputChanges): ClasspathChanges {
val fileChanges = inputChanges.getFileChanges(classpathSnapshotProperties.classpathSnapshot).toList()
return if (fileChanges.isEmpty()) {
ClasspathChanges.Available(emptySet(), emptySet())
ClasspathChanges.Available(LinkedHashSet(), LinkedHashSet())
} else {
val previousClasspathEntrySnapshotFiles = getPreviousClasspathEntrySnapshotFiles()
if (previousClasspathEntrySnapshotFiles.isEmpty()) {
@@ -1046,7 +1054,7 @@ abstract class Kotlin2JsCompile @Inject constructor(
get() = (kotlinOptions as KotlinJsOptionsImpl).sourceMapBaseDirs
private fun isHybridKotlinJsLibrary(file: File): Boolean =
JsLibraryUtils.isKotlinJavascriptLibrary(file) && JsLibraryUtils.isKotlinJavascriptIrLibrary(file)
JsLibraryUtils.isKotlinJavascriptLibrary(file) && isKotlinLibrary(file)
private fun KotlinJsOptions.isPreIrBackendDisabled(): Boolean =
listOf(
@@ -1079,7 +1087,7 @@ abstract class Kotlin2JsCompile @Inject constructor(
if (kotlinOptions.isPreIrBackendDisabled()) {
//::isKotlinLibrary
// Workaround for KT-47797
{ JsLibraryUtils.isKotlinJavascriptIrLibrary(it) }
{ isKotlinLibrary(it) }
} else {
::isHybridKotlinJsLibrary
}
@@ -93,15 +93,18 @@ class MetricsContainer : IStatisticsValuesConsumer {
private fun processProjectName(subprojectName: String?, perProject: Boolean) =
if (perProject && subprojectName != null) sha256(subprojectName) else null
private fun getProjectHash(perProject: Boolean, subprojectName: String?) =
if (subprojectName == null) null else processProjectName(subprojectName, perProject)
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?) {
val projectHash = if (subprojectName == null) null else processProjectName(subprojectName, metric.perProject)
val projectHash = getProjectHash(metric.perProject, subprojectName)
val metricContainer = booleanMetrics[MetricDescriptor(metric.name, projectHash)] ?: metric.type.newMetricContainer()
.also { booleanMetrics[MetricDescriptor(metric.name, projectHash)] = it }
metricContainer.addValue(metric.anonymization.anonymize(value))
}
override fun report(metric: NumericalMetrics, value: Long, subprojectName: String?) {
val projectHash = if (subprojectName == null) null else processProjectName(subprojectName, metric.perProject)
val projectHash = getProjectHash(metric.perProject, subprojectName)
val metricContainer = numericalMetrics[MetricDescriptor(metric.name, projectHash)] ?: metric.type.newMetricContainer()
.also { numericalMetrics[MetricDescriptor(metric.name, projectHash)] = it }
metricContainer.addValue(metric.anonymization.anonymize(value))