From bcbabd5a90ce077970407780a2002c8a40d8bcf5 Mon Sep 17 00:00:00 2001 From: Liubov Afanaseva Date: Tue, 5 Jul 2022 13:03:25 +0200 Subject: [PATCH] FUS: migrate "terminalShell" to the new API (IDEA-268269) GitOrigin-RevId: 90a04f0ccbaa743704f548aad21e2d3a62bc822f --- .../collectors/fus/TerminalFusAwareHandler.kt | 4 +- .../statistic/eventLog/events/EventFields.kt | 5 +- .../terminal/resources/META-INF/terminal.xml | 2 +- .../runAnything/RunAnythingTerminalBridge.kt | 9 ++- .../terminal/TerminalUsageCollector.kt | 69 ++++++++++++------- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/platform/statistics/src/com/intellij/internal/statistic/collectors/fus/TerminalFusAwareHandler.kt b/platform/statistics/src/com/intellij/internal/statistic/collectors/fus/TerminalFusAwareHandler.kt index 20b1eaf56ec1..c1cffbac70fb 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/collectors/fus/TerminalFusAwareHandler.kt +++ b/platform/statistics/src/com/intellij/internal/statistic/collectors/fus/TerminalFusAwareHandler.kt @@ -1,12 +1,12 @@ // 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.internal.statistic.collectors.fus -import com.intellij.internal.statistic.eventLog.FeatureUsageData +import com.intellij.internal.statistic.eventLog.events.EventPair import com.intellij.openapi.project.Project interface TerminalFusAwareHandler { /** * Fill data to be sent to statistic collector server */ - fun fillData(project: Project, workingDirectory: String?, localSession: Boolean, command: String, data: FeatureUsageData) + fun fillData(project: Project, workingDirectory: String?, localSession: Boolean, command: String, data: MutableList>) } \ No newline at end of file diff --git a/platform/statistics/src/com/intellij/internal/statistic/eventLog/events/EventFields.kt b/platform/statistics/src/com/intellij/internal/statistic/eventLog/events/EventFields.kt index 6d930eb6d969..4eb603a40753 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/eventLog/events/EventFields.kt +++ b/platform/statistics/src/com/intellij/internal/statistic/eventLog/events/EventFields.kt @@ -411,8 +411,9 @@ object EventFields { } @JvmField - val Version = object : PrimitiveEventField() { - override val name: String = "version" + val Version = VersionClass("version") + + class VersionClass(@NonNls override val name: String) : PrimitiveEventField() { override val validationRule: List get() = listOf("{regexp#version}") diff --git a/plugins/terminal/resources/META-INF/terminal.xml b/plugins/terminal/resources/META-INF/terminal.xml index af35abe20071..713d2cd4bbdc 100644 --- a/plugins/terminal/resources/META-INF/terminal.xml +++ b/plugins/terminal/resources/META-INF/terminal.xml @@ -21,7 +21,7 @@ - + diff --git a/plugins/terminal/src/com/intellij/ide/actions/runAnything/RunAnythingTerminalBridge.kt b/plugins/terminal/src/com/intellij/ide/actions/runAnything/RunAnythingTerminalBridge.kt index 522b92c8bde4..b52a4b55dcaf 100644 --- a/plugins/terminal/src/com/intellij/ide/actions/runAnything/RunAnythingTerminalBridge.kt +++ b/plugins/terminal/src/com/intellij/ide/actions/runAnything/RunAnythingTerminalBridge.kt @@ -5,8 +5,10 @@ import com.intellij.execution.Executor import com.intellij.ide.actions.runAnything.activity.RunAnythingCommandProvider import com.intellij.ide.actions.runAnything.activity.RunAnythingProvider import com.intellij.ide.actions.runAnything.activity.RunAnythingRecentProjectProvider +import com.intellij.internal.statistic.collectors.fus.ClassNameRuleValidator import com.intellij.internal.statistic.collectors.fus.TerminalFusAwareHandler -import com.intellij.internal.statistic.eventLog.FeatureUsageData +import com.intellij.internal.statistic.eventLog.events.EventFields +import com.intellij.internal.statistic.eventLog.events.EventPair import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.actionSystem.impl.SimpleDataContext @@ -57,13 +59,14 @@ private class RunAnythingTerminalBridge : TerminalShellCommandHandler, TerminalF } } - override fun fillData(project: Project, workingDirectory: String?, localSession: Boolean, command: String, data: FeatureUsageData) { + override fun fillData(project: Project, workingDirectory: String?, localSession: Boolean, command: String, data: MutableList>) { val dataContext = createDataContext(project, localSession, workingDirectory) val runAnythingProvider = RunAnythingProvider.EP_NAME.extensionList .filter { checkForCLI(it) } .ifEmpty { return } .first { provider -> provider.findMatchingValue(dataContext, command) != null } - data.addData("runAnythingProvider", runAnythingProvider::class.java.name) + data.add(EventFields.StringValidatedByCustomRule("runAnythingProvider", + ClassNameRuleValidator::class.java).with(runAnythingProvider::class.java.name)) } } \ No newline at end of file diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalUsageCollector.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalUsageCollector.kt index 46fea367ec5c..be2296aa43e3 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalUsageCollector.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalUsageCollector.kt @@ -1,9 +1,12 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.plugins.terminal +import com.intellij.internal.statistic.collectors.fus.ClassNameRuleValidator import com.intellij.internal.statistic.collectors.fus.TerminalFusAwareHandler -import com.intellij.internal.statistic.eventLog.FeatureUsageData -import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger +import com.intellij.internal.statistic.eventLog.EventLogGroup +import com.intellij.internal.statistic.eventLog.events.EventFields +import com.intellij.internal.statistic.eventLog.events.EventPair +import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector import com.intellij.openapi.project.Project import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.util.Version @@ -11,17 +14,34 @@ import com.intellij.terminal.TerminalShellCommandHandler import com.intellij.util.PathUtil import java.util.* -class TerminalUsageTriggerCollector { +class TerminalUsageTriggerCollector : CounterUsagesCollector() { + override fun getGroup(): EventLogGroup = GROUP + companion object { - @JvmStatic - fun triggerSshShellStarted(project: Project) { - FUCounterUsageLogger.getInstance().logEvent(project, GROUP_ID, "ssh.exec") - } + private val GROUP = EventLogGroup(GROUP_ID, 4) + + private val TERMINAL_COMMAND_HANDLER_FIELD = EventFields.StringValidatedByCustomRule("terminalCommandHandler", + ClassNameRuleValidator::class.java) + private val RUN_ANYTHING_PROVIDER_FIELD = EventFields.StringValidatedByCustomRule("runAnythingProvider", + ClassNameRuleValidator::class.java) + + private val sshExecEvent = GROUP.registerEvent("ssh.exec") + private val terminalCommandExecutedEvent = GROUP.registerEvent("terminal.command.executed") + private val terminalSmartCommandExecutedEvent = GROUP.registerVarargEvent("terminal.smart.command.executed", + TERMINAL_COMMAND_HANDLER_FIELD, + RUN_ANYTHING_PROVIDER_FIELD) + private val terminalSmartCommandNotExecutedEvent = GROUP.registerVarargEvent("terminal.smart.command.not.executed", + TERMINAL_COMMAND_HANDLER_FIELD, + RUN_ANYTHING_PROVIDER_FIELD) + private val localExecEvent = GROUP.registerEvent("local.exec", + EventFields.VersionClass("os-version"), + EventFields.String("shell", KNOWN_SHELLS.toList())) @JvmStatic - fun triggerCommandExecuted(project: Project) { - FUCounterUsageLogger.getInstance().logEvent(project, GROUP_ID, "terminal.command.executed") - } + fun triggerSshShellStarted(project: Project) = sshExecEvent.log(project) + + @JvmStatic + fun triggerCommandExecuted(project: Project) = terminalCommandExecutedEvent.log(project) @JvmStatic fun triggerSmartCommand(project: Project, @@ -30,26 +50,25 @@ class TerminalUsageTriggerCollector { command: String, handler: TerminalShellCommandHandler, executed: Boolean) { - val data = FeatureUsageData().addData("terminalCommandHandler", handler::class.java.name) + val data: MutableList> = mutableListOf(TERMINAL_COMMAND_HANDLER_FIELD.with(handler::class.java.name)) + if (handler is TerminalFusAwareHandler) { handler.fillData(project, workingDirectory, localSession, command, data) } - val eventId = if (executed) { - "terminal.smart.command.executed" + + if (executed) { + terminalSmartCommandExecutedEvent.log(project, data) } else { - "terminal.smart.command.not.executed" + terminalSmartCommandNotExecutedEvent.log(project, data) } - FUCounterUsageLogger.getInstance().logEvent(project, GROUP_ID, eventId, data) } @JvmStatic - fun triggerLocalShellStarted(project: Project, shellCommand: Array) { - FUCounterUsageLogger.getInstance().logEvent(project, GROUP_ID, "local.exec", FeatureUsageData() - .addData("os-version", Version.parseVersion(SystemInfo.OS_VERSION)?.toCompactString() ?: "unknown") - .addData("shell", getShellNameForStat(shellCommand.firstOrNull())) - ) - } + fun triggerLocalShellStarted(project: Project, shellCommand: Array) = + localExecEvent.log(project, + Version.parseVersion(SystemInfo.OS_VERSION)?.toCompactString() ?: "unknown", + getShellNameForStat(shellCommand.firstOrNull())) @JvmStatic private fun getShellNameForStat(shellName: String?): String { @@ -58,7 +77,7 @@ class TerminalUsageTriggerCollector { val ind = name.indexOf(" ") name = if (ind < 0) name else name.substring(0, ind) if (SystemInfo.isFileSystemCaseSensitive) { - name = name.toLowerCase(Locale.ENGLISH) + name = name.lowercase(Locale.ENGLISH) } name = PathUtil.getFileName(name) name = trimKnownExt(name) @@ -74,7 +93,9 @@ class TerminalUsageTriggerCollector { private const val GROUP_ID = "terminalShell" -private val KNOWN_SHELLS = setOf("activate", +private val KNOWN_SHELLS = setOf("unspecified", + "other", + "activate", "anaconda3", "bash", "cexec", @@ -97,4 +118,4 @@ private val KNOWN_SHELLS = setOf("activate", "ubuntu1804", "wsl", "zsh") -private val KNOWN_EXTENSIONS = setOf("exe", "bat", "cmd") +private val KNOWN_EXTENSIONS = setOf("exe", "bat", "cmd") \ No newline at end of file