From d38561ef40104a06cb5bee0ecd5bd2ff9d83583b Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Tue, 20 Feb 2024 22:47:51 +0530 Subject: [PATCH 1/5] Modify telemetry to contain trigger time as property --- src/client/languageServer/watcher.ts | 4 +++- src/client/telemetry/index.ts | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/languageServer/watcher.ts b/src/client/languageServer/watcher.ts index 9f12dc89df0e..0ec40a008848 100644 --- a/src/client/languageServer/watcher.ts +++ b/src/client/languageServer/watcher.ts @@ -178,7 +178,9 @@ export class LanguageServerWatcher implements IExtensionActivationService, ILang // Start the language server. if (startupStopWatch) { // It means that startup is triggering this code, track time it takes since startup to activate this code. - sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_DURATION, startupStopWatch.elapsedTime); + sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_DURATION, undefined, { + triggerTime: startupStopWatch.elapsedTime, + }); } await languageServerExtensionManager.startLanguageServer(lsResource, interpreter); diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index b2ed37939fa9..fb6f358db760 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -1330,10 +1330,15 @@ export interface IEventNamePropertyMapping { */ /* __GDPR__ "language_server_trigger_duration" : { - "duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "karrtikr", "isMeasurement": true } + "triggerTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" }, } */ - [EventName.LANGUAGE_SERVER_TRIGGER_DURATION]: unknown; + [EventName.LANGUAGE_SERVER_TRIGGER_DURATION]: { + /** + * Time it took to trigger language server startup. + */ + triggerTime: number; + }; /** * Telemetry event sent when starting Node.js server */ From 7020d709a5f4023bd35af20461245c6a739f9929 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Tue, 20 Feb 2024 23:05:22 +0530 Subject: [PATCH 2/5] Also add duration --- src/client/languageServer/watcher.ts | 2 +- src/client/telemetry/index.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/languageServer/watcher.ts b/src/client/languageServer/watcher.ts index 0ec40a008848..f30fa19086b2 100644 --- a/src/client/languageServer/watcher.ts +++ b/src/client/languageServer/watcher.ts @@ -178,7 +178,7 @@ export class LanguageServerWatcher implements IExtensionActivationService, ILang // Start the language server. if (startupStopWatch) { // It means that startup is triggering this code, track time it takes since startup to activate this code. - sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_DURATION, undefined, { + sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_DURATION, startupStopWatch.elapsedTime, { triggerTime: startupStopWatch.elapsedTime, }); } diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index fb6f358db760..960049a9044a 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -1330,7 +1330,8 @@ export interface IEventNamePropertyMapping { */ /* __GDPR__ "language_server_trigger_duration" : { - "triggerTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" }, + "duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" }, + "triggerTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" } } */ [EventName.LANGUAGE_SERVER_TRIGGER_DURATION]: { From f7454cf0a05ebff68ae0dafd940891b5881fc44c Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Tue, 20 Feb 2024 23:51:59 +0530 Subject: [PATCH 3/5] update name --- src/client/languageServer/watcher.ts | 2 +- src/client/telemetry/constants.ts | 2 +- src/client/telemetry/index.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/languageServer/watcher.ts b/src/client/languageServer/watcher.ts index f30fa19086b2..39e6e0bb1ece 100644 --- a/src/client/languageServer/watcher.ts +++ b/src/client/languageServer/watcher.ts @@ -178,7 +178,7 @@ export class LanguageServerWatcher implements IExtensionActivationService, ILang // Start the language server. if (startupStopWatch) { // It means that startup is triggering this code, track time it takes since startup to activate this code. - sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_DURATION, startupStopWatch.elapsedTime, { + sendTelemetryEvent(EventName.LANGUAGE_SERVER_TRIGGER_TIME, startupStopWatch.elapsedTime, { triggerTime: startupStopWatch.elapsedTime, }); } diff --git a/src/client/telemetry/constants.ts b/src/client/telemetry/constants.ts index 3321653c3bd7..b405143c0ba3 100644 --- a/src/client/telemetry/constants.ts +++ b/src/client/telemetry/constants.ts @@ -64,7 +64,7 @@ export enum EventName { EXTENSION_SURVEY_PROMPT = 'EXTENSION_SURVEY_PROMPT', LANGUAGE_SERVER_ENABLED = 'LANGUAGE_SERVER.ENABLED', - LANGUAGE_SERVER_TRIGGER_DURATION = 'LANGUAGE_SERVER.TRIGGER_DURATION', + LANGUAGE_SERVER_TRIGGER_TIME = 'LANGUAGE_SERVER_TRIGGER_TIME', LANGUAGE_SERVER_STARTUP = 'LANGUAGE_SERVER.STARTUP', LANGUAGE_SERVER_READY = 'LANGUAGE_SERVER.READY', LANGUAGE_SERVER_TELEMETRY = 'LANGUAGE_SERVER.EVENT', diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index 960049a9044a..694db0df1a37 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -1329,12 +1329,12 @@ export interface IEventNamePropertyMapping { * Track how long it takes to trigger language server activation code, after Python extension starts activating. */ /* __GDPR__ - "language_server_trigger_duration" : { + "language_server_trigger_time" : { "duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" }, "triggerTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true, "owner": "karrtikr" } } */ - [EventName.LANGUAGE_SERVER_TRIGGER_DURATION]: { + [EventName.LANGUAGE_SERVER_TRIGGER_TIME]: { /** * Time it took to trigger language server startup. */ From 026554ac2979c525fb37e8c6a62f44e6e592e906 Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Wed, 21 Feb 2024 21:54:38 +0530 Subject: [PATCH 4/5] send first session as part of editor_load --- src/client/common/persistentState.ts | 2 +- src/client/extension.ts | 5 +++-- src/client/startupTelemetry.ts | 11 ++++++++--- src/client/telemetry/index.ts | 5 +++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/client/common/persistentState.ts b/src/client/common/persistentState.ts index 2959a2dc8216..ea86b2e145ba 100644 --- a/src/client/common/persistentState.ts +++ b/src/client/common/persistentState.ts @@ -108,7 +108,7 @@ export class PersistentState implements IPersistentState { export const GLOBAL_PERSISTENT_KEYS_DEPRECATED = 'PYTHON_EXTENSION_GLOBAL_STORAGE_KEYS'; export const WORKSPACE_PERSISTENT_KEYS_DEPRECATED = 'PYTHON_EXTENSION_WORKSPACE_STORAGE_KEYS'; -const GLOBAL_PERSISTENT_KEYS = 'PYTHON_GLOBAL_STORAGE_KEYS'; +export const GLOBAL_PERSISTENT_KEYS = 'PYTHON_GLOBAL_STORAGE_KEYS'; const WORKSPACE_PERSISTENT_KEYS = 'PYTHON_WORKSPACE_STORAGE_KEYS'; type KeysStorageType = 'global' | 'workspace'; export type KeysStorage = { key: string; defaultValue: unknown }; diff --git a/src/client/extension.ts b/src/client/extension.ts index a4c31d91eb3b..71b1bf64ed7a 100644 --- a/src/client/extension.ts +++ b/src/client/extension.ts @@ -46,6 +46,7 @@ import { WorkspaceService } from './common/application/workspace'; import { disposeAll } from './common/utils/resourceLifecycle'; import { ProposedExtensionAPI } from './proposedApiTypes'; import { buildProposedApi } from './proposedApi'; +import { GLOBAL_PERSISTENT_KEYS } from './common/persistentState'; durations.codeLoadingTime = stopWatch.elapsedTime; @@ -62,6 +63,7 @@ export async function activate(context: IExtensionContext): Promise; let serviceContainer: IServiceContainer; + const isFirstSession = context.globalState.get(GLOBAL_PERSISTENT_KEYS, []).length === 0; try { const workspaceService = new WorkspaceService(); context.subscriptions.push( @@ -79,8 +81,7 @@ export async function activate(context: IExtensionContext): Promise { +async function getActivationTelemetryProps( + serviceContainer: IServiceContainer, + isFirstSession?: boolean, +): Promise { // TODO: Not all of this data is showing up in the database... // TODO: If any one of these parts fails we send no info. We should @@ -88,7 +92,7 @@ async function getActivationTelemetryProps(serviceContainer: IServiceContainer): const terminalHelper = serviceContainer.get(ITerminalHelper); const terminalShellType = terminalHelper.identifyTerminalShell(); if (!workspaceService.isTrusted) { - return { workspaceFolderCount, terminal: terminalShellType }; + return { workspaceFolderCount, terminal: terminalShellType, isFirstSession }; } const interpreterService = serviceContainer.get(IInterpreterService); const mainWorkspaceUri = workspaceService.workspaceFolders?.length @@ -132,5 +136,6 @@ async function getActivationTelemetryProps(serviceContainer: IServiceContainer): usingUserDefinedInterpreter, usingGlobalInterpreter, appName, + isFirstSession, }; } diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index 694db0df1a37..bb2cd6d77896 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -723,6 +723,11 @@ export interface IEventNamePropertyMapping { * If global interpreter is being used */ usingGlobalInterpreter?: boolean; + /** + * Carries `true` if it is the very first session of the user. We check whether persistent cache is empty + * to approximately guess if it's the first session. + */ + isFirstSession?: boolean; }; /** * Telemetry event sent when substituting Environment variables to calculate value of variables From 86e1de07288a9e77c85fd1b84520e4805f8c4d7b Mon Sep 17 00:00:00 2001 From: Kartik Raj Date: Wed, 21 Feb 2024 22:00:56 +0530 Subject: [PATCH 5/5] safely calculate it --- src/client/extension.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/extension.ts b/src/client/extension.ts index 71b1bf64ed7a..b9f32187413b 100644 --- a/src/client/extension.ts +++ b/src/client/extension.ts @@ -63,8 +63,9 @@ export async function activate(context: IExtensionContext): Promise; let serviceContainer: IServiceContainer; - const isFirstSession = context.globalState.get(GLOBAL_PERSISTENT_KEYS, []).length === 0; + let isFirstSession: boolean | undefined; try { + isFirstSession = context.globalState.get(GLOBAL_PERSISTENT_KEYS, []).length === 0; const workspaceService = new WorkspaceService(); context.subscriptions.push( workspaceService.onDidGrantWorkspaceTrust(async () => {