[Gradle] Access build stats internal properties in project-isolation compatible way

^KT-59826 In Progress
This commit is contained in:
Yahor Berdnikau
2023-08-22 10:26:11 +02:00
committed by Space Team
parent d6becee2ce
commit 40928d50a2
2 changed files with 47 additions and 29 deletions
@@ -9,14 +9,20 @@ import org.gradle.api.Project
import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.api.provider.ProviderFactory
import org.gradle.initialization.BuildRequestMetaData
import org.gradle.invocation.DefaultGradle
import org.gradle.tooling.events.OperationCompletionListener
import org.gradle.tooling.events.task.TaskFinishEvent
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
import org.jetbrains.kotlin.gradle.plugin.internal.ConfigurationTimePropertiesAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatHandler.Companion.runSafe
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsMXBean
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsService
import org.jetbrains.kotlin.gradle.utils.loadProperty
import org.jetbrains.kotlin.gradle.utils.localProperties
import org.jetbrains.kotlin.statistics.BuildSessionLogger
import org.jetbrains.kotlin.statistics.BuildSessionLogger.Companion.STATISTICS_FOLDER_NAME
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -103,7 +109,9 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
return runSafe("${KotlinBuildStatsService::class.java}.getOrCreateInstance") {
val gradle = project.gradle
statisticsIsEnabled = statisticsIsEnabled ?: checkStatisticsEnabled(gradle)
val configurationTimePropertiesAccessor = project.configurationTimePropertiesAccessor
statisticsIsEnabled = statisticsIsEnabled
?: checkStatisticsEnabled(gradle, project.providers, configurationTimePropertiesAccessor)
if (statisticsIsEnabled != true) {
null
} else {
@@ -120,13 +128,16 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
)
instance = JMXKotlinBuildStatsService(mbs, beanName)
} else {
val newInstance = DefaultKotlinBuildStatsService(gradle, beanName)
val newInstance = DefaultKotlinBuildStatsService(
project,
beanName
)
instance = newInstance
log.debug("Instantiated ${getServiceName()}: new instance $instance")
mbs.registerMBean(StandardMBean(newInstance, KotlinBuildStatsMXBean::class.java), beanName)
registerPre232IdeaStatsBean(mbs, gradle, log)
registerPre232IdeaStatsBean(mbs, log, project)
}
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
@@ -143,10 +154,14 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
}
//To support backward compatibility with Idea before 232 version
private fun registerPre232IdeaStatsBean(mbs: MBeanServer, gradle: Gradle, log: Logger) {
private fun registerPre232IdeaStatsBean(
mbs: MBeanServer,
log: Logger,
project: Project
) {
val beanName = ObjectName(JMX_BEAN_NAME_BEFORE_232_IDEA)
if (!mbs.isRegistered(beanName)) {
val newInstance = Pre232IdeaKotlinBuildStatsService(gradle, beanName)
val newInstance = Pre232IdeaKotlinBuildStatsService(project, beanName)
mbs.registerMBean(StandardMBean(newInstance, Pre232IdeaKotlinBuildStatsMXBean::class.java), beanName)
log.debug("Register JMX service for backward compatibility")
}
@@ -195,15 +210,17 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
private var statisticsIsEnabled: Boolean? = null
private fun checkStatisticsEnabled(gradle: Gradle): Boolean {
private fun checkStatisticsEnabled(
gradle: Gradle,
providerFactory: ProviderFactory,
configurationTimePropertiesAccessor: ConfigurationTimePropertiesAccessor,
): Boolean {
return if (File(gradle.gradleUserHomeDir, DISABLE_STATISTICS_FILE_NAME).exists()) {
false
} else {
if (gradle.rootProject.hasProperty(ENABLE_STATISTICS_PROPERTY_NAME)) {
gradle.rootProject.property(ENABLE_STATISTICS_PROPERTY_NAME).toString().toBoolean()
} else {
DEFAULT_STATISTICS_STATE
}
providerFactory.gradleProperty(ENABLE_STATISTICS_PROPERTY_NAME)
.usedAtConfigurationTime(configurationTimePropertiesAccessor)
.orNull?.toBoolean() ?: DEFAULT_STATISTICS_STATE
}
}
}
@@ -255,7 +272,7 @@ internal class JMXKotlinBuildStatsService(private val mbs: MBeanServer, private
}
internal abstract class AbstractKotlinBuildStatsService(
gradle: Gradle,
project: Project,
private val beanName: ObjectName,
) : KotlinBuildStatsService() {
companion object {
@@ -265,22 +282,21 @@ internal abstract class AbstractKotlinBuildStatsService(
private val logger = Logging.getLogger(AbstractKotlinBuildStatsService::class.java)
}
private val forcePropertiesValidation = if (gradle.rootProject.hasProperty(FORCE_VALUES_VALIDATION)) {
gradle.rootProject.property(FORCE_VALUES_VALIDATION).toString().toBoolean()
} else {
false
}
private val localProperties = project.localProperties
private val customSessionLoggerRootPath: String? = if (gradle.rootProject.hasProperty(CUSTOM_LOGGER_ROOT_PATH)) {
logger.warn("$CUSTOM_LOGGER_ROOT_PATH property for test purpose only")
gradle.rootProject.property(CUSTOM_LOGGER_ROOT_PATH) as String
} else {
null
}
private val forcePropertiesValidation = project
.loadProperty(FORCE_VALUES_VALIDATION, localProperties)
.orNull?.toBoolean() ?: false
private val customSessionLoggerRootPath: String? = project
.loadProperty(CUSTOM_LOGGER_ROOT_PATH, localProperties)
.orNull
?.also {
logger.warn("$CUSTOM_LOGGER_ROOT_PATH property for test purpose only")
}
private val sessionLoggerRootPath =
customSessionLoggerRootPath?.let { File(it) } ?: gradle.gradleUserHomeDir
customSessionLoggerRootPath?.let { File(it) } ?: project.gradle.gradleUserHomeDir
protected val sessionLogger = BuildSessionLogger(
sessionLoggerRootPath,
@@ -310,9 +326,10 @@ internal abstract class AbstractKotlinBuildStatsService(
}
internal class DefaultKotlinBuildStatsService internal constructor(
gradle: Gradle,
project: Project,
beanName: ObjectName,
) : AbstractKotlinBuildStatsService(gradle, beanName), KotlinBuildStatsMXBean {
) : AbstractKotlinBuildStatsService(project, beanName),
KotlinBuildStatsMXBean {
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean =
KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle.plugin.statistics.old
import org.gradle.api.invocation.Gradle
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.statistics.AbstractKotlinBuildStatsService
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatHandler
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -14,9 +14,10 @@ import org.jetbrains.kotlin.statistics.metrics.StringMetrics
import javax.management.ObjectName
internal class Pre232IdeaKotlinBuildStatsService internal constructor(
gradle: Gradle,
project: Project,
beanName: ObjectName
) : AbstractKotlinBuildStatsService(gradle, beanName), Pre232IdeaKotlinBuildStatsMXBean {
) : AbstractKotlinBuildStatsService(project, beanName),
Pre232IdeaKotlinBuildStatsMXBean {
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean =
KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight)