diff --git a/extensions/gitpod-shared/src/analytics.ts b/extensions/gitpod-shared/src/analytics.ts index 36c1ffa1350aa..3feb6b2d618a1 100644 --- a/extensions/gitpod-shared/src/analytics.ts +++ b/extensions/gitpod-shared/src/analytics.ts @@ -2,39 +2,65 @@ * Copyright (c) Gitpod. All rights reserved. *--------------------------------------------------------------------------------------------*/ +import path from 'path'; +import * as vscode from 'vscode'; + +import { GitpodExtensionContext } from './features'; + export interface BaseGitpodAnalyticsEventPropeties { - sessionId: string - workspaceId: string - instanceId: string - appName: string - uiKind: 'web' | 'desktop' - devMode: boolean - version: string - timestamp: number + sessionId: string; + workspaceId: string; + instanceId: string; + appName: string; + uiKind: 'web' | 'desktop'; + devMode: boolean; + version: string; + timestamp: number; } - interface GAET { - eventName: N - properties: Omit + eventName: N; + properties: Omit; } - export type GitpodAnalyticsEvent = GAET<'vscode_session', {}> | GAET<'vscode_execute_command_gitpod_open_link', { - url: string + url: string; }> | GAET<'vscode_execute_command_gitpod_change_vscode_type', { - targetUiKind: 'web' | 'desktop', - targetQualifier?: 'stable' | 'insiders' + targetUiKind: 'web' | 'desktop'; + targetQualifier?: 'stable' | 'insiders'; }> | GAET<'vscode_execute_command_gitpod_workspace', { - action: 'share' | 'stop-sharing' | 'stop' | 'snapshot' | 'extend-timeout' + action: 'share' | 'stop-sharing' | 'stop' | 'snapshot' | 'extend-timeout'; }> | GAET<'vscode_execute_command_gitpod_ports', { - action: 'private' | 'public' | 'preview' | 'openBrowser' + action: 'private' | 'public' | 'preview' | 'openBrowser'; }> | GAET<'vscode_execute_command_gitpod_config', { - action: 'remove' | 'add' + action: 'remove' | 'add'; + }> | + GAET<'vscode_active_language', { + lang: string; ext?: string; }>; + +export function registerUsageAnalytics(context: GitpodExtensionContext): void { + context.fireAnalyticsEvent({ eventName: 'vscode_session', properties: {} }); +} + +const activeLanguages = new Set(); +export function registerActiveLanguageAnalytics(context: GitpodExtensionContext): void { + const track = () => { + const e = vscode.window.activeTextEditor; + if (!e || activeLanguages.has(e.document.languageId)) { + return; + } + const lang = e.document.languageId; + activeLanguages.add(lang); + const ext = path.extname(e.document.uri.path) || undefined; + context.fireAnalyticsEvent({ eventName: 'vscode_active_language', properties: { lang, ext } }); + }; + track(); + context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(() => track())); +} diff --git a/extensions/gitpod-shared/src/extension.ts b/extensions/gitpod-shared/src/extension.ts index d076439e95f83..27b3064d24cfd 100644 --- a/extensions/gitpod-shared/src/extension.ts +++ b/extensions/gitpod-shared/src/extension.ts @@ -3,6 +3,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; +import { registerActiveLanguageAnalytics, registerUsageAnalytics } from './analytics'; import { createGitpodExtensionContext, GitpodExtensionContext, registerDefaultLayout, registerNotifications, registerWorkspaceCommands, registerWorkspaceSharing, registerWorkspaceTimeout } from './features'; export { GitpodExtensionContext, registerTasks, SupervisorConnection, registerIpcHookCli } from './features'; @@ -25,6 +26,7 @@ export async function setupGitpodContext(context: vscode.ExtensionContext): Prom vscode.commands.executeCommand('setContext', 'gitpod.UIKind', vscode.env.uiKind === vscode.UIKind.Web ? 'web' : 'desktop'); registerUsageAnalytics(gitpodContext); + registerActiveLanguageAnalytics(gitpodContext); registerWorkspaceCommands(gitpodContext); registerWorkspaceSharing(gitpodContext); registerWorkspaceTimeout(gitpodContext); @@ -33,10 +35,6 @@ export async function setupGitpodContext(context: vscode.ExtensionContext): Prom return gitpodContext; } -function registerUsageAnalytics(context: GitpodExtensionContext): void { - context.fireAnalyticsEvent({ eventName: 'vscode_session', properties: {} }); -} - function logContextInfo(context: GitpodExtensionContext) { context.logger.info(`VSCODE_MACHINE_ID: ${vscode.env.machineId}`); context.logger.info(`VSCODE_SESSION_ID: ${vscode.env.sessionId}`);