From b6baad842a3f8a07d1d2ce1ae028d92f5be8d945 Mon Sep 17 00:00:00 2001 From: Anastasia Ivanova Date: Thu, 1 Apr 2021 09:28:36 +0200 Subject: [PATCH] IDEA-265654: migrate run.configuration.exec to StructuredIdeActivity GitOrigin-RevId: 63855094d1af8e677e21129fee9675d01a270276 --- .../execution/impl/ExecutionManagerImpl.kt | 11 +-- .../RunConfigurationTypeUsagesCollector.java | 14 ++-- ...unConfigurationUsageLanguageExtension.java | 5 +- ...RunConfigurationUsageTriggerCollector.java | 68 ++++++++++++------- .../RunDashboardUsagesCollector.java | 8 +-- .../src/META-INF/LangExtensions.xml | 2 +- 6 files changed, 63 insertions(+), 45 deletions(-) diff --git a/platform/execution-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.kt b/platform/execution-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.kt index af49d4bc4893..ff26d40ba1b9 100644 --- a/platform/execution-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.kt +++ b/platform/execution-impl/src/com/intellij/execution/impl/ExecutionManagerImpl.kt @@ -14,6 +14,7 @@ import com.intellij.execution.filters.TextConsoleBuilderFactory import com.intellij.execution.impl.ExecutionManagerImpl.Companion.DELEGATED_RUN_PROFILE_KEY import com.intellij.execution.impl.statistics.RunConfigurationUsageTriggerCollector import com.intellij.execution.impl.statistics.RunConfigurationUsageTriggerCollector.RunConfigurationFinishType +import com.intellij.execution.impl.statistics.RunConfigurationUsageTriggerCollector.UI_SHOWN_STAGE import com.intellij.execution.process.* import com.intellij.execution.runners.ExecutionEnvironment import com.intellij.execution.runners.ExecutionEnvironmentBuilder @@ -25,7 +26,7 @@ import com.intellij.execution.ui.ConsoleView import com.intellij.execution.ui.RunContentDescriptor import com.intellij.execution.ui.RunContentManager import com.intellij.ide.SaveAndSyncHandler -import com.intellij.internal.statistic.IdeActivity +import com.intellij.internal.statistic.StructuredIdeActivity import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.impl.SimpleDataContext import com.intellij.openapi.application.ApplicationManager @@ -153,7 +154,7 @@ class ExecutionManagerImpl(private val project: Project) : ExecutionManager(), D private val inProgress = Collections.synchronizedSet(HashSet()) - private fun processNotStarted(environment: ExecutionEnvironment, activity: IdeActivity?) { + private fun processNotStarted(environment: ExecutionEnvironment, activity: StructuredIdeActivity?) { RunConfigurationUsageTriggerCollector.logProcessFinished(activity, RunConfigurationFinishType.FAILED) val executorId = environment.executor.id inProgress.remove(InProgressEntry(executorId, environment.runner.runnerId)) @@ -242,7 +243,7 @@ class ExecutionManagerImpl(private val project: Project) : ExecutionManager(), D if (!descriptor.isHiddenContent && !environment.isHeadless) { RunContentManager.getInstance(project).showRunContent(executor, descriptor, environment.contentToReuse) } - activity?.stageStarted("ui.shown") + activity?.stageStarted(UI_SHOWN_STAGE) environment.contentToReuse = descriptor val processHandler = descriptor.processHandler @@ -817,7 +818,7 @@ fun RunnerAndConfigurationSettings.isOfSameType(runnerAndConfigurationSettings: return false } -private fun triggerUsage(environment: ExecutionEnvironment): IdeActivity? { +private fun triggerUsage(environment: ExecutionEnvironment): StructuredIdeActivity? { val runConfiguration = environment.runnerAndConfigurationSettings?.configuration val configurationFactory = runConfiguration?.factory ?: return null return RunConfigurationUsageTriggerCollector.trigger(environment.project, configurationFactory, environment.executor, runConfiguration) @@ -920,7 +921,7 @@ private class ProcessExecutionListener(private val project: Project, private val environment: ExecutionEnvironment, private val processHandler: ProcessHandler, private val descriptor: RunContentDescriptor, - private val activity: IdeActivity?) : ProcessAdapter() { + private val activity: StructuredIdeActivity?) : ProcessAdapter() { private val willTerminateNotified = AtomicBoolean() private val terminateNotified = AtomicBoolean() diff --git a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationTypeUsagesCollector.java b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationTypeUsagesCollector.java index 5dd7c911af89..50c242e42ca7 100644 --- a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationTypeUsagesCollector.java +++ b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationTypeUsagesCollector.java @@ -74,7 +74,7 @@ public final class RunConfigurationTypeUsagesCollector extends ProjectUsagesColl } final ConfigurationType configurationType = configurationFactory.getType(); - List pairs = createFeatureUsageData(configurationType, configurationFactory); + List> pairs = createFeatureUsageData(configurationType, configurationFactory); pairs.addAll(getSettings(settings, runConfiguration)); final Template template = new Template(CONFIGURED_IN_PROJECT_EVENT, pairs); addOrIncrement(templates, template); @@ -140,7 +140,7 @@ public final class RunConfigurationTypeUsagesCollector extends ProjectUsagesColl continue; } if (featureUsed) { - List pairs = new ArrayList<>(); + List> pairs = new ArrayList<>(); pairs.add(ID_FIELD.with(runConfiguration.getType().getId())); pairs.add(EventFields.PluginInfo.with(info)); pairs.add(FEATURE_NAME_FIELD.with(name)); @@ -151,9 +151,9 @@ public final class RunConfigurationTypeUsagesCollector extends ProjectUsagesColl } } - public static @NotNull List createFeatureUsageData(@NotNull ConfigurationType configuration, @Nullable ConfigurationFactory factory) { + public static @NotNull List> createFeatureUsageData(@NotNull ConfigurationType configuration, @Nullable ConfigurationFactory factory) { final String id = configuration instanceof UnknownConfigurationType ? "unknown" : configuration.getId(); - List pairs = new ArrayList<>(); + List> pairs = new ArrayList<>(); pairs.add(ID_FIELD.with(id)); if (factory != null && configuration.getConfigurationFactories().length > 1) { pairs.add(FACTORY_FIELD.with(factory.getId())); @@ -172,10 +172,10 @@ public final class RunConfigurationTypeUsagesCollector extends ProjectUsagesColl private static final class Template { private final VarargEventId myEventId; - private final List myEventPairs; + private final List> myEventPairs; private Template(VarargEventId id, - List pairs) { + List> pairs) { myEventId = id; myEventPairs = pairs; } @@ -183,7 +183,7 @@ public final class RunConfigurationTypeUsagesCollector extends ProjectUsagesColl @NotNull private MetricEvent createMetricEvent(int count) { myEventPairs.add(COUNT_FIELD.with(count)); - return myEventId.metric(myEventPairs.toArray(new EventPair[0])); + return myEventId.metric(myEventPairs); } @Override diff --git a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageLanguageExtension.java b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageLanguageExtension.java index d3072db62da1..70217c62fdb3 100644 --- a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageLanguageExtension.java +++ b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageLanguageExtension.java @@ -1,7 +1,6 @@ // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.impl.statistics; -import com.intellij.internal.statistic.IdeActivity; import com.intellij.internal.statistic.eventLog.events.EventField; import com.intellij.internal.statistic.eventLog.events.EventFields; import com.intellij.internal.statistic.service.fus.collectors.FeatureUsageCollectorExtension; @@ -12,12 +11,12 @@ import java.util.List; public class RunConfigurationUsageLanguageExtension implements FeatureUsageCollectorExtension { @Override public String getGroupId() { - return RunConfigurationUsageTriggerCollector.GROUP; + return RunConfigurationUsageTriggerCollector.GROUP_NAME; } @Override public String getEventId() { - return IdeActivity.STARTED_EVENT_ID; + return "started"; } @Override diff --git a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageTriggerCollector.java b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageTriggerCollector.java index 89195a018cb6..e4c980eca737 100644 --- a/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageTriggerCollector.java +++ b/platform/execution-impl/src/com/intellij/execution/impl/statistics/RunConfigurationUsageTriggerCollector.java @@ -10,12 +10,14 @@ import com.intellij.execution.target.TargetEnvironmentAwareRunProfile; import com.intellij.execution.target.TargetEnvironmentConfiguration; import com.intellij.execution.target.TargetEnvironmentType; import com.intellij.execution.target.TargetEnvironmentsManager; -import com.intellij.internal.statistic.IdeActivity; -import com.intellij.internal.statistic.eventLog.FeatureUsageData; +import com.intellij.internal.statistic.IdeActivityGroup; +import com.intellij.internal.statistic.StructuredIdeActivity; +import com.intellij.internal.statistic.eventLog.EventLogGroup; import com.intellij.internal.statistic.eventLog.events.*; import com.intellij.internal.statistic.eventLog.validator.ValidationResultType; import com.intellij.internal.statistic.eventLog.validator.rules.EventContext; import com.intellij.internal.statistic.eventLog.validator.rules.impl.CustomValidationRule; +import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector; import com.intellij.internal.statistic.utils.PluginInfo; import com.intellij.internal.statistic.utils.PluginInfoDetectorKt; import com.intellij.openapi.application.ReadAction; @@ -25,36 +27,53 @@ import com.intellij.util.concurrency.NonUrgentExecutor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.List; import static com.intellij.execution.impl.statistics.RunConfigurationTypeUsagesCollector.createFeatureUsageData; -public final class RunConfigurationUsageTriggerCollector { - public static final String GROUP = "run.configuration.exec"; - private static final ObjectEventField ADDITIONAL_FIELD = EventFields.createAdditionalDataField(GROUP, "started"); +public final class RunConfigurationUsageTriggerCollector extends CounterUsagesCollector { + public static final String GROUP_NAME = "run.configuration.exec"; + private static final EventLogGroup GROUP = new EventLogGroup(GROUP_NAME, 61); + private static final ObjectEventField ADDITIONAL_FIELD = EventFields.createAdditionalDataField(GROUP_NAME, "started"); private static final StringEventField EXECUTOR = EventFields.StringValidatedByCustomRule("executor", "run_config_executor"); private static final StringEventField TARGET = EventFields.StringValidatedByCustomRule("target", RunConfigurationUsageTriggerCollector.RunTargetValidator.RULE_ID); + private static final EnumEventField FINISH_TYPE = + EventFields.Enum("finish_type", RunConfigurationFinishType.class); - @NotNull - public static IdeActivity trigger(@NotNull Project project, - @NotNull ConfigurationFactory factory, - @NotNull Executor executor, - @Nullable RunConfiguration runConfiguration) { - return new IdeActivity(project, GROUP).startedWithDataAsync(data -> { - return ReadAction.nonBlocking(() -> buildContext(project, factory, executor, runConfiguration, data)) - .expireWith(project) - .submit(NonUrgentExecutor.getInstance()); - }); + private static final IdeActivityGroup ACTIVITY_GROUP = new IdeActivityGroup(GROUP, null, + new EventField[]{ADDITIONAL_FIELD, EXECUTOR, + TARGET, + RunConfigurationTypeUsagesCollector.FACTORY_FIELD, + RunConfigurationTypeUsagesCollector.ID_FIELD, + EventFields.PluginInfo}, + new EventField[]{FINISH_TYPE}); + + public static final VarargEventId UI_SHOWN_STAGE = ACTIVITY_GROUP.registerStage("ui.shown"); + + @Override + public EventLogGroup getGroup() { + return GROUP; } - private static @NotNull FeatureUsageData buildContext(@NotNull Project project, - @NotNull ConfigurationFactory factory, - @NotNull Executor executor, - @Nullable RunConfiguration runConfiguration, - @NotNull FeatureUsageData data) { + @NotNull + public static StructuredIdeActivity trigger(@NotNull Project project, + @NotNull ConfigurationFactory factory, + @NotNull Executor executor, + @Nullable RunConfiguration runConfiguration) { + return new StructuredIdeActivity(project, ACTIVITY_GROUP) + .startedAsync(() -> ReadAction.nonBlocking(() -> buildContext(project, factory, executor, runConfiguration)) + .expireWith(project) + .submit(NonUrgentExecutor.getInstance())); + } + + private static @NotNull List> buildContext(@NotNull Project project, + @NotNull ConfigurationFactory factory, + @NotNull Executor executor, + @Nullable RunConfiguration runConfiguration) { final ConfigurationType configurationType = factory.getType(); - List eventPairs = createFeatureUsageData(configurationType, factory); + List> eventPairs = createFeatureUsageData(configurationType, factory); ExecutorGroup group = ExecutorGroup.getGroupIfProxy(executor); eventPairs.add(EXECUTOR.with(group != null ? group.getId() : executor.getId())); if (runConfiguration instanceof FusAwareRunConfiguration) { @@ -71,14 +90,13 @@ public final class RunConfigurationUsageTriggerCollector { } } } - eventPairs.forEach(pair -> pair.addData(data)); - return data; + return eventPairs; } - public static void logProcessFinished(@Nullable IdeActivity activity, + public static void logProcessFinished(@Nullable StructuredIdeActivity activity, RunConfigurationFinishType finishType) { if (activity != null) { - activity.finished(data -> data.addData("finish_type", finishType.name())); + activity.finished(() -> Collections.singletonList(FINISH_TYPE.with(finishType))); } } diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardUsagesCollector.java b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardUsagesCollector.java index 87071c4ca892..811abe81df38 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardUsagesCollector.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/RunDashboardUsagesCollector.java @@ -54,8 +54,8 @@ public class RunDashboardUsagesCollector extends ProjectUsagesCollector { ConfigurationType configurationType = ContainerUtil.find(configurationTypes, type -> type.getId().equals(dashboardType)); if (configurationType == null) continue; - List data = RunConfigurationTypeUsagesCollector.createFeatureUsageData(configurationType, null); - metricEvents.add(ADDED_RUN_CONFIGURATION.metric(data.toArray(new EventPair[0]))); + List> data = RunConfigurationTypeUsagesCollector.createFeatureUsageData(configurationType, null); + metricEvents.add(ADDED_RUN_CONFIGURATION.metric(data)); } } if (!removedDefaultType.isEmpty()) { @@ -64,8 +64,8 @@ public class RunDashboardUsagesCollector extends ProjectUsagesCollector { ConfigurationType configurationType = ContainerUtil.find(configurationTypes, type -> type.getId().equals(removedType)); if (configurationType == null) continue; - List data = RunConfigurationTypeUsagesCollector.createFeatureUsageData(configurationType, null); - metricEvents.add(REMOVED_RUN_CONFIGURATION.metric(data.toArray(new EventPair[0]))); + List> data = RunConfigurationTypeUsagesCollector.createFeatureUsageData(configurationType, null); + metricEvents.add(REMOVED_RUN_CONFIGURATION.metric(data)); } } return metricEvents; diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 61896ab5fb65..178e4902e44b 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -1037,7 +1037,7 @@ - +