diff --git a/src/extension.ts b/src/extension.ts index ee64e53c31..167e77e3f5 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -61,7 +61,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void> } const manifest = context.extension.packageJSON; - reporter = new TelemetryReporter(context.extension.id, manifest.version, manifest.appInsightsKey); + reporter = new TelemetryReporter(manifest.appInsightsKey); context.subscriptions.push(reporter); // always register commands needed to control terraform-ls @@ -102,7 +102,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<void> initializationFailedHandler: (error: ResponseError<InitializeError> | Error) => { initializationError = error; - reporter.sendTelemetryException(error); + reporter.sendTelemetryErrorEvent('initializationError', { + message: error.message, + stack: error.stack, + code: error instanceof ResponseError ? error.code.toString() : undefined, + }); let msg = 'Failure to start terraform-ls. Please check your configuration settings and reload this window'; @@ -235,12 +239,17 @@ export async function deactivate(): Promise<void> { } catch (error) { if (error instanceof Error) { outputChannel.appendLine(error.message); - reporter.sendTelemetryException(error); + reporter.sendTelemetryErrorEvent('deactivate', { + message: error.message, + stack: error.stack, + }); vscode.window.showErrorMessage(error.message); lsStatus.setLanguageServerState(error.message, false, vscode.LanguageStatusSeverity.Error); } else if (typeof error === 'string') { outputChannel.appendLine(error); - reporter.sendTelemetryException(new Error(error)); + reporter.sendTelemetryErrorEvent('deactivate', { + message: error, + }); vscode.window.showErrorMessage(error); lsStatus.setLanguageServerState(error, false, vscode.LanguageStatusSeverity.Error); } diff --git a/src/features/telemetry.ts b/src/features/telemetry.ts index 02197a42cd..57f44892e4 100644 --- a/src/features/telemetry.ts +++ b/src/features/telemetry.ts @@ -52,7 +52,11 @@ export class TelemetryFeature implements StaticFeature { return; } - this.reporter.sendRawTelemetryEvent(event.name, event.properties); + const thing: Record<string, string> = {}; + for (const [key, value] of Object.entries(event.properties)) { + thing[key] = String(value); + } + this.reporter.sendRawTelemetryEvent(event.name, thing); }), ); } diff --git a/src/providers/tfc/applyProvider.ts b/src/providers/tfc/applyProvider.ts index 8d5a7019dd..8d54729d1f 100644 --- a/src/providers/tfc/applyProvider.ts +++ b/src/providers/tfc/applyProvider.ts @@ -164,7 +164,10 @@ export class ApplyTreeDataProvider implements vscode.TreeDataProvider<vscode.Tre if (error instanceof Error) { message += error.message; vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('applyLogError', { + message: message, + stack: error.stack, + }); return; } diff --git a/src/providers/tfc/authenticationProvider.ts b/src/providers/tfc/authenticationProvider.ts index a17b24e274..eeaaef1e11 100644 --- a/src/providers/tfc/authenticationProvider.ts +++ b/src/providers/tfc/authenticationProvider.ts @@ -93,10 +93,16 @@ class TerraformCloudSessionHandler { if ((error.response.status as number) === 401) { throw new InvalidToken(); } - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('storeSession', { + message: error.message, + stack: error.stack, + }); throw new Error(`Failed to login: ${apiErrorsToString(error.response.data.errors)}`); } else if (error instanceof Error) { - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('storeSession', { + message: error.message, + stack: error.stack, + }); } throw error; @@ -243,11 +249,16 @@ export class TerraformCloudAuthenticationProvider implements vscode.Authenticati return this.createSession(_scopes); } else if (error instanceof Error) { vscode.window.showErrorMessage(error.message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('invalidHCPToken', { + message: error.message, + stack: error.stack, + }); this.logger.error(error.message); } else if (typeof error === 'string') { vscode.window.showErrorMessage(error); - this.reporter.sendTelemetryException(new Error(error)); + this.reporter.sendTelemetryErrorEvent('invalidHCPToken', { + message: error, + }); this.logger.error(error); } diff --git a/src/providers/tfc/organizationPicker.ts b/src/providers/tfc/organizationPicker.ts index 6785a5d1c8..c4d332f06c 100644 --- a/src/providers/tfc/organizationPicker.ts +++ b/src/providers/tfc/organizationPicker.ts @@ -100,10 +100,16 @@ export class OrganizationAPIResource implements APIResource { return picks; } else if (isErrorFromAlias(apiClient.api, 'listOrganizations', error)) { message += apiErrorsToString(error.response.data.errors); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('orgranizationFetchError', { + message: message, + stack: error.stack, + }); } else if (error instanceof Error) { message += error.message; - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('orgranizationFetchError', { + message: message, + stack: error.stack, + }); } else if (typeof error === 'string') { message += error; } diff --git a/src/providers/tfc/planProvider.ts b/src/providers/tfc/planProvider.ts index 506906bf37..33e145c511 100644 --- a/src/providers/tfc/planProvider.ts +++ b/src/providers/tfc/planProvider.ts @@ -186,7 +186,10 @@ export class PlanTreeDataProvider implements vscode.TreeDataProvider<vscode.Tree if (error instanceof Error) { message += error.message; vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('planLogError', { + message: message, + stack: error.stack, + }); return; } diff --git a/src/providers/tfc/runProvider.ts b/src/providers/tfc/runProvider.ts index 9ab3148e7f..5e92456220 100644 --- a/src/providers/tfc/runProvider.ts +++ b/src/providers/tfc/runProvider.ts @@ -187,7 +187,10 @@ export class RunTreeDataProvider implements vscode.TreeDataProvider<TFCRunTreeIt if (isErrorFromAlias(apiClient.api, 'listRuns', error)) { message += apiErrorsToString(error.response.data.errors); vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('runProviderError', { + message: message, + stack: error.stack, + }); return []; } } @@ -195,7 +198,10 @@ export class RunTreeDataProvider implements vscode.TreeDataProvider<TFCRunTreeIt if (error instanceof Error) { message += error.message; vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('runProviderError', { + message: message, + stack: error.stack, + }); return []; } diff --git a/src/providers/tfc/uiHelpers.ts b/src/providers/tfc/uiHelpers.ts index 16c9997b1a..4034774cbb 100644 --- a/src/providers/tfc/uiHelpers.ts +++ b/src/providers/tfc/uiHelpers.ts @@ -82,7 +82,10 @@ export async function handleZodiosError( outputChannel: vscode.OutputChannel, reporter: TelemetryReporter, ) { - reporter.sendTelemetryException(error); + reporter.sendTelemetryErrorEvent('zodiosError', { + message: error.message, + stack: error.stack, + }); outputChannel.append(JSON.stringify({ cause: error.cause }, undefined, 2)); const chosenItem = await vscode.window.showErrorMessage( `${msgPrefix} Response validation failed. Please report this as a bug.`, diff --git a/src/providers/tfc/workspaceFilters.ts b/src/providers/tfc/workspaceFilters.ts index 2b3ea5a6e9..2ef4a22837 100644 --- a/src/providers/tfc/workspaceFilters.ts +++ b/src/providers/tfc/workspaceFilters.ts @@ -80,10 +80,16 @@ export class ProjectsAPIResource implements APIResource { return picks; } else if (isErrorFromAlias(apiClient.api, 'listProjects', error)) { message += apiErrorsToString(error.response.data.errors); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('projectWorkspaceFetchError', { + message: message, + stack: error.stack, + }); } else if (error instanceof Error) { message += error.message; - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('projectWorkspaceFetchError', { + message: message, + stack: error.stack, + }); } else if (typeof error === 'string') { message += error; } diff --git a/src/providers/tfc/workspaceProvider.ts b/src/providers/tfc/workspaceProvider.ts index 35b339804e..69fc955452 100644 --- a/src/providers/tfc/workspaceProvider.ts +++ b/src/providers/tfc/workspaceProvider.ts @@ -258,7 +258,10 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<vscode ) { message += apiErrorsToString(error.response.data.errors); vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('workspaceProviderError', { + message: message, + stack: error.stack, + }); return []; } } @@ -266,7 +269,10 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<vscode if (error instanceof Error) { message += error.message; vscode.window.showErrorMessage(message); - this.reporter.sendTelemetryException(error); + this.reporter.sendTelemetryErrorEvent('workspaceProviderError', { + message: message, + stack: error.stack, + }); return []; } diff --git a/src/utils/vscode.ts b/src/utils/vscode.ts index 4b82f8d73c..ec2705176d 100644 --- a/src/utils/vscode.ts +++ b/src/utils/vscode.ts @@ -83,10 +83,15 @@ export async function handleLanguageClientStartError( return; } else if (error instanceof Error) { message = error.message; - reporter.sendTelemetryException(error); + reporter.sendTelemetryErrorEvent('extensionStartError', { + message: message, + stack: error.stack, + }); } else if (typeof error === 'string') { message = error; - reporter.sendTelemetryException(new Error(error)); + reporter.sendTelemetryErrorEvent('extensionStartError', { + message: error, + }); } if (message === 'INVALID_URI_WSL') { diff --git a/src/web/extension.ts b/src/web/extension.ts index 5e2659c61b..ca72cf3459 100644 --- a/src/web/extension.ts +++ b/src/web/extension.ts @@ -12,7 +12,7 @@ let reporter: TelemetryReporter; export function activate(context: vscode.ExtensionContext) { const manifest = context.extension.packageJSON; - reporter = new TelemetryReporter(context.extension.id, manifest.version, manifest.appInsightsKey); + reporter = new TelemetryReporter(manifest.appInsightsKey); context.subscriptions.push(reporter); context.subscriptions.push(outputChannel);