Added project size and metrics collectors in gradle plugin

This commit is contained in:
Andrey Uskov
2020-01-24 05:08:50 +03:00
parent c540116b71
commit bbdad45201
7 changed files with 76 additions and 5 deletions
@@ -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()
@@ -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) }
@@ -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)) {
@@ -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)
@@ -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 {
@@ -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)
}
@@ -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),