[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.invocation.Gradle
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.gradle.api.provider.ProviderFactory
import org.gradle.initialization.BuildRequestMetaData import org.gradle.initialization.BuildRequestMetaData
import org.gradle.invocation.DefaultGradle import org.gradle.invocation.DefaultGradle
import org.gradle.tooling.events.OperationCompletionListener import org.gradle.tooling.events.OperationCompletionListener
import org.gradle.tooling.events.task.TaskFinishEvent import org.gradle.tooling.events.task.TaskFinishEvent
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder 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.KotlinBuildStatHandler.Companion.runSafe
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsMXBean import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsMXBean
import org.jetbrains.kotlin.gradle.plugin.statistics.old.Pre232IdeaKotlinBuildStatsService 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
import org.jetbrains.kotlin.statistics.BuildSessionLogger.Companion.STATISTICS_FOLDER_NAME import org.jetbrains.kotlin.statistics.BuildSessionLogger.Companion.STATISTICS_FOLDER_NAME
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -103,7 +109,9 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
return runSafe("${KotlinBuildStatsService::class.java}.getOrCreateInstance") { return runSafe("${KotlinBuildStatsService::class.java}.getOrCreateInstance") {
val gradle = project.gradle val gradle = project.gradle
statisticsIsEnabled = statisticsIsEnabled ?: checkStatisticsEnabled(gradle) val configurationTimePropertiesAccessor = project.configurationTimePropertiesAccessor
statisticsIsEnabled = statisticsIsEnabled
?: checkStatisticsEnabled(gradle, project.providers, configurationTimePropertiesAccessor)
if (statisticsIsEnabled != true) { if (statisticsIsEnabled != true) {
null null
} else { } else {
@@ -120,13 +128,16 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
) )
instance = JMXKotlinBuildStatsService(mbs, beanName) instance = JMXKotlinBuildStatsService(mbs, beanName)
} else { } else {
val newInstance = DefaultKotlinBuildStatsService(gradle, beanName) val newInstance = DefaultKotlinBuildStatsService(
project,
beanName
)
instance = newInstance instance = newInstance
log.debug("Instantiated ${getServiceName()}: new instance $instance") log.debug("Instantiated ${getServiceName()}: new instance $instance")
mbs.registerMBean(StandardMBean(newInstance, KotlinBuildStatsMXBean::class.java), beanName) mbs.registerMBean(StandardMBean(newInstance, KotlinBuildStatsMXBean::class.java), beanName)
registerPre232IdeaStatsBean(mbs, gradle, log) registerPre232IdeaStatsBean(mbs, log, project)
} }
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider { 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 //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) val beanName = ObjectName(JMX_BEAN_NAME_BEFORE_232_IDEA)
if (!mbs.isRegistered(beanName)) { if (!mbs.isRegistered(beanName)) {
val newInstance = Pre232IdeaKotlinBuildStatsService(gradle, beanName) val newInstance = Pre232IdeaKotlinBuildStatsService(project, beanName)
mbs.registerMBean(StandardMBean(newInstance, Pre232IdeaKotlinBuildStatsMXBean::class.java), beanName) mbs.registerMBean(StandardMBean(newInstance, Pre232IdeaKotlinBuildStatsMXBean::class.java), beanName)
log.debug("Register JMX service for backward compatibility") 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 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()) { return if (File(gradle.gradleUserHomeDir, DISABLE_STATISTICS_FILE_NAME).exists()) {
false false
} else { } else {
if (gradle.rootProject.hasProperty(ENABLE_STATISTICS_PROPERTY_NAME)) { providerFactory.gradleProperty(ENABLE_STATISTICS_PROPERTY_NAME)
gradle.rootProject.property(ENABLE_STATISTICS_PROPERTY_NAME).toString().toBoolean() .usedAtConfigurationTime(configurationTimePropertiesAccessor)
} else { .orNull?.toBoolean() ?: DEFAULT_STATISTICS_STATE
DEFAULT_STATISTICS_STATE
}
} }
} }
} }
@@ -255,7 +272,7 @@ internal class JMXKotlinBuildStatsService(private val mbs: MBeanServer, private
} }
internal abstract class AbstractKotlinBuildStatsService( internal abstract class AbstractKotlinBuildStatsService(
gradle: Gradle, project: Project,
private val beanName: ObjectName, private val beanName: ObjectName,
) : KotlinBuildStatsService() { ) : KotlinBuildStatsService() {
companion object { companion object {
@@ -265,22 +282,21 @@ internal abstract class AbstractKotlinBuildStatsService(
private val logger = Logging.getLogger(AbstractKotlinBuildStatsService::class.java) private val logger = Logging.getLogger(AbstractKotlinBuildStatsService::class.java)
} }
private val forcePropertiesValidation = if (gradle.rootProject.hasProperty(FORCE_VALUES_VALIDATION)) { private val localProperties = project.localProperties
gradle.rootProject.property(FORCE_VALUES_VALIDATION).toString().toBoolean()
} else {
false
}
private val customSessionLoggerRootPath: String? = if (gradle.rootProject.hasProperty(CUSTOM_LOGGER_ROOT_PATH)) { private val forcePropertiesValidation = project
logger.warn("$CUSTOM_LOGGER_ROOT_PATH property for test purpose only") .loadProperty(FORCE_VALUES_VALIDATION, localProperties)
gradle.rootProject.property(CUSTOM_LOGGER_ROOT_PATH) as String .orNull?.toBoolean() ?: false
} else {
null
}
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 = private val sessionLoggerRootPath =
customSessionLoggerRootPath?.let { File(it) } ?: gradle.gradleUserHomeDir customSessionLoggerRootPath?.let { File(it) } ?: project.gradle.gradleUserHomeDir
protected val sessionLogger = BuildSessionLogger( protected val sessionLogger = BuildSessionLogger(
sessionLoggerRootPath, sessionLoggerRootPath,
@@ -310,9 +326,10 @@ internal abstract class AbstractKotlinBuildStatsService(
} }
internal class DefaultKotlinBuildStatsService internal constructor( internal class DefaultKotlinBuildStatsService internal constructor(
gradle: Gradle, project: Project,
beanName: ObjectName, beanName: ObjectName,
) : AbstractKotlinBuildStatsService(gradle, beanName), KotlinBuildStatsMXBean { ) : AbstractKotlinBuildStatsService(project, beanName),
KotlinBuildStatsMXBean {
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean = override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean =
KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight) KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle.plugin.statistics.old 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.AbstractKotlinBuildStatsService
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatHandler import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatHandler
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -14,9 +14,10 @@ import org.jetbrains.kotlin.statistics.metrics.StringMetrics
import javax.management.ObjectName import javax.management.ObjectName
internal class Pre232IdeaKotlinBuildStatsService internal constructor( internal class Pre232IdeaKotlinBuildStatsService internal constructor(
gradle: Gradle, project: Project,
beanName: ObjectName beanName: ObjectName
) : AbstractKotlinBuildStatsService(gradle, beanName), Pre232IdeaKotlinBuildStatsMXBean { ) : AbstractKotlinBuildStatsService(project, beanName),
Pre232IdeaKotlinBuildStatsMXBean {
override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean = override fun report(metric: BooleanMetrics, value: Boolean, subprojectName: String?, weight: Long?): Boolean =
KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight) KotlinBuildStatHandler().report(sessionLogger, metric, value, subprojectName, weight)