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 <Ilya.Goncharov@jetbrains.com>
This commit is contained in:
Ilya Goncharov
2022-06-07 12:53:44 +00:00
committed by Space
parent 7878c19225
commit 5abbb8666d
5 changed files with 38 additions and 1 deletions
@@ -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
@@ -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
)
@@ -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
@@ -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,
@@ -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<BuildMetricsReporterService?>
@get:Internal
val metrics: Property<BuildMetricsReporter> = 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) }
}
}