Remove unnecessary KotlinBuildStatsService.getInstance method calls

#KT-59363 In progress
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt
index 20988ed..c12e958 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/BuildFlowService.kt
@@ -28,6 +28,7 @@
 
 internal abstract class BuildFlowService : BuildService<BuildFlowService.Parameters>, AutoCloseable, OperationCompletionListener {
     private var buildFailed: Boolean = false
+    private val executedTaskMetrics = HashSet<BooleanMetrics>()
 
     interface Parameters : BuildServiceParameters {
         val configurationMetrics: Property<MetricContainer>
@@ -74,10 +75,9 @@
                 spec.parameters.fusStatisticsAvailable.set(fusStatisticsAvailable)
             }.also { buildService ->
                 if (fusStatisticsAvailable) {
-                    when {
-                        GradleVersion.current().baseVersion < GradleVersion.version("8.1") ->
-                            BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(buildService)
-                        else -> StatisticsBuildFlowManager.getInstance(project).subscribeForBuildResult()
+                    BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(buildService)
+                    if (GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) {
+                        StatisticsBuildFlowManager.getInstance(project).subscribeForBuildResult()
                     }
                 }
                 if (GradleVersion.current().baseVersion >= GradleVersion.version("8.1")) {
@@ -88,25 +88,45 @@
     }
 
     override fun onFinish(event: FinishEvent?) {
-        if ((event is TaskFinishEvent) && (event.result is TaskFailureResult)) {
-            buildFailed = true
+        if (event is TaskFinishEvent) {
+            getTaskMetric(event.descriptor.name)?.also { executedTaskMetrics.add(it) }
+            if (event.result is TaskFailureResult) {
+                buildFailed = true
+            }
         }
     }
 
     override fun close() {
-        if (parameters.fusStatisticsAvailable.get()) {
-            recordBuildFinished(null, buildFailed)
-        }
-        KotlinBuildStatsService.applyIfInitialised {
-            it.close()
+        KotlinBuildStatsService.applyIfInitialised { service ->
+            executedTaskMetrics.forEach { service.report(it, true) }
+            if (parameters.fusStatisticsAvailable.get() && GradleVersion.current().baseVersion < GradleVersion.version("8.1")) {
+                service.recordBuildFinish(null, buildFailed, parameters.configurationMetrics.orElse(MetricContainer()).get())
+            }
+            service.close()
         }
     }
 
     internal fun recordBuildFinished(action: String?, buildFailed: Boolean) {
-        KotlinBuildStatsService.applyIfInitialised {
-            it.recordBuildFinish(action, buildFailed, parameters.configurationMetrics.orElse(MetricContainer()).get())
+        KotlinBuildStatsService.applyIfInitialised { service ->
+            executedTaskMetrics.forEach { service.report(it, true) }
+            service.recordBuildFinish(action, buildFailed, parameters.configurationMetrics.orElse(MetricContainer()).get())
         }
     }
+
+    private fun getTaskMetric(task: String) = when (task.substringAfterLast(":")) {
+        "dokkaHtml" -> BooleanMetrics.ENABLED_DOKKA_HTML
+        "dokkaGfm" -> BooleanMetrics.ENABLED_DOKKA_GFM
+        "dokkaJavadoc" -> BooleanMetrics.ENABLED_DOKKA_JAVADOC
+        "dokkaJekyll" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL
+        "dokkaHtmlMultiModule" -> BooleanMetrics.ENABLED_DOKKA_HTML_MULTI_MODULE
+        "dokkaGfmMultiModule" -> BooleanMetrics.ENABLED_DOKKA_GFM_MULTI_MODULE
+        "dokkaJekyllMultiModule" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL_MULTI_MODULE
+        "dokkaHtmlCollector" -> BooleanMetrics.ENABLED_DOKKA_HTML_COLLECTOR
+        "dokkaGfmCollector" -> BooleanMetrics.ENABLED_DOKKA_GFM_COLLECTOR
+        "dokkaJavadocCollector" -> BooleanMetrics.ENABLED_DOKKA_JAVADOC_COLLECTOR
+        "dokkaJekyllCollector" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL_COLLECTOR
+        else -> null
+    }
 }
 
 internal class MetricContainer : Serializable {
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt
index 5b86a1e..aa29520 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt
@@ -8,7 +8,6 @@
 import org.gradle.api.Project
 import org.gradle.api.artifacts.DependencySet
 import org.gradle.api.logging.Logging
-import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
 import org.jetbrains.kotlin.gradle.utils.*
 import org.jetbrains.kotlin.statistics.BuildSessionLogger
 import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
@@ -58,29 +57,30 @@
         }
     }
 
-    fun reportGlobalMetrics(
+    internal fun reportGlobalMetricsAndBuildFinished(
         sessionLogger: BuildSessionLogger,
-    ) {
-        runSafe("${KotlinBuildStatHandler::class.java}.reportGlobalMetrics") {
-            System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) }
-            sessionLogger.report(NumericalMetrics.CPU_NUMBER_OF_CORES, Runtime.getRuntime().availableProcessors().toLong())
-            sessionLogger.report(BooleanMetrics.EXECUTED_FROM_IDEA, System.getProperty("idea.active") != null)
-            sessionLogger.report(NumericalMetrics.GRADLE_DAEMON_HEAP_SIZE, Runtime.getRuntime().maxMemory())
-        }
-    }
-
-    internal fun reportBuildFinished(
-        sessionLogger: BuildSessionLogger,
-        action: String?,
+        action: String? = null,
         buildFailed: Boolean,
         configurationMetrics: MetricContainer,
     ) {
-        runSafe("${KotlinBuildStatHandler::class.java}.reportBuildFinish") {
-            configurationMetrics.report(sessionLogger)
-            sessionLogger.finishBuildSession(action, buildFailed)
+        runSafe("${KotlinBuildStatHandler::class.java}.reportGlobalMetrics") {
+            try {
+                reportGlobalMetrics(sessionLogger)
+                configurationMetrics.report(sessionLogger)
+            } finally {
+                sessionLogger.finishBuildSession(action, buildFailed)
+            }
         }
     }
 
+    private fun reportGlobalMetrics(sessionLogger: BuildSessionLogger) {
+        System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) }
+
+        sessionLogger.report(NumericalMetrics.CPU_NUMBER_OF_CORES, Runtime.getRuntime().availableProcessors().toLong())
+        sessionLogger.report(BooleanMetrics.EXECUTED_FROM_IDEA, System.getProperty("idea.active") != null)
+        sessionLogger.report(NumericalMetrics.GRADLE_DAEMON_HEAP_SIZE, Runtime.getRuntime().maxMemory())
+    }
+
     internal fun collectConfigurationTimeMetrics(
         project: Project,
         sessionLogger: BuildSessionLogger,
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt
index c9dd68f..2a209ab 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatsService.kt
@@ -128,14 +128,6 @@
 
                             registerPre232IdeaStatsBean(mbs, gradle, log)
                         }
-
-                        BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
-                            OperationCompletionListener { event ->
-                                if (event is TaskFinishEvent) {
-                                    reportTaskIfNeed(event.descriptor.name)
-                                }
-                            }
-                        })
                     }
                     instance
                 }
@@ -152,24 +144,6 @@
             }
         }
 
-        protected fun reportTaskIfNeed(task: String) {
-            val metric = when (task.substringAfterLast(":")) {
-                "dokkaHtml" -> BooleanMetrics.ENABLED_DOKKA_HTML
-                "dokkaGfm" -> BooleanMetrics.ENABLED_DOKKA_GFM
-                "dokkaJavadoc" -> BooleanMetrics.ENABLED_DOKKA_JAVADOC
-                "dokkaJekyll" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL
-                "dokkaHtmlMultiModule" -> BooleanMetrics.ENABLED_DOKKA_HTML_MULTI_MODULE
-                "dokkaGfmMultiModule" -> BooleanMetrics.ENABLED_DOKKA_GFM_MULTI_MODULE
-                "dokkaJekyllMultiModule" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL_MULTI_MODULE
-                "dokkaHtmlCollector" -> BooleanMetrics.ENABLED_DOKKA_HTML_COLLECTOR
-                "dokkaGfmCollector" -> BooleanMetrics.ENABLED_DOKKA_GFM_COLLECTOR
-                "dokkaJavadocCollector" -> BooleanMetrics.ENABLED_DOKKA_JAVADOC_COLLECTOR
-                "dokkaJekyllCollector" -> BooleanMetrics.ENABLED_DOKKA_JEKYLL_COLLECTOR
-                else -> null
-            }
-            metric?.also { getInstance()?.report(it, true) }
-        }
-
 
         /**
          * Invokes provided collector if the reporting service is initialised.
@@ -334,8 +308,7 @@
 
     //only one jmx bean service should report global metrics
     override fun recordBuildFinish(action: String?, buildFailed: Boolean, configurationTimeMetrics: MetricContainer) {
-        KotlinBuildStatHandler().reportGlobalMetrics(sessionLogger)
-        KotlinBuildStatHandler().reportBuildFinished(sessionLogger, action, buildFailed, configurationTimeMetrics)
+        KotlinBuildStatHandler().reportGlobalMetricsAndBuildFinished(sessionLogger, action, buildFailed, configurationTimeMetrics)
     }
 
     override fun collectStartMetrics(project: Project, isProjectIsolationEnabled: Boolean) =