Report build metrics in the end of build

This commit is contained in:
nataliya.valtman
2022-06-23 13:46:14 +03:00
committed by Space
parent f71564112d
commit 398228679a
6 changed files with 56 additions and 11 deletions
@@ -93,6 +93,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
BuildMetricsReporterService.registerIfAbsent(project)?.also {
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(it)
}
HttpReportService.registerIfAbsent(project, kotlinPluginVersion)?.also {
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(it)
}
@@ -46,4 +46,22 @@ enum class StatTag {
KOTLIN_DEBUG
}
//Sensitive data. This object is used directly for statistic via http
data class GradleBuildStartParameters(
val tasks: List<String>,
val excludedTasks: Set<String>,
val currentDir: String,
val projectProperties: List<String>,
val systemProperties: List<String>,
) : java.io.Serializable
//Sensitive data. This object is used directly for statistic via http
data class BuildFinishData(
val startParameters: GradleBuildStartParameters,
val buildUuid: String = "Unset",
val label: String?,
val totalTime: Long,
)
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.BuildTime
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskExecutionResults
import org.jetbrains.kotlin.gradle.plugin.stat.GradleBuildStartParameters
import org.jetbrains.kotlin.gradle.report.data.BuildExecutionData
import org.jetbrains.kotlin.gradle.report.data.BuildExecutionDataProcessor
import org.jetbrains.kotlin.gradle.report.data.BuildOperationRecord
@@ -31,7 +32,7 @@ abstract class BuildMetricsReporterService : BuildService<BuildMetricsReporterSe
interface Parameters : BuildServiceParameters {
var buildDataProcessors: List<BuildExecutionDataProcessor>
var startParameters: List<String>
var startParameters: GradleBuildStartParameters
var reportingSettings: ReportingSettings
}
@@ -113,13 +114,13 @@ abstract class BuildMetricsReporterService : BuildService<BuildMetricsReporterSe
companion object {
fun getStartParameters(project: Project) = project.gradle.startParameter.let {
val startParameters = arrayListOf<String>()
startParameters.add("tasks = ${it.taskRequests.joinToString { task -> task.args.toString() }}")
startParameters.add("excluded tasks = ${it.excludedTaskNames}")
startParameters.add("current dir = ${it.currentDir}")
startParameters.add("project properties args = ${it.projectProperties}")
startParameters.add("system properties args = ${it.systemPropertiesArgs}")
startParameters
GradleBuildStartParameters(
tasks = it.taskRequests.map { it.args.toString() },
excludedTasks = it.excludedTaskNames,
currentDir = it.currentDir.path,
projectProperties = it.projectProperties.map {(key, value) -> "$key: $value"},
systemProperties = it.systemPropertiesArgs.map {(key, value) -> "$key: $value"},
)
}
fun registerIfAbsent(project: Project): Provider<BuildMetricsReporterService>? {
@@ -14,8 +14,11 @@ import org.gradle.api.services.BuildServiceParameters
import org.gradle.tooling.events.FinishEvent
import org.gradle.tooling.events.OperationCompletionListener
import org.gradle.tooling.events.task.TaskFinishEvent
import org.jetbrains.kotlin.gradle.plugin.stat.BuildFinishData
import org.jetbrains.kotlin.gradle.plugin.stat.CompileStatisticsData
import org.jetbrains.kotlin.gradle.plugin.stat.GradleBuildStartParameters
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatListener.Companion.prepareData
import org.jetbrains.kotlin.gradle.report.BuildMetricsReporterService.Companion.getStartParameters
import java.io.IOException
import java.net.HttpURLConnection
import java.net.URL
@@ -29,12 +32,15 @@ abstract class HttpReportService : BuildService<HttpReportService.Parameters>,
var executorService: ExecutorService = Executors.newSingleThreadExecutor()
val startTime = System.nanoTime()
interface Parameters : BuildServiceParameters {
var label: String?
var uuid: String
var projectName: String
var httpSettings: HttpReportSettings
var kotlinVersion: String
var startParameters: GradleBuildStartParameters
}
private val log = Logging.getLogger(this.javaClass)
@@ -51,6 +57,7 @@ abstract class HttpReportService : BuildService<HttpReportService.Parameters>,
}
override fun close() {
executorService.submit { reportBuildFinish() }
executorService.shutdown()
}
@@ -70,6 +77,7 @@ abstract class HttpReportService : BuildService<HttpReportService.Parameters>,
it.parameters.uuid = UUID.randomUUID().toString()
it.parameters.httpSettings = httpSettings
it.parameters.kotlinVersion = kotlinVersion
it.parameters.startParameters = getStartParameters(project)
}!!
}
@@ -77,7 +85,7 @@ abstract class HttpReportService : BuildService<HttpReportService.Parameters>,
}
fun report(data: CompileStatisticsData) {
fun report(data: Any) {
val elapsedTime = measureTimeMillis {
if (invalidUrl) {
return
@@ -115,6 +123,16 @@ abstract class HttpReportService : BuildService<HttpReportService.Parameters>,
log.debug("Report statistic by http takes $elapsedTime ms")
}
private fun reportBuildFinish() {
val buildFinishData = BuildFinishData(
startParameters = parameters.startParameters,
buildUuid = parameters.uuid,
label = parameters.label,
totalTime = (System.nanoTime() - startTime) / 1_000_000
)
report(buildFinishData)
}
private fun checkResponseAndLog(connection: HttpURLConnection) {
val isResponseBad = connection.responseCode !in 200..299
if (isResponseBad) {
@@ -74,7 +74,13 @@ internal class PlainTextBuildReportWriter(
private fun printBuildInfo(build: BuildExecutionData) {
p.withIndent("Gradle start parameters:") {
build.startParameters.forEach { p.println(it) }
build.startParameters.let {
p.println("tasks = ${it.tasks}")
p.println("excluded tasks = ${it.excludedTasks}")
p.println("current dir = ${it.currentDir}")
p.println("project properties args = ${it.projectProperties}")
p.println(" system properties args = ${it.systemProperties}")
}
}
p.println()
@@ -6,9 +6,10 @@
package org.jetbrains.kotlin.gradle.report.data
import org.jetbrains.kotlin.build.report.metrics.BuildMetrics
import org.jetbrains.kotlin.gradle.plugin.stat.GradleBuildStartParameters
class BuildExecutionData(
val startParameters: Collection<String>,
val startParameters: GradleBuildStartParameters,
val failureMessages: List<String?>,
val buildOperationRecord: Collection<BuildOperationRecord>
) {