From 5abbb8666dc4ef058059b36189780f400aeccecf Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 7 Jun 2022 12:53:44 +0000 Subject: [PATCH] rra/ilgonmic/statistics [JS, Statistics] Register absence in legacy webpack [JS, Statistics]Register build metrics reporter service for webpack task [JS, Statistics] Use only bundle size [JS, Statistic] Add bundle size to webpack task [JS, Statistic] Collect information about compilation size [Gradle, JS] Add size metrics Merge-request: KT-MR-6388 Merged-by: Ilya Goncharov --- .../report/metrics/BuildPerformanceMetric.kt | 2 ++ .../gradle/targets/js/ir/KotlinBrowserJsIr.kt | 5 ++++ .../gradle/targets/js/ir/KotlinJsIrLink.kt | 1 + .../targets/js/subtargets/KotlinBrowserJs.kt | 5 ++++ .../targets/js/webpack/KotlinWebpack.kt | 26 ++++++++++++++++++- 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt index 8da88c8f9b6..80ddbb935d3 100644 --- a/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt +++ b/build-common/src/org/jetbrains/kotlin/build/report/metrics/BuildPerformanceMetric.kt @@ -13,6 +13,8 @@ enum class BuildPerformanceMetric(val parent: BuildPerformanceMetric? = null, va LOOKUP_SIZE(CACHE_DIRECTORY_SIZE, "Lookups size", type = SizeMetricType.BYTES), SNAPSHOT_SIZE(CACHE_DIRECTORY_SIZE, "ABI snapshot size", type = SizeMetricType.BYTES), + BUNDLE_SIZE(readableString = "Total size of the final bundle", type = SizeMetricType.BYTES), + COMPILE_ITERATION(parent = null, "Total compiler iteration", type = SizeMetricType.NUMBER), // Metrics for the `kotlin.incremental.useClasspathSnapshot` feature diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt index 7a979d05e67..876422435eb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinBrowserJsIr.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.report.BuildMetricsReporterService import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl @@ -195,6 +196,10 @@ open class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) : task.description = "build webpack ${mode.name.toLowerCase()} bundle" task._destinationDirectory = binary.distribution.directory + BuildMetricsReporterService.registerIfAbsent(project)?.let { + task.buildMetricsReporterService.value(it) + } + task.dependsOn( distributeResourcesTask ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt index cb8625a068c..5ac2185971d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrLink.kt @@ -11,6 +11,7 @@ import org.gradle.api.file.ProjectLayout import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.work.NormalizeLineEndings import org.gradle.workers.WorkerExecutor import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt index db0e321792e..0f735701801 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/subtargets/KotlinBrowserJs.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.isTest +import org.jetbrains.kotlin.gradle.report.BuildMetricsReporterService import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.dsl.* import org.jetbrains.kotlin.gradle.targets.js.ir.executeTaskBaseName @@ -236,6 +237,10 @@ open class KotlinBrowserJs @Inject constructor(target: KotlinJsTarget) : task.description = "build webpack ${type.name.toLowerCase()} bundle" task._destinationDirectory = distribution.directory + BuildMetricsReporterService.registerIfAbsent(project)?.let { + task.buildMetricsReporterService.value(it) + } + task.commonConfigure( compilation = compilation, dceTaskProvider = dceTaskProvider, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index a81f62d3043..52832ae5937 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -11,6 +11,7 @@ import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.internal.file.FileResolver import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.deployment.internal.Deployment @@ -18,11 +19,15 @@ import org.gradle.deployment.internal.DeploymentHandle import org.gradle.deployment.internal.DeploymentRegistry import org.gradle.process.internal.ExecHandle import org.gradle.process.internal.ExecHandleFactory +import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter +import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl +import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.distsDirectory +import org.jetbrains.kotlin.gradle.report.BuildMetricsReporterService import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies @@ -35,7 +40,7 @@ import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject -open class KotlinWebpack +abstract class KotlinWebpack @Inject constructor( @Internal @@ -61,6 +66,13 @@ constructor( open val execHandleFactory: ExecHandleFactory get() = injected + @get:Internal + internal abstract val buildMetricsReporterService: Property + + @get:Internal + val metrics: Property = project.objects + .property(BuildMetricsReporterImpl()) + @Suppress("unused") @get:Input val compilationId: String by lazy { @@ -302,6 +314,18 @@ constructor( progressReporterPathFilter = rootPackageDir.absolutePath ) ).execute(services) + + val buildMetrics = metrics.get() + destinationDirectory.walkTopDown() + .filter { it.isFile } + .filter { it.extension == "js" } + .map { it.length() } + .sum() + .let { + buildMetrics.addMetric(BuildPerformanceMetric.BUNDLE_SIZE, it) + } + + buildMetricsReporterService.orNull?.also { it.addTask(path, this.javaClass, buildMetrics) } } }