Update custom values format
This commit is contained in:
@@ -15,22 +15,22 @@ enum class BuildAttributeKind : Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class BuildAttribute(val kind: BuildAttributeKind) : Serializable {
|
enum class BuildAttribute(val kind: BuildAttributeKind, val readableString: String) : Serializable {
|
||||||
NO_BUILD_HISTORY(BuildAttributeKind.REBUILD_REASON),
|
NO_BUILD_HISTORY(BuildAttributeKind.REBUILD_REASON, "Build history file not found"),
|
||||||
NO_ABI_SNAPSHOT(BuildAttributeKind.REBUILD_REASON),
|
NO_ABI_SNAPSHOT(BuildAttributeKind.REBUILD_REASON, "ABI snapshot not found"),
|
||||||
CACHE_CORRUPTION(BuildAttributeKind.REBUILD_REASON),
|
CACHE_CORRUPTION(BuildAttributeKind.REBUILD_REASON, "Cache corrupted"),
|
||||||
UNKNOWN_CHANGES_IN_GRADLE_INPUTS(BuildAttributeKind.REBUILD_REASON),
|
UNKNOWN_CHANGES_IN_GRADLE_INPUTS(BuildAttributeKind.REBUILD_REASON, "Unknown Gradle changes"),
|
||||||
JAVA_CHANGE_UNTRACKED_FILE_IS_REMOVED(BuildAttributeKind.REBUILD_REASON),
|
JAVA_CHANGE_UNTRACKED_FILE_IS_REMOVED(BuildAttributeKind.REBUILD_REASON, "Untracked Java file is removed"),
|
||||||
JAVA_CHANGE_UNEXPECTED_PSI(BuildAttributeKind.REBUILD_REASON),
|
JAVA_CHANGE_UNEXPECTED_PSI(BuildAttributeKind.REBUILD_REASON, "Java PSI file is expected"),
|
||||||
JAVA_CHANGE_UNKNOWN_QUALIFIER(BuildAttributeKind.REBUILD_REASON),
|
JAVA_CHANGE_UNKNOWN_QUALIFIER(BuildAttributeKind.REBUILD_REASON, "Unknown Java qualifier name"),
|
||||||
DEP_CHANGE_REMOVED_ENTRY(BuildAttributeKind.REBUILD_REASON),
|
DEP_CHANGE_REMOVED_ENTRY(BuildAttributeKind.REBUILD_REASON, "Jar file is removed form dependency"),
|
||||||
DEP_CHANGE_HISTORY_IS_NOT_FOUND(BuildAttributeKind.REBUILD_REASON),
|
DEP_CHANGE_HISTORY_IS_NOT_FOUND(BuildAttributeKind.REBUILD_REASON, "Dependency history not found"),
|
||||||
DEP_CHANGE_HISTORY_CANNOT_BE_READ(BuildAttributeKind.REBUILD_REASON),
|
DEP_CHANGE_HISTORY_CANNOT_BE_READ(BuildAttributeKind.REBUILD_REASON, "Dependency history can not be read"),
|
||||||
DEP_CHANGE_HISTORY_NO_KNOWN_BUILDS(BuildAttributeKind.REBUILD_REASON),
|
DEP_CHANGE_HISTORY_NO_KNOWN_BUILDS(BuildAttributeKind.REBUILD_REASON, "Dependency history id not available"),
|
||||||
DEP_CHANGE_NON_INCREMENTAL_BUILD_IN_DEP(BuildAttributeKind.REBUILD_REASON),
|
DEP_CHANGE_NON_INCREMENTAL_BUILD_IN_DEP(BuildAttributeKind.REBUILD_REASON, "Non incremental build in history"),
|
||||||
IN_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON),
|
IN_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON, "In-process execution"),
|
||||||
OUT_OF_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON),
|
OUT_OF_PROCESS_EXECUTION(BuildAttributeKind.REBUILD_REASON, "Out of process execution"),
|
||||||
IC_IS_NOT_ENABLED(BuildAttributeKind.REBUILD_REASON);
|
IC_IS_NOT_ENABLED(BuildAttributeKind.REBUILD_REASON, "Incremental compilation is not enabled");
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val serialVersionUID = 0L
|
const val serialVersionUID = 0L
|
||||||
|
|||||||
+2
-2
@@ -24,8 +24,8 @@ class BuildMetricsReporterImpl : BuildMetricsReporter {
|
|||||||
|
|
||||||
override fun endMeasure(metric: BuildTime, endNs: Long) {
|
override fun endMeasure(metric: BuildTime, endNs: Long) {
|
||||||
val startNs = myBuildTimeStartNs.remove(metric) ?: error("$metric finished before it started")
|
val startNs = myBuildTimeStartNs.remove(metric) ?: error("$metric finished before it started")
|
||||||
val durationNs = endNs - startNs
|
val durationMs = (endNs - startNs) / 1_000_000
|
||||||
myBuildTimes.add(metric, durationNs)
|
myBuildTimes.add(metric, durationMs)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addAttribute(attribute: BuildAttribute) {
|
override fun addAttribute(attribute: BuildAttribute) {
|
||||||
|
|||||||
@@ -8,35 +8,35 @@ package org.jetbrains.kotlin.build.report.metrics
|
|||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
@Suppress("Reformat")
|
@Suppress("Reformat")
|
||||||
enum class BuildTime(val parent: BuildTime? = null) : Serializable {
|
enum class BuildTime(val parent: BuildTime? = null, val readableString: String) : Serializable {
|
||||||
GRADLE_TASK_ACTION,
|
GRADLE_TASK_ACTION(readableString = "Task execution"),
|
||||||
GRADLE_TASK,
|
GRADLE_TASK(readableString = "Total time"),
|
||||||
CLEAR_OUTPUT(GRADLE_TASK),
|
CLEAR_OUTPUT(GRADLE_TASK, "Clear output"),
|
||||||
BACKUP_OUTPUT(GRADLE_TASK),
|
BACKUP_OUTPUT(GRADLE_TASK, "Backup output"),
|
||||||
RESTORE_OUTPUT_FROM_BACKUP(GRADLE_TASK),
|
RESTORE_OUTPUT_FROM_BACKUP(GRADLE_TASK, "Restore output"),
|
||||||
CONNECT_TO_DAEMON(GRADLE_TASK),
|
CONNECT_TO_DAEMON(GRADLE_TASK, "Connect to Kotlin daemon"),
|
||||||
CLEAR_JAR_CACHE(GRADLE_TASK),
|
CLEAR_JAR_CACHE(GRADLE_TASK, "Clear jar cache"),
|
||||||
RUN_COMPILER(GRADLE_TASK),
|
RUN_COMPILER(GRADLE_TASK, "Run compiler"),
|
||||||
NON_INCREMENTAL_COMPILATION_IN_PROCESS(RUN_COMPILER),
|
NON_INCREMENTAL_COMPILATION_IN_PROCESS(RUN_COMPILER, "Inprocess compilation"),
|
||||||
NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS(RUN_COMPILER),
|
NON_INCREMENTAL_COMPILATION_OUT_OF_PROCESS(RUN_COMPILER, "Out of process compilation"),
|
||||||
NON_INCREMENTAL_COMPILATION_DAEMON(RUN_COMPILER),
|
NON_INCREMENTAL_COMPILATION_DAEMON(RUN_COMPILER, "Non incremental compilation"),
|
||||||
INCREMENTAL_COMPILATION(RUN_COMPILER),
|
INCREMENTAL_COMPILATION(RUN_COMPILER, "Incremental compilation"),
|
||||||
STORE_BUILD_INFO(INCREMENTAL_COMPILATION),
|
STORE_BUILD_INFO(INCREMENTAL_COMPILATION, "Store build info"),
|
||||||
JAR_SNAPSHOT(INCREMENTAL_COMPILATION),
|
JAR_SNAPSHOT(INCREMENTAL_COMPILATION, "ABI JAR Snapshot support"),
|
||||||
SET_UP_ABI_SNAPSHOTS(JAR_SNAPSHOT),
|
SET_UP_ABI_SNAPSHOTS(JAR_SNAPSHOT, "Set up ABI snapshot"),
|
||||||
IC_ANALYZE_JAR_FILES(JAR_SNAPSHOT),
|
IC_ANALYZE_JAR_FILES(JAR_SNAPSHOT, "Analyze jar files"),
|
||||||
IC_CALCULATE_INITIAL_DIRTY_SET(INCREMENTAL_COMPILATION),
|
IC_CALCULATE_INITIAL_DIRTY_SET(INCREMENTAL_COMPILATION, "Init dirty symbols set"),
|
||||||
IC_ANALYZE_CHANGES_IN_DEPENDENCIES(IC_CALCULATE_INITIAL_DIRTY_SET),
|
IC_ANALYZE_CHANGES_IN_DEPENDENCIES(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze dependency changes"),
|
||||||
IC_FIND_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES),
|
IC_FIND_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES, "Find history files"),
|
||||||
IC_ANALYZE_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES),
|
IC_ANALYZE_HISTORY_FILES(IC_ANALYZE_CHANGES_IN_DEPENDENCIES, "Analyze history files"),
|
||||||
IC_ANALYZE_CHANGES_IN_JAVA_SOURCES(IC_CALCULATE_INITIAL_DIRTY_SET),
|
IC_ANALYZE_CHANGES_IN_JAVA_SOURCES(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze Java file changes"),
|
||||||
IC_ANALYZE_CHANGES_IN_ANDROID_LAYOUTS(IC_CALCULATE_INITIAL_DIRTY_SET),
|
IC_ANALYZE_CHANGES_IN_ANDROID_LAYOUTS(IC_CALCULATE_INITIAL_DIRTY_SET, "Analyze Android layouts"),
|
||||||
IC_DETECT_REMOVED_CLASSES(IC_CALCULATE_INITIAL_DIRTY_SET),
|
IC_DETECT_REMOVED_CLASSES(IC_CALCULATE_INITIAL_DIRTY_SET, "Detect removed classes"),
|
||||||
CLEAR_OUTPUT_ON_REBUILD(INCREMENTAL_COMPILATION),
|
CLEAR_OUTPUT_ON_REBUILD(INCREMENTAL_COMPILATION, "Clear outputs on rebuild"),
|
||||||
IC_UPDATE_CACHES(INCREMENTAL_COMPILATION),
|
IC_UPDATE_CACHES(INCREMENTAL_COMPILATION, "Update caches"),
|
||||||
INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION),
|
INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Incremental iteration"),
|
||||||
NON_INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION),
|
NON_INCREMENTAL_ITERATION(INCREMENTAL_COMPILATION, "Non-incremental iteration"),
|
||||||
IC_WRITE_HISTORY_FILE(INCREMENTAL_COMPILATION);
|
IC_WRITE_HISTORY_FILE(INCREMENTAL_COMPILATION, "Write history file");
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val serialVersionUID = 0L
|
const val serialVersionUID = 0L
|
||||||
|
|||||||
@@ -12,13 +12,13 @@ class BuildTimes : Serializable {
|
|||||||
private val myBuildTimes = EnumMap<BuildTime, Long>(BuildTime::class.java)
|
private val myBuildTimes = EnumMap<BuildTime, Long>(BuildTime::class.java)
|
||||||
|
|
||||||
fun addAll(other: BuildTimes) {
|
fun addAll(other: BuildTimes) {
|
||||||
for ((bt, timeNs) in other.myBuildTimes) {
|
for ((bt, timeMs) in other.myBuildTimes) {
|
||||||
add(bt, timeNs)
|
add(bt, timeMs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun add(buildTime: BuildTime, timeNs: Long) {
|
fun add(buildTime: BuildTime, timeMs: Long) {
|
||||||
myBuildTimes[buildTime] = myBuildTimes.getOrDefault(buildTime, 0) + timeNs
|
myBuildTimes[buildTime] = myBuildTimes.getOrDefault(buildTime, 0) + timeMs
|
||||||
}
|
}
|
||||||
|
|
||||||
fun asMap(): Map<BuildTime, Long> = myBuildTimes
|
fun asMap(): Map<BuildTime, Long> = myBuildTimes
|
||||||
|
|||||||
+1
-11
@@ -83,19 +83,14 @@ internal class KotlinGradleBuildServices private constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider)
|
|
||||||
listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider)
|
|
||||||
|
|
||||||
if (instance != null) {
|
if (instance != null) {
|
||||||
log.kotlinDebug(ALREADY_INITIALIZED_MESSAGE)
|
log.kotlinDebug(ALREADY_INITIALIZED_MESSAGE)
|
||||||
// instance!!.gradleListenerProviders.forEach { listenerRegistryHolder.listenerRegistry.onTaskCompletion(it) }
|
// instance!!.gradleListenerProviders.forEach { listenerRegistry.onTaskCompletion(it) }
|
||||||
return instance!!
|
return instance!!
|
||||||
}
|
}
|
||||||
|
|
||||||
val gradle = project.gradle
|
val gradle = project.gradle
|
||||||
val services = KotlinGradleBuildServices(gradle, kotlinGradleListenerProvider, kotlinGradleEsListenerProvider)
|
val services = KotlinGradleBuildServices(gradle, kotlinGradleListenerProvider, kotlinGradleEsListenerProvider)
|
||||||
// listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider)
|
|
||||||
// listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider)
|
|
||||||
if (isConfigurationCacheAvailable(gradle)) {
|
if (isConfigurationCacheAvailable(gradle)) {
|
||||||
listenerRegistryHolder.listenerRegistry!!.onTaskCompletion(kotlinGradleListenerProvider)
|
listenerRegistryHolder.listenerRegistry!!.onTaskCompletion(kotlinGradleListenerProvider)
|
||||||
listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider)
|
listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider)
|
||||||
@@ -104,11 +99,6 @@ internal class KotlinGradleBuildServices private constructor(
|
|||||||
gradle.taskGraph.addTaskExecutionListener(kotlinGradleEsListenerProvider.get())
|
gradle.taskGraph.addTaskExecutionListener(kotlinGradleEsListenerProvider.get())
|
||||||
log.kotlinDebug(INIT_MESSAGE)
|
log.kotlinDebug(INIT_MESSAGE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleListenerProvider)
|
|
||||||
// listenerRegistryHolder.listenerRegistry.onTaskCompletion(kotlinGradleEsListenerProvider)
|
|
||||||
|
|
||||||
instance = services
|
instance = services
|
||||||
|
|
||||||
services.buildStarted()
|
services.buildStarted()
|
||||||
|
|||||||
+7
-8
@@ -49,7 +49,7 @@ import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
abstract class KotlinBasePluginWrapper : Plugin<Project> {
|
abstract class KotlinBasePluginWrapper: Plugin<Project> {
|
||||||
|
|
||||||
private val log = Logging.getLogger(this.javaClass)
|
private val log = Logging.getLogger(this.javaClass)
|
||||||
|
|
||||||
@@ -70,7 +70,6 @@ abstract class KotlinBasePluginWrapper : Plugin<Project> {
|
|||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
val kotlinPluginVersion = project.getKotlinPluginVersion()
|
val kotlinPluginVersion = project.getKotlinPluginVersion()
|
||||||
|
|
||||||
val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project)
|
|
||||||
val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project)
|
val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project)
|
||||||
statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion)
|
statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion)
|
||||||
|
|
||||||
@@ -88,7 +87,7 @@ abstract class KotlinBasePluginWrapper : Plugin<Project> {
|
|||||||
}
|
}
|
||||||
project.registerCommonizerClasspathConfigurationIfNecessary()
|
project.registerCommonizerClasspathConfigurationIfNecessary()
|
||||||
|
|
||||||
val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project, listenerRegistryHolder)
|
val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project, BuildEventsListenerRegistryHolder.getInstance(project))
|
||||||
|
|
||||||
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion)
|
kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion)
|
||||||
|
|
||||||
@@ -195,8 +194,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
|
|||||||
get() = Kotlin2JsProjectExtension::class
|
get() = Kotlin2JsProjectExtension::class
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KotlinJsPluginWrapper @Inject constructor(
|
open class KotlinJsPluginWrapper : KotlinBasePluginWrapper() {
|
||||||
) : KotlinBasePluginWrapper() {
|
|
||||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||||
KotlinJsPlugin(project.getKotlinPluginVersion())
|
KotlinJsPlugin(project.getKotlinPluginVersion())
|
||||||
|
|
||||||
@@ -227,8 +225,7 @@ open class KotlinJsPluginWrapper @Inject constructor(
|
|||||||
override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test")
|
override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test")
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KotlinMultiplatformPluginWrapper @Inject constructor(
|
open class KotlinMultiplatformPluginWrapper : KotlinBasePluginWrapper() {
|
||||||
) : KotlinBasePluginWrapper() {
|
|
||||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||||
KotlinMultiplatformPlugin()
|
KotlinMultiplatformPlugin()
|
||||||
|
|
||||||
@@ -251,7 +248,9 @@ open class KotlinMultiplatformPluginWrapper @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KotlinPm20PluginWrapper @Inject constructor(private val objectFactory: ObjectFactory) : KotlinBasePluginWrapper() {
|
open class KotlinPm20PluginWrapper @Inject constructor(
|
||||||
|
private val objectFactory: ObjectFactory
|
||||||
|
) : KotlinBasePluginWrapper() {
|
||||||
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
|
||||||
objectFactory.newInstance(KotlinPm20GradlePlugin::class.java)
|
objectFactory.newInstance(KotlinPm20GradlePlugin::class.java)
|
||||||
|
|
||||||
|
|||||||
+10
-9
@@ -27,7 +27,7 @@ enum class TaskExecutionState {
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
class KotlinBuildEsStatListener(val projectName: String, val reportStatistics : List<ReportStatistics>) : OperationCompletionListener, AutoCloseable, TaskExecutionListener {
|
class KotlinBuildEsStatListener(val projectName: String, val reportStatistics: List<ReportStatistics>) : OperationCompletionListener, AutoCloseable, TaskExecutionListener {
|
||||||
|
|
||||||
val label by lazy { CompilerSystemProperties.KOTLIN_STAT_LABEl_PROPERTY.value }
|
val label by lazy { CompilerSystemProperties.KOTLIN_STAT_LABEl_PROPERTY.value }
|
||||||
|
|
||||||
@@ -37,9 +37,11 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics :
|
|||||||
val taskPath = event.descriptor.taskPath
|
val taskPath = event.descriptor.taskPath
|
||||||
val duration = event.result.endTime - event.result.startTime
|
val duration = event.result.endTime - event.result.startTime
|
||||||
val taskResult = when (result) {
|
val taskResult = when (result) {
|
||||||
is TaskSuccessResult -> if (result.isFromCache) TaskExecutionState.FROM_CACHE
|
is TaskSuccessResult -> when {
|
||||||
else if (result.isUpToDate) TaskExecutionState.UP_TO_DATE
|
result.isFromCache -> TaskExecutionState.FROM_CACHE
|
||||||
else TaskExecutionState.SUCCESS
|
result.isUpToDate -> TaskExecutionState.UP_TO_DATE
|
||||||
|
else -> TaskExecutionState.SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
is TaskSkippedResult -> TaskExecutionState.SKIPPED
|
is TaskSkippedResult -> TaskExecutionState.SKIPPED
|
||||||
is TaskFailureResult -> TaskExecutionState.FAILED
|
is TaskFailureResult -> TaskExecutionState.FAILED
|
||||||
@@ -55,9 +57,8 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics :
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
val taskExecutionResult = TaskExecutionResults[taskPath]
|
val taskExecutionResult = TaskExecutionResults[taskPath]
|
||||||
val statData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap()?.mapKeys { (key, _) -> key.name } ?: emptyMap()
|
val statData = taskExecutionResult?.buildMetrics?.buildTimes?.asMap() ?: emptyMap()
|
||||||
val changedFiles = taskExecutionResult?.taskInfo?.changedFiles
|
val changes = when (val changedFiles = taskExecutionResult?.taskInfo?.changedFiles) {
|
||||||
val changes = when (changedFiles) {
|
|
||||||
is ChangedFiles.Known -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
|
is ChangedFiles.Known -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
|
||||||
is ChangedFiles.Dependencies -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
|
is ChangedFiles.Dependencies -> changedFiles.modified.map { it.absolutePath } + changedFiles.removed.map { it.absolutePath }
|
||||||
else -> emptyList<String>()
|
else -> emptyList<String>()
|
||||||
@@ -67,13 +68,13 @@ class KotlinBuildEsStatListener(val projectName: String, val reportStatistics :
|
|||||||
duration = duration, taskResult = taskResult.name, label = label,
|
duration = duration, taskResult = taskResult.name, label = label,
|
||||||
statData = statData, projectName = projectName, taskName = taskPath, changes = changes,
|
statData = statData, projectName = projectName, taskName = taskPath, changes = changes,
|
||||||
tags = taskExecutionResult?.taskInfo?.properties?.map { it.name } ?: emptyList(),
|
tags = taskExecutionResult?.taskInfo?.properties?.map { it.name } ?: emptyList(),
|
||||||
nonIncrementalAttributes = taskExecutionResult?.buildMetrics?.buildAttributes?.asMap()?.mapKeys { (key, _) -> key.name }?: emptyMap()
|
nonIncrementalAttributes = taskExecutionResult?.buildMetrics?.buildAttributes?.asMap()?: emptyMap()
|
||||||
)
|
)
|
||||||
reportStatistics.forEach { it.report(compileStatData) }
|
reportStatistics.forEach { it.report(compileStatData) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun availableForStat(taskPath: String): Boolean {
|
private fun availableForStat(taskPath: String): Boolean {
|
||||||
return taskPath.contains("Kotlin")
|
return taskPath.contains("Kotlin") && (TaskExecutionResults[taskPath] != null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun afterExecute(task: Task, taskState: TaskState) {
|
override fun afterExecute(task: Task, taskState: TaskState) {
|
||||||
|
|||||||
+5
-2
@@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin.stat
|
package org.jetbrains.kotlin.gradle.plugin.stat
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.build.report.metrics.BuildAttribute
|
||||||
|
import org.jetbrains.kotlin.build.report.metrics.BuildTime
|
||||||
|
|
||||||
data class CompileStatData(
|
data class CompileStatData(
|
||||||
val version: Int = 1,
|
val version: Int = 1,
|
||||||
val projectName: String?,
|
val projectName: String?,
|
||||||
@@ -14,8 +17,8 @@ data class CompileStatData(
|
|||||||
val duration: Long,
|
val duration: Long,
|
||||||
val tags: List<String>,
|
val tags: List<String>,
|
||||||
val changes: List<String>,
|
val changes: List<String>,
|
||||||
val nonIncrementalAttributes: Map<String, Int>,
|
val nonIncrementalAttributes: Map<BuildAttribute, Int>,
|
||||||
val statData: Map<String, Long>
|
val statData: Map<BuildTime, Long>
|
||||||
)
|
)
|
||||||
|
|
||||||
interface ReportStatistics {
|
interface ReportStatistics {
|
||||||
|
|||||||
+19
-6
@@ -5,17 +5,30 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin.statistics
|
package org.jetbrains.kotlin.gradle.plugin.statistics
|
||||||
|
|
||||||
import com.google.gson.Gson
|
|
||||||
import com.gradle.scan.plugin.BuildScanExtension
|
import com.gradle.scan.plugin.BuildScanExtension
|
||||||
import org.jetbrains.kotlin.gradle.plugin.stat.CompileStatData
|
import org.jetbrains.kotlin.gradle.plugin.stat.CompileStatData
|
||||||
import org.jetbrains.kotlin.gradle.plugin.stat.ReportStatistics
|
import org.jetbrains.kotlin.gradle.plugin.stat.ReportStatistics
|
||||||
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
|
|
||||||
class ReportStatisticsToBuildScan(val buildScan: BuildScanExtension) : ReportStatistics {
|
class ReportStatisticsToBuildScan(private val buildScan: BuildScanExtension) : ReportStatistics {
|
||||||
override fun report(data: CompileStatData) {
|
override fun report(data: CompileStatData) {
|
||||||
buildScan.value(data.taskName, Gson().toJson(data).toString())
|
buildScan.value(data.taskName, readableString(data))
|
||||||
val keys = data.nonIncrementalAttributes.filterValues { it > 0 }.keys.joinToString()
|
data.tags.forEach { buildScan.tag(it) }
|
||||||
if (keys.isNotEmpty()) {
|
}
|
||||||
buildScan.value("${data.taskName}_nonIncremental", keys)
|
|
||||||
|
private fun readableString(data: CompileStatData): String {
|
||||||
|
val nonIncrementalReasons = data.nonIncrementalAttributes.filterValues { it > 0 }.keys
|
||||||
|
val readableString = StringBuilder()
|
||||||
|
if (nonIncrementalReasons.isEmpty()) {
|
||||||
|
readableString.append("Incremental build; ")
|
||||||
|
} else {
|
||||||
|
nonIncrementalReasons.joinTo(readableString, prefix = "Non incremental build because: [", postfix = "]; ") { it.readableString }
|
||||||
}
|
}
|
||||||
|
data.changes.joinTo(readableString, prefix = "Changes: [", postfix = "]; ") { it.substringAfterLast(File.separator) }
|
||||||
|
|
||||||
|
readableString.append("Performance: [")
|
||||||
|
data.statData.forEach { (key, value) -> readableString.append(key.readableString).append(": ").append(value).append("ms, ") }
|
||||||
|
readableString.append("]; ")
|
||||||
|
return readableString.toString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-3
@@ -72,8 +72,8 @@ private class TaskRecord(
|
|||||||
override val endNs: Long
|
override val endNs: Long
|
||||||
get() = myEndNs
|
get() = myEndNs
|
||||||
|
|
||||||
override val totalTimeNs: Long
|
override val totalTimeMs: Long
|
||||||
get() = endNs - startNs
|
get() = (endNs - startNs) / 1_000_000
|
||||||
|
|
||||||
override val resultState: TaskState
|
override val resultState: TaskState
|
||||||
get() = myTaskState
|
get() = myTaskState
|
||||||
@@ -87,7 +87,7 @@ private class TaskRecord(
|
|||||||
fun processResult(state: TaskState, executionResult: TaskExecutionResult?) {
|
fun processResult(state: TaskState, executionResult: TaskExecutionResult?) {
|
||||||
myEndNs = System.nanoTime()
|
myEndNs = System.nanoTime()
|
||||||
myTaskState = state
|
myTaskState = state
|
||||||
myBuildMetrics.buildTimes.add(BuildTime.GRADLE_TASK, totalTimeNs)
|
myBuildMetrics.buildTimes.add(BuildTime.GRADLE_TASK, totalTimeMs)
|
||||||
|
|
||||||
if (executionResult != null) {
|
if (executionResult != null) {
|
||||||
myBuildMetrics.addAll(executionResult.buildMetrics)
|
myBuildMetrics.addAll(executionResult.buildMetrics)
|
||||||
|
|||||||
+1
-1
@@ -102,7 +102,7 @@ class KotlinBuildReporterHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun formatTime(ns: Long): String {
|
internal fun formatTime(ns: Long): String {
|
||||||
val seconds = ns.toDouble() / 1_000_000_000
|
val seconds = ns.toDouble() / 1_000
|
||||||
return seconds.asString(2) + " s"
|
return seconds.asString(2) + " s"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-14
@@ -76,8 +76,8 @@ internal class PlainTextBuildReportWriter(
|
|||||||
fun printBuildTime(buildTime: BuildTime) {
|
fun printBuildTime(buildTime: BuildTime) {
|
||||||
if (!visitedBuildTimes.add(buildTime)) return
|
if (!visitedBuildTimes.add(buildTime)) return
|
||||||
|
|
||||||
val timeNs = collectedBuildTimes[buildTime] ?: return
|
val timeMs = collectedBuildTimes[buildTime] ?: return
|
||||||
p.println("${buildTime.name}: ${formatTime(timeNs)}")
|
p.println("${buildTime.name}: ${formatTime(timeMs)}")
|
||||||
p.withIndent {
|
p.withIndent {
|
||||||
BuildTime.children[buildTime]?.forEach { printBuildTime(it) }
|
BuildTime.children[buildTime]?.forEach { printBuildTime(it) }
|
||||||
}
|
}
|
||||||
@@ -106,16 +106,16 @@ internal class PlainTextBuildReportWriter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun printTaskOverview(build: BuildExecutionData) {
|
private fun printTaskOverview(build: BuildExecutionData) {
|
||||||
var allTasksTimeNs = 0L
|
var allTasksTimeMs = 0L
|
||||||
var kotlinTotalTimeNs = 0L
|
var kotlinTotalTimeMs = 0L
|
||||||
val kotlinTasks = ArrayList<TaskExecutionData>()
|
val kotlinTasks = ArrayList<TaskExecutionData>()
|
||||||
|
|
||||||
for (task in build.taskExecutionData) {
|
for (task in build.taskExecutionData) {
|
||||||
val taskTimeNs = task.totalTimeNs
|
val taskTimeMs = task.totalTimeMs
|
||||||
allTasksTimeNs += taskTimeNs
|
allTasksTimeMs += taskTimeMs
|
||||||
|
|
||||||
if (task.isKotlinTask) {
|
if (task.isKotlinTask) {
|
||||||
kotlinTotalTimeNs += taskTimeNs
|
kotlinTotalTimeMs += taskTimeMs
|
||||||
kotlinTasks.add(task)
|
kotlinTasks.add(task)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -125,14 +125,14 @@ internal class PlainTextBuildReportWriter(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val ktTaskPercent = (kotlinTotalTimeNs.toDouble() / allTasksTimeNs * 100).asString(1)
|
val ktTaskPercent = (kotlinTotalTimeMs.toDouble() / allTasksTimeMs * 100).asString(1)
|
||||||
p.println("Total time for Kotlin tasks: ${formatTime(kotlinTotalTimeNs)} ($ktTaskPercent % of all tasks time)")
|
p.println("Total time for Kotlin tasks: ${formatTime(kotlinTotalTimeMs)} ($ktTaskPercent % of all tasks time)")
|
||||||
|
|
||||||
val table = TextTable("Time", "% of Kotlin time", "Task")
|
val table = TextTable("Time", "% of Kotlin time", "Task")
|
||||||
for (task in kotlinTasks.sortedByDescending { it.totalTimeNs }) {
|
for (task in kotlinTasks.sortedByDescending { it.totalTimeMs }) {
|
||||||
val timeNs = task.totalTimeNs
|
val timeMs = task.totalTimeMs
|
||||||
val percent = (timeNs.toDouble() / kotlinTotalTimeNs * 100).asString(1)
|
val percent = (timeMs.toDouble() / kotlinTotalTimeMs * 100).asString(1)
|
||||||
table.addRow(formatTime(timeNs), "$percent %", task.task.path)
|
table.addRow(formatTime(timeMs), "$percent %", task.task.path)
|
||||||
}
|
}
|
||||||
table.printTo(p)
|
table.printTo(p)
|
||||||
p.println()
|
p.println()
|
||||||
@@ -150,7 +150,7 @@ internal class PlainTextBuildReportWriter(
|
|||||||
if (skipMessage != null) {
|
if (skipMessage != null) {
|
||||||
p.println("Task '${task.task.path}' was skipped: $skipMessage")
|
p.println("Task '${task.task.path}' was skipped: $skipMessage")
|
||||||
} else {
|
} else {
|
||||||
p.println("Task '${task.task.path}' finished in ${formatTime(task.totalTimeNs)}")
|
p.println("Task '${task.task.path}' finished in ${formatTime(task.totalTimeMs)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (task.icLogLines.isNotEmpty()) {
|
if (task.icLogLines.isNotEmpty()) {
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ internal interface TaskExecutionData {
|
|||||||
val task: Task
|
val task: Task
|
||||||
val startNs: Long
|
val startNs: Long
|
||||||
val endNs: Long
|
val endNs: Long
|
||||||
val totalTimeNs: Long
|
val totalTimeMs: Long
|
||||||
val resultState: TaskState
|
val resultState: TaskState
|
||||||
val icLogLines: List<String>
|
val icLogLines: List<String>
|
||||||
val buildMetrics: BuildMetrics
|
val buildMetrics: BuildMetrics
|
||||||
|
|||||||
Reference in New Issue
Block a user