KEMBAR78
Improve extensions telemetry API · Issue #160090 · microsoft/vscode · GitHub
Skip to content

Improve extensions telemetry API #160090

@jrieken

Description

@jrieken

In todays API there are some symbols that help extensions with telemetry, e.g machineId, sessionId, and most importantly isTelemetryEnabled. These are used by our telemetry module and by others.

The existing APIs help you to get the job done but offer little quality of life, aren't always easy to use, and lack hooks that we would like for transparency and cleansing. Our goal is to make it easy for extensions to do the right thing and to be transparent to our user what's happening.

Below is an alternative API that is around a TelemetryLogger and TelemetryAppender. The appender is what does the actual data collecting but it should be used through a logger. With that "indirection" we can do many nice things:

  • we can do extra PII cleansing for extensions, e.g remove everything that looks like path-name, URI, user-name etc
  • we can enable/disable telemetry per extension
  • we echo everything that is logged to the telemetry output channel
  • we check enablements: logger.logUsage() -> setting say NO ⛔ -> we don't call appender
  • we can call logError on provider-errors and unhandled extension errors (superseeding Allow extensions to provide a global error handler for errors in extension code #45264)
declare module 'vscode' {

	export interface TelemetryLogger {
		readonly onDidChangeEnableStates: Event<TelemetryLogger>;
		readonly isUsageEnabled: boolean;
		readonly isErrorsEnabled: boolean;

                // calls TelemetryAppender#logUsage iff usage telemetry is enabled, echos data to output channel
                // called by extension
		logUsage(...args: any[]): void;

                // calls TelemetryAppender#logError iff error telemetry is enabled, echos data to output channel
                // called by extension
                // ALSO called by VS Code when the owning extension throws, e.g provider or command errors
		logError(err: Error): void;
	}

	export interface TelemetryAppender {
		logUsage(...args: any[]): void;
		logError(err: Error): void;
	}

	export namespace env {
		// BYOTA
		export function createTelemetryLogger(appender: TelemetryAppender): TelemetryLogger;
	}
}

The vscode-extension-telemetry-module would become an instance of a telemetry appender.

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions