do not init logger early

GitOrigin-RevId: 6df77e3b82f6a3db359739513d2f670c74b0d53e
This commit is contained in:
Vladimir Krivosheev
2024-01-25 15:09:20 +01:00
committed by intellij-monorepo-bot
parent d7ff5727f7
commit 082d393a4b

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.ide.bootstrap package com.intellij.platform.ide.bootstrap
import com.intellij.diagnostic.PluginException import com.intellij.diagnostic.PluginException
@@ -10,6 +10,7 @@ import com.intellij.openapi.application.Application
import com.intellij.openapi.application.ConfigImportHelper import com.intellij.openapi.application.ConfigImportHelper
import com.intellij.openapi.application.EDT import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.ex.ApplicationManagerEx import com.intellij.openapi.application.ex.ApplicationManagerEx
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.diagnostic.runAndLogException import com.intellij.openapi.diagnostic.runAndLogException
import com.intellij.openapi.extensions.impl.ExtensionPointImpl import com.intellij.openapi.extensions.impl.ExtensionPointImpl
@@ -21,7 +22,8 @@ import org.jetbrains.annotations.ApiStatus.Internal
import java.time.Duration import java.time.Duration
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
private val log = logger<IdeStartupWizard>() private val LOG: Logger
get() = logger<IdeStartupWizard>()
val isIdeStartupWizardEnabled: Boolean val isIdeStartupWizardEnabled: Boolean
get() = !ApplicationManagerEx.isInIntegrationTest() get() = !ApplicationManagerEx.isInIntegrationTest()
@@ -30,8 +32,7 @@ val isIdeStartupWizardEnabled: Boolean
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) { internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
LOG.info("Entering startup wizard workflow.")
log.info("Entering startup wizard workflow.")
val point = app.extensionArea val point = app.extensionArea
.getExtensionPoint<IdeStartupWizard>("com.intellij.ideStartupWizard") as ExtensionPointImpl<IdeStartupWizard> .getExtensionPoint<IdeStartupWizard>("com.intellij.ideStartupWizard") as ExtensionPointImpl<IdeStartupWizard>
@@ -39,7 +40,7 @@ internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
for (adapter in sortedAdapters) { for (adapter in sortedAdapters) {
val pluginDescriptor = adapter.pluginDescriptor val pluginDescriptor = adapter.pluginDescriptor
if (!pluginDescriptor.isBundled) { if (!pluginDescriptor.isBundled) {
log.error(PluginException("ideStartupWizard extension can be implemented only by a bundled plugin", pluginDescriptor.pluginId)) LOG.error(PluginException("ideStartupWizard extension can be implemented only by a bundled plugin", pluginDescriptor.pluginId))
continue continue
} }
@@ -56,7 +57,7 @@ internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
IdeStartupWizardCollector.logInitialStartSuccess() IdeStartupWizardCollector.logInitialStartSuccess()
} }
catch (_: TimeoutCancellationException) { catch (_: TimeoutCancellationException) {
log.warn("Timeout on waiting for initial start, proceeding the startup flow without waiting.") LOG.warn("Timeout on waiting for initial start, proceeding the startup flow without waiting.")
IdeStartupWizardCollector.logInitialStartTimeout() IdeStartupWizardCollector.logInitialStartTimeout()
} }
finally { finally {
@@ -67,14 +68,14 @@ internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
} }
} }
log.info("Passing execution control to $wizard.") LOG.info("Passing execution control to $wizard.")
span("${adapter.assignableToClassName}.run", Dispatchers.EDT) block@{ span("${adapter.assignableToClassName}.run", Dispatchers.EDT) block@{
val startupStatus = com.intellij.platform.ide.bootstrap.isInitialStart val startupStatus = com.intellij.platform.ide.bootstrap.isInitialStart
try { try {
if (startupStatus != null && startupStatus.isCompleted && !startupStatus.isCancelled) { if (startupStatus != null && startupStatus.isCompleted && !startupStatus.isCancelled) {
val wasSuccessful = startupStatus.getCompleted() val wasSuccessful = startupStatus.getCompleted()
if (!wasSuccessful) { if (!wasSuccessful) {
log.info("Initial start was unsuccessful, terminating the wizard flow.") LOG.info("Initial start was unsuccessful, terminating the wizard flow.")
return@block return@block
} }
} }
@@ -82,7 +83,7 @@ internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
startupStatus?.cancel() startupStatus?.cancel()
} }
log.info("Passing execution control to $wizard.") LOG.info("Passing execution control to $wizard.")
wizard.run() wizard.run()
} }
@@ -90,7 +91,7 @@ internal suspend fun runStartupWizard(isInitialStart: Job, app: Application) {
break break
} }
catch (e: Throwable) { catch (e: Throwable) {
log.error(PluginException(e, pluginDescriptor.pluginId)) LOG.error(PluginException(e, pluginDescriptor.pluginId))
} }
} }
point.reset() point.reset()
@@ -114,7 +115,6 @@ enum class StartupWizardStage {
} }
object IdeStartupWizardCollector : CounterUsagesCollector() { object IdeStartupWizardCollector : CounterUsagesCollector() {
val GROUP = EventLogGroup("wizard.startup", 6) val GROUP = EventLogGroup("wizard.startup", 6)
override fun getGroup() = GROUP override fun getGroup() = GROUP
@@ -134,16 +134,18 @@ object IdeStartupWizardCollector : CounterUsagesCollector() {
EventFields.Int("group"), EventFields.Int("group"),
EventFields.Boolean("enabled") EventFields.Boolean("enabled")
) )
fun logExperimentState() {
if (ConfigImportHelper.isFirstSession()) { internal fun logExperimentState() {
val isEnabled = IdeStartupExperiment.isExperimentEnabled() assert(ConfigImportHelper.isFirstSession())
log.info("IDE startup isEnabled = $isEnabled, IDEStartupKind = ${IdeStartupExperiment.experimentGroupKind}, IDEStartup = ${IdeStartupExperiment.experimentGroup}") val isEnabled = IdeStartupExperiment.isExperimentEnabled()
experimentState.log( LOG.info("IDE startup isEnabled = $isEnabled," +
IdeStartupExperiment.experimentGroupKind, " IDEStartupKind = ${IdeStartupExperiment.experimentGroupKind}, " +
IdeStartupExperiment.experimentGroup, "IDEStartup = ${IdeStartupExperiment.experimentGroup}")
isEnabled experimentState.log(
) IdeStartupExperiment.experimentGroupKind,
} IdeStartupExperiment.experimentGroup,
isEnabled
)
} }
private val wizardStageEnded = GROUP.registerEvent( private val wizardStageEnded = GROUP.registerEvent(
@@ -151,13 +153,13 @@ object IdeStartupWizardCollector : CounterUsagesCollector() {
EventFields.Enum<StartupWizardStage>("stage"), EventFields.Enum<StartupWizardStage>("stage"),
EventFields.DurationMs EventFields.DurationMs
) )
fun logStartupStageTime(stage: StartupWizardStage, duration: Duration) { fun logStartupStageTime(stage: StartupWizardStage, duration: Duration) {
wizardStageEnded.log(stage, duration.toMillis()) wizardStageEnded.log(stage, duration.toMillis())
} }
} }
object IdeStartupExperiment { private object IdeStartupExperiment {
enum class GroupKind { enum class GroupKind {
Experimental, Experimental,
Control, Control,
@@ -173,7 +175,7 @@ object IdeStartupExperiment {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
private fun getGroupKind(group: Int) = when { private fun getGroupKind(group: Int) = when {
PlatformUtils.isIdeaUltimate() || PlatformUtils.isPyCharmPro() -> when { PlatformUtils.isIdeaUltimate() || PlatformUtils.isPyCharmPro() -> when {
group >= 0 && group <= 7 -> GroupKind.Experimental group in 0..7 -> GroupKind.Experimental
group == 8 || group == 9 -> GroupKind.Control group == 8 || group == 9 -> GroupKind.Control
else -> GroupKind.Undefined else -> GroupKind.Undefined
} }
@@ -186,7 +188,7 @@ object IdeStartupExperiment {
private fun String.asBucket() = MathUtil.nonNegativeAbs(this.hashCode()) % 256 private fun String.asBucket() = MathUtil.nonNegativeAbs(this.hashCode()) % 256
private fun getBucket(): Int { private fun getBucket(): Int {
val deviceId = log.runAndLogException { val deviceId = LOG.runAndLogException {
DeviceIdManager.getOrGenerateId(object : DeviceIdManager.DeviceIdToken {}, "FUS") DeviceIdManager.getOrGenerateId(object : DeviceIdManager.DeviceIdToken {}, "FUS")
} ?: return 0 } ?: return 0
return deviceId.asBucket() return deviceId.asBucket()