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 e18b1c1e92a..d2a000503f8 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 @@ -56,6 +56,7 @@ abstract class KotlinBasePluginWrapper( override fun apply(project: Project) { val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project.gradle) + statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion) checkGradleCompatibility() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt index 1ea4f90f7ae..79b8b0e6e65 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt @@ -13,8 +13,11 @@ import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder +import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile +import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics +import org.jetbrains.kotlin.statistics.metrics.StringMetrics internal class DefaultLanguageSettingsBuilder : LanguageSettingsBuilder { private var languageVersionImpl: LanguageVersion? = null @@ -105,6 +108,11 @@ internal fun applyLanguageSettingsToKotlinTask( languageSettingsBuilder.experimentalAnnotationsInUse.forEach { annotationName -> freeCompilerArgs += "-Xopt-in=$annotationName" } + KotlinBuildStatsService.getInstance()?.apply { + report(BooleanMetrics.KOTLIN_PROGRESSIVE_MODE, languageSettingsBuilder.progressiveMode) + apiVersion?.also { v -> report(StringMetrics.KOTLIN_API_VERSION, v) } + languageVersion?.also { v -> report(StringMetrics.KOTLIN_LANGUAGE_VERSION, v) } + } } private val apiVersionValues = ApiVersion.run { listOf(KOTLIN_1_0, KOTLIN_1_1, KOTLIN_1_2, KOTLIN_1_3) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt index f517fba3dc5..9bcf4f0b2f5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.statistics import org.gradle.BuildAdapter import org.gradle.BuildResult +import org.gradle.api.Project import org.gradle.api.artifacts.DependencySet import org.gradle.api.invocation.Gradle import org.gradle.api.logging.Logging @@ -206,6 +207,26 @@ internal class DefaultKotlinBuildStatsService internal constructor( StringMetrics.LIBRARY_HIBERNATE_VERSION, dependency.version ?: "0.0.0" ) + dependency.group == "org.jetbrains.kotlin" && dependency.name.startsWith("kotlin-stdlib") -> sessionLogger.report( + StringMetrics.KOTLIN_STDLIB_VERSION, + dependency.version ?: "0.0.0" + ) + dependency.group == "org.jetbrains.kotlinx" && dependency.name == "kotlinx-coroutines" -> sessionLogger.report( + StringMetrics.KOTLIN_COROUTINES_VERSION, + dependency.version ?: "0.0.0" + ) + dependency.group == "org.jetbrains.kotlin" && dependency.name == "kotlin-reflect" -> sessionLogger.report( + StringMetrics.KOTLIN_REFLECT_VERSION, + dependency.version ?: "0.0.0" + ) + dependency.group == "org.jetbrains.kotlinx" && dependency.name.startsWith("kotlinx-serialization-runtime") -> sessionLogger.report( + StringMetrics.KOTLIN_SERIALIZATION_VERSION, + dependency.version ?: "0.0.0" + ) + dependency.group == "com.android.tools.build" && dependency.name.startsWith("gradle") -> sessionLogger.report( + StringMetrics.ANDROID_GRADLE_PLUGIN_VERSION, + dependency.version ?: "0.0.0" + ) } } } @@ -217,7 +238,21 @@ internal class DefaultKotlinBuildStatsService internal constructor( 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) + sessionLogger.report(NumericalMetrics.GRADLE_DAEMON_HEAP_SIZE, Runtime.getRuntime().maxMemory()) + sessionLogger.report( + BooleanMetrics.KOTLIN_OFFICIAL_CODESTYLE, + gradle.rootProject.properties["kotlin.code.style"] == "official" + ) // constants are saved in IDEA plugin and could not be accessed directly + val executedTaskNames = gradle.taskGraph.allTasks.map { it.name }.distinct() + report(BooleanMetrics.COMPILATION_STARTED, executedTaskNames.contains("compileKotlin")) + report(BooleanMetrics.TESTS_EXECUTED, executedTaskNames.contains("compileTestKotlin")) + report(BooleanMetrics.MAVEN_PUBLISH_EXECUTED, executedTaskNames.contains("install")) + + fun buildSrcExists(project: Project) = File(project.projectDir, "buildSrc").exists() + if (buildSrcExists(gradle.rootProject)) { + sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, true) + } val statisticOverhead = measureTimeMillis { gradle.allprojects { project -> for (configuration in project.configurations) { @@ -252,6 +287,25 @@ internal class DefaultKotlinBuildStatsService internal constructor( } } } + + sessionLogger.report(NumericalMetrics.NUMBER_OF_SUBPROJECTS, 1) + sessionLogger.report(BooleanMetrics.KOTLIN_KTS_USED, project.buildscript.sourceFile?.name?.endsWith(".kts") ?: false) + sessionLogger.report(NumericalMetrics.GRADLE_NUMBER_OF_TASKS, project.tasks.names.size.toLong()) + sessionLogger.report( + NumericalMetrics.GRADLE_NUMBER_OF_UNCONFIGURED_TASKS, + project.tasks.names.count { name -> + try { + project.tasks.named(name).javaClass.name.contains("TaskCreatingProvider") + } catch (_: Exception) { + true + } + }.toLong() + ) + + if (buildSrcExists(project)) { + sessionLogger.report(NumericalMetrics.BUILD_SRC_COUNT, 1) + sessionLogger.report(BooleanMetrics.BUILD_SRC_EXISTS, true) + } } } sessionLogger.report(NumericalMetrics.STATISTICS_VISIT_ALL_PROJECTS_OVERHEAD, statisticOverhead) @@ -264,7 +318,6 @@ internal class DefaultKotlinBuildStatsService internal constructor( DaemonReuseCounter.incrementAndGetOrdinal(), gradleBuildStartTime(gradle) ) - reportGlobalMetrics(gradle) } } } @@ -273,7 +326,12 @@ internal class DefaultKotlinBuildStatsService internal constructor( override fun buildFinished(result: BuildResult) { runSafe("${DefaultKotlinBuildStatsService::class.java}.buildFinished") { try { - sessionLogger.finishBuildSession(result.action, result.failure) + try { + val gradle = result.gradle + if (gradle != null) reportGlobalMetrics(gradle) + } finally { + sessionLogger.finishBuildSession(result.action, result.failure) + } } finally { val mbs: MBeanServer = ManagementFactory.getPlatformMBeanServer() if (mbs.isRegistered(beanName)) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 6c74e655774..57458d683d6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.sources.* +import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.locateTask @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.setArchiveAppendixCompatible import org.jetbrains.kotlin.gradle.utils.setArchiveClassifierCompatible +import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import java.io.File import java.util.concurrent.Callable @@ -64,6 +66,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) : super.configureTarget(target) if (target.project.isKotlinGranularMetadataEnabled) { + KotlinBuildStatsService.getInstance()?.report(BooleanMetrics.ENABLED_HMPP, true) target as KotlinMetadataTarget createMergedAllSourceSetsConfigurations(target) diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/BuildSessionLogger.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/BuildSessionLogger.kt index 3e977c87ea7..ac0189194bf 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/BuildSessionLogger.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/BuildSessionLogger.kt @@ -129,6 +129,8 @@ class BuildSessionLogger( report(NumericalMetrics.GRADLE_BUILD_DURATION, finishTime - it.buildStartedTime) } report(NumericalMetrics.GRADLE_EXECUTION_DURATION, finishTime - it.projectEvaluatedTime) + report(NumericalMetrics.BUILD_FINISH_TIME, finishTime) + report(BooleanMetrics.BUILD_FAILED, failure != null) } buildSession = null } finally { diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt index b62d0434ae5..9b37cbf99cc 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/BooleanMetrics.kt @@ -35,7 +35,7 @@ enum class BooleanMetrics(val type: BooleanOverridePolicy, val anonymization: Bo KOTLIN_OFFICIAL_CODESTYLE(OVERRIDE, SAFE), KOTLIN_PROGRESSIVE_MODE(OVERRIDE, SAFE), - KOTLIN_KTS_USED(OVERRIDE, SAFE), + KOTLIN_KTS_USED(OR, SAFE), // User scenarios DEBUGGER_ENABLED(OVERRIDE, SAFE), @@ -43,5 +43,4 @@ enum class BooleanMetrics(val type: BooleanOverridePolicy, val anonymization: Bo TESTS_EXECUTED(OVERRIDE, SAFE), MAVEN_PUBLISH_EXECUTED(OVERRIDE, SAFE), BUILD_FAILED(OVERRIDE, SAFE) - } diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt index 1c01df8bf69..a5afa5ab84b 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/NumericalMetrics.kt @@ -45,7 +45,7 @@ enum class NumericalMetrics(val type: NumberOverridePolicy, val anonymization: N //duration of the execution gradle phase GRADLE_EXECUTION_DURATION(OVERRIDE, SAFE), - NUMBER_OF_SUBPROJECTS(OVERRIDE, RANDOM_10_PERCENT), + NUMBER_OF_SUBPROJECTS(SUM, RANDOM_10_PERCENT), STATISTICS_VISIT_ALL_PROJECTS_OVERHEAD(SUM, RANDOM_10_PERCENT),