[Gradle] Access build stats internal properties in project-isolation compatible way
^KT-59826 In Progress
This commit is contained in:
committed by
Space Team
parent
d6becee2ce
commit
40928d50a2
+43
-26
@@ -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)
|
||||||
|
|||||||
+4
-3
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user