Skip to content

Commit 0db69a8

Browse files
committed
add more telemetry
1 parent ecbcdac commit 0db69a8

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

src/common/telemetry/constants.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ export enum EventNames {
5050
*/
5151
ENVIRONMENT_DISCOVERY = 'ENVIRONMENT_DISCOVERY',
5252
MANAGER_READY_TIMEOUT = 'MANAGER_READY.TIMEOUT',
53+
/**
54+
* Telemetry event for individual manager registration failure.
55+
* Fires once per manager that fails during registration (inside safeRegister).
56+
* Properties:
57+
* - managerName: string (e.g. 'system', 'conda', 'pyenv', 'pipenv', 'poetry', 'shellStartupVars')
58+
* - errorType: string (classified error category from classifyError)
59+
*/
60+
MANAGER_REGISTRATION_FAILED = 'MANAGER_REGISTRATION.FAILED',
5361
}
5462

5563
// Map all events to their properties
@@ -62,10 +70,17 @@ export interface IEventNamePropertyMapping {
6270
[EventNames.EXTENSION_ACTIVATION_DURATION]: never | undefined;
6371
/* __GDPR__
6472
"extension.manager_registration_duration": {
65-
"duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" }
73+
"duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
74+
"result" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
75+
"failureStage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
76+
"errorType" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" }
6677
}
6778
*/
68-
[EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION]: never | undefined;
79+
[EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION]: {
80+
result: 'success' | 'error';
81+
failureStage?: string;
82+
errorType?: string;
83+
};
6984

7085
/* __GDPR__
7186
"environment_manager.registered": {
@@ -239,4 +254,15 @@ export interface IEventNamePropertyMapping {
239254
managerId: string;
240255
managerKind: 'environment' | 'package';
241256
};
257+
258+
/* __GDPR__
259+
"manager_registration.failed": {
260+
"managerName": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" },
261+
"errorType": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "owner": "eleanorjboyd" }
262+
}
263+
*/
264+
[EventNames.MANAGER_REGISTRATION_FAILED]: {
265+
managerName: string;
266+
errorType: string;
267+
};
242268
}

src/common/utils/asyncUtils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import { traceError } from '../logging';
2+
import { EventNames } from '../telemetry/constants';
3+
import { classifyError } from '../telemetry/errorClassifier';
4+
import { sendTelemetryEvent } from '../telemetry/sender';
25

36
export async function timeout(milliseconds: number): Promise<void> {
47
return new Promise<void>((resolve) => setTimeout(resolve, milliseconds));
@@ -13,5 +16,9 @@ export async function safeRegister(name: string, task: Promise<void>): Promise<v
1316
await task;
1417
} catch (error) {
1518
traceError(`Failed to register ${name} features:`, error);
19+
sendTelemetryEvent(EventNames.MANAGER_REGISTRATION_FAILED, undefined, {
20+
managerName: name,
21+
errorType: classifyError(error),
22+
});
1623
}
1724
}

src/extension.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { clearPersistentState, setPersistentState } from './common/persistentSta
1717
import { newProjectSelection } from './common/pickers/managers';
1818
import { StopWatch } from './common/stopWatch';
1919
import { EventNames } from './common/telemetry/constants';
20+
import { classifyError } from './common/telemetry/errorClassifier';
2021
import {
2122
logDiscoverySummary,
2223
sendEnvironmentToolUsageTelemetry,
@@ -522,13 +523,15 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
522523
* Below are all the contributed features using the APIs.
523524
*/
524525
setImmediate(async () => {
526+
let failureStage = 'nativeFinder';
525527
try {
526528
// This is the finder that is used by all the built in environment managers
527529
const nativeFinder: NativePythonFinder = await createNativePythonFinder(outputChannel, api, context);
528530
context.subscriptions.push(nativeFinder);
529531
const sysMgr = new SysPythonManager(nativeFinder, api, outputChannel);
530532
sysPythonManager.resolve(sysMgr);
531533
// Each manager registers independently — one failure must not block the others.
534+
failureStage = 'managerRegistration';
532535
await Promise.all([
533536
safeRegister(
534537
'system',
@@ -547,17 +550,22 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
547550
safeRegister('shellStartupVars', shellStartupVarsMgr.initialize()),
548551
]);
549552

553+
failureStage = 'envSelection';
550554
await applyInitialEnvironmentSelection(envManagers, projectManager, nativeFinder, api);
551555

552556
// Register manager-agnostic terminal watcher for package-modifying commands
557+
failureStage = 'terminalWatcher';
553558
registerTerminalPackageWatcher(api, terminalActivation, outputChannel, context.subscriptions);
554559

555560
// Register listener for interpreter settings changes for interpreter re-selection
561+
failureStage = 'settingsListener';
556562
context.subscriptions.push(
557563
registerInterpreterSettingsChangeListener(envManagers, projectManager, nativeFinder, api),
558564
);
559565

560-
sendTelemetryEvent(EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION, start.elapsedTime);
566+
sendTelemetryEvent(EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION, start.elapsedTime, {
567+
result: 'success',
568+
});
561569
try {
562570
await terminalManager.initialize(api);
563571
sendManagerSelectionTelemetry(projectManager);
@@ -574,7 +582,11 @@ export async function activate(context: ExtensionContext): Promise<PythonEnviron
574582
sendTelemetryEvent(
575583
EventNames.EXTENSION_MANAGER_REGISTRATION_DURATION,
576584
start.elapsedTime,
577-
undefined,
585+
{
586+
result: 'error',
587+
failureStage,
588+
errorType: classifyError(error),
589+
},
578590
error instanceof Error ? error : undefined,
579591
);
580592
// Show a user-friendly error message

0 commit comments

Comments
 (0)