FUS: migrate "terminalShell" to the new API (IDEA-268269)

GitOrigin-RevId: 90a04f0ccbaa743704f548aad21e2d3a62bc822f
This commit is contained in:
Liubov Afanaseva
2022-07-05 13:03:25 +02:00
committed by intellij-monorepo-bot
parent db2a35fff9
commit bcbabd5a90
5 changed files with 57 additions and 32 deletions

View File

@@ -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<EventPair<*>>)
}

View File

@@ -411,8 +411,9 @@ object EventFields {
}
@JvmField
val Version = object : PrimitiveEventField<String?>() {
override val name: String = "version"
val Version = VersionClass("version")
class VersionClass(@NonNls override val name: String) : PrimitiveEventField<String?>() {
override val validationRule: List<String>
get() = listOf("{regexp#version}")

View File

@@ -21,7 +21,7 @@
<projectService serviceImplementation="org.jetbrains.plugins.terminal.arrangement.TerminalArrangementManager"/>
<applicationService serviceImplementation="org.jetbrains.plugins.terminal.arrangement.TerminalCommandHistoryManager"/>
<statistics.counterUsagesCollector groupId="terminalShell" version="3"/>
<statistics.counterUsagesCollector implementationClass="org.jetbrains.plugins.terminal.TerminalUsageTriggerCollector"/>
<registryKey key="terminal.Ctrl-E.opens.RecentFiles.popup" defaultValue="false"
description="Ctrl+E in terminal opens 'Recent Files' popup on Linux/Windows"/>

View File

@@ -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<EventPair<*>>) {
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))
}
}

View File

@@ -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<EventPair<*>> = 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<String>) {
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<String>) =
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")