diff --git a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts index 9d29f171179..200977b2dfa 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts @@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri'; import { getErrorMessage } from 'vs/base/common/errors'; import { ILogService } from 'vs/platform/log/common/log'; import { arch } from 'vs/base/common/process'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifier): boolean { if (a.uuid && b.uuid) { @@ -134,8 +134,8 @@ export function getLocalExtensionTelemetryData(extension: ILocalExtension): any */ export function getGalleryExtensionTelemetryData(extension: IGalleryExtension): any { return { - id: new TrustedTelemetryValue(extension.identifier.id), - name: new TrustedTelemetryValue(extension.name), + id: new TelemetryTrustedValue(extension.identifier.id), + name: new TelemetryTrustedValue(extension.name), galleryId: extension.identifier.uuid, publisherId: extension.publisherId, publisherName: extension.publisher, diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 1d1507a448f..907cc0bb6a7 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -21,7 +21,7 @@ import { ICustomEndpointTelemetryService, ITelemetryData, ITelemetryEndpoint, IT * This is because that value is "Trusted" not to contain identifiable information such as paths. * NOTE: This is used as an API type as well, and should not be changed. */ -export class TrustedTelemetryValue { +export class TelemetryTrustedValue { constructor(public readonly value: T) { } } @@ -411,7 +411,7 @@ export function cleanData(data: Record, cleanUpPatterns: RegExp[]): return cloneAndChange(data, value => { // If it's a trusted value it means it's okay to skip cleaning so we don't clean it - if (value instanceof TrustedTelemetryValue) { + if (value instanceof TelemetryTrustedValue) { return value.value; } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 48e67749ad8..23078a3cffc 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -43,7 +43,7 @@ import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; import { ExtHostUrls } from 'vs/workbench/api/common/extHostUrls'; import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview'; import { IExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; @@ -334,7 +334,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I get isNewAppInstall() { return isNewAppInstall(initData.telemetryInfo.firstSessionDate); }, - createTelemetryLogger(appender: vscode.TelemetryAppender): vscode.TelemetryLogger { + createTelemetryLogger(appender: vscode.TelemetrySender): vscode.TelemetryLogger { checkProposedApiEnabled(extension, 'telemetryLogger'); return extHostTelemetry.instantiateLogger(extension, appender); }, @@ -1394,7 +1394,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TabInputWebview: extHostTypes.WebviewEditorTabInput, TabInputTerminal: extHostTypes.TerminalEditorTabInput, TabInputInteractiveWindow: extHostTypes.InteractiveWindowInput, - TrustedTelemetryValue: TrustedTelemetryValue, + TelemetryTrustedValue: TelemetryTrustedValue, LogLevel: LogLevel, EditSessionIdentityMatch: EditSessionIdentityMatch }; diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index e6912dfea03..6d30280527f 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -27,7 +27,7 @@ import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/ import { toErrorMessage } from 'vs/base/common/errorMessage'; import { StopWatch } from 'vs/base/common/stopwatch'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; interface CommandHandler { callback: Function; @@ -274,7 +274,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { } type ExtensionActionTelemetry = { extensionId: string; - id: TrustedTelemetryValue; + id: TelemetryTrustedValue; duration: number; }; type ExtensionActionTelemetryMeta = { @@ -286,7 +286,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { }; this.#telemetry.$publicLog2('Extension:ActionExecuted', { extensionId: command.extension.identifier.value, - id: new TrustedTelemetryValue(id), + id: new TelemetryTrustedValue(id), duration: duration, }); } diff --git a/src/vs/workbench/api/common/extHostTelemetry.ts b/src/vs/workbench/api/common/extHostTelemetry.ts index 1a539f21056..2f0abb016cc 100644 --- a/src/vs/workbench/api/common/extHostTelemetry.ts +++ b/src/vs/workbench/api/common/extHostTelemetry.ts @@ -52,10 +52,10 @@ export class ExtHostTelemetry implements ExtHostTelemetryShape { }; } - instantiateLogger(extension: IExtensionDescription, appender: vscode.TelemetryAppender, options?: vscode.TelemetryInitializationOptions) { + instantiateLogger(extension: IExtensionDescription, sender: vscode.TelemetrySender, options?: vscode.TelemetryLoggerOptions) { const telemetryDetails = this.getTelemetryDetails(); const logger = new ExtHostTelemetryLogger( - appender, + sender, options, extension, this._outputLogger, @@ -128,7 +128,7 @@ export class ExtHostTelemetry implements ExtHostTelemetryShape { } export class ExtHostTelemetryLogger { - private _appender: vscode.TelemetryAppender; + private _appender: vscode.TelemetrySender; private readonly _onDidChangeEnableStates = new Emitter(); private _telemetryEnablements: { isUsageEnabled: boolean; isErrorsEnabled: boolean }; private _apiObject: vscode.TelemetryLogger | undefined; @@ -136,8 +136,8 @@ export class ExtHostTelemetryLogger { private readonly _additionalCommonProperties: Record | undefined; public readonly ignoreUnhandledExtHostErrors: boolean; constructor( - appender: vscode.TelemetryAppender, - options: vscode.TelemetryInitializationOptions | undefined, + sender: vscode.TelemetrySender, + options: vscode.TelemetryLoggerOptions | undefined, private readonly _extension: IExtensionDescription, private readonly _logger: ILogger, private readonly _inLoggingOnlyMode: boolean, @@ -147,7 +147,7 @@ export class ExtHostTelemetryLogger { this.ignoreUnhandledExtHostErrors = options?.ignoreUnhandledErrors ?? false; this._ignoreBuiltinCommonProperties = options?.ignoreBuiltInCommonProperties ?? false; this._additionalCommonProperties = options?.additionalCommonProperties; - this._appender = appender; + this._appender = sender; this._telemetryEnablements = { isUsageEnabled: telemetryEnablements.isUsageEnabled, isErrorsEnabled: telemetryEnablements.isErrorsEnabled }; } @@ -192,7 +192,7 @@ export class ExtHostTelemetryLogger { } data = this.mixInCommonPropsAndCleanData(data || {}); if (!this._inLoggingOnlyMode) { - this._appender.logEvent(eventName, data); + this._appender.sendEventData(eventName, data); } this._logger.trace(eventName, data); } @@ -212,7 +212,7 @@ export class ExtHostTelemetryLogger { this.logEvent(eventNameOrException, data); } else { // TODO @lramos15, implement cleaning for and logging for this case - this._appender.logError(eventNameOrException, data); + this._appender.sendErrorData(eventNameOrException, data); } } diff --git a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts index 202d9441f4e..c52a59303d2 100644 --- a/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts +++ b/src/vs/workbench/api/test/browser/extHostTelemetry.test.ts @@ -13,7 +13,7 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData import { ExtHostTelemetry } from 'vs/workbench/api/common/extHostTelemetry'; import { IEnvironment } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { mock } from 'vs/workbench/test/common/workbenchTestServices'; -import type { TelemetryAppender } from 'vscode'; +import type { TelemetrySender } from 'vscode'; interface TelemetryLoggerSpy { dataArr: any[]; @@ -75,11 +75,11 @@ suite('ExtHostTelemetry', function () { const createLogger = (functionSpy: TelemetryLoggerSpy, extHostTelemetry?: ExtHostTelemetry) => { const extensionTelemetry = extHostTelemetry ?? createExtHostTelemetry(); // This is the appender which the extension would contribute - const appender: TelemetryAppender = { - logEvent: (eventName: string, data) => { + const appender: TelemetrySender = { + sendEventData: (eventName: string, data) => { functionSpy.dataArr.push({ eventName, data }); }, - logError: (exception, data) => { + sendErrorData: (exception, data) => { functionSpy.exceptionArr.push({ exception, data }); }, flush: () => { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index a8f0d1b8b50..5e4a3013f58 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -52,7 +52,7 @@ import { URI } from 'vs/base/common/uri'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { isLinux, isMacintosh, isNative, isWindows } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; import { defaultProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; import { IBoundarySashes } from 'vs/base/browser/ui/sash/sash'; import { EditorGroupWatermark } from 'vs/workbench/browser/parts/editor/editorGroupWatermark'; @@ -644,7 +644,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { // Remove query parameters from the resource extension const queryStringLocation = resourceExt.indexOf('?'); resourceExt = queryStringLocation !== -1 ? resourceExt.substr(0, queryStringLocation) : resourceExt; - descriptor['resource'] = { mimeType: new TrustedTelemetryValue(getMimeTypes(resource).join(', ')), scheme: resource.scheme, ext: resourceExt, path: hash(path) }; + descriptor['resource'] = { mimeType: new TelemetryTrustedValue(getMimeTypes(resource).join(', ')), scheme: resource.scheme, ext: resourceExt, path: hash(path) }; /* __GDPR__FRAGMENT__ "EditorTelemetryDescriptor" : { diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 6e7a33f8c14..be6c1db1a1f 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -68,7 +68,7 @@ import { addExternalEditorsDropData, toVSDataTransfer } from 'vs/editor/browser/ import { CheckboxStateHandler, TreeItemCheckbox } from 'vs/workbench/browser/parts/views/checkbox'; import { setTimeout0 } from 'vs/base/common/platform'; import { AriaRole } from 'vs/base/browser/ui/aria/aria'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; export class TreeViewPane extends ViewPane { @@ -1464,7 +1464,7 @@ export class CustomTreeView extends AbstractTreeView { protected activate() { if (!this.activated) { type ExtensionViewTelemetry = { - extensionId: TrustedTelemetryValue; + extensionId: TelemetryTrustedValue; id: string; }; type ExtensionViewTelemetryMeta = { @@ -1474,7 +1474,7 @@ export class CustomTreeView extends AbstractTreeView { comment: 'Helps to gain insights on what extension contributed views are most popular'; }; this.telemetryService.publicLog2('Extension:ViewActivate', { - extensionId: new TrustedTelemetryValue(this.extensionId), + extensionId: new TelemetryTrustedValue(this.extensionId), id: this.id, }); this.createTree(); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 514a45c4dab..0ba487e766c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -48,7 +48,7 @@ import { ExtensionEditor } from 'vs/workbench/contrib/extensions/browser/extensi import { isWeb, language } from 'vs/base/common/platform'; import { getLocale } from 'vs/platform/languagePacks/common/languagePacks'; import { ILocaleService } from 'vs/workbench/contrib/localization/common/locale'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; interface IExtensionStateProvider { @@ -56,7 +56,7 @@ interface IExtensionStateProvider { } interface InstalledExtensionsEvent { - readonly extensionIds: TrustedTelemetryValue; + readonly extensionIds: TelemetryTrustedValue; readonly count: number; } type ExtensionsLoadClassification = { @@ -829,7 +829,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension (extension.enablementState === EnablementState.EnabledWorkspace || extension.enablementState === EnablementState.EnabledGlobally)) .map(extension => ExtensionIdentifier.toKey(extension.identifier.id)); - this.telemetryService.publicLog2('installedExtensions', { extensionIds: new TrustedTelemetryValue(extensionIds.join(';')), count: extensionIds.length }); + this.telemetryService.publicLog2('installedExtensions', { extensionIds: new TelemetryTrustedValue(extensionIds.join(';')), count: extensionIds.length }); } private async onDidChangeRunningExtensions(added: ReadonlyArray, removed: ReadonlyArray): Promise { diff --git a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts index f7f0e34fe3e..1b4ad1bc098 100644 --- a/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts +++ b/src/vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts @@ -15,7 +15,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { language } from 'vs/base/common/platform'; import { Disposable } from 'vs/base/common/lifecycle'; import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry'; -import { configurationTelemetry, TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { configurationTelemetry, TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ITextFileService, ITextFileSaveEvent, ITextFileResolveEvent } from 'vs/workbench/services/textfile/common/textfiles'; import { extname, basename, isEqual, isEqualOrParent } from 'vs/base/common/resources'; @@ -28,7 +28,7 @@ import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; type TelemetryData = { - mimeType: TrustedTelemetryValue; + mimeType: TelemetryTrustedValue; ext: string; path: number; reason?: number; @@ -216,7 +216,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr const fileName = basename(resource); const path = resource.scheme === Schemas.file ? resource.fsPath : resource.path; const telemetryData = { - mimeType: new TrustedTelemetryValue(getMimeTypes(resource).join(', ')), + mimeType: new TelemetryTrustedValue(getMimeTypes(resource).join(', ')), ext, path: hash(path), reason, diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index ef94656dbaf..e7490ecddd5 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -17,7 +17,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { StopWatch } from 'vs/base/common/stopwatch'; -import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils'; +import { TelemetryTrustedValue } from 'vs/platform/telemetry/common/telemetryUtils'; /* __GDPR__FRAGMENT__ "IMemoryInfo" : { @@ -584,7 +584,7 @@ export abstract class AbstractTimerService implements ITimerService { // event and it is "normalized" to a relative timestamp where the first mark // defines the start - type Mark = { source: string; name: TrustedTelemetryValue; startTime: number }; + type Mark = { source: string; name: TelemetryTrustedValue; startTime: number }; type MarkClassification = { owner: 'jrieken'; comment: 'Information about a performance marker'; @@ -596,7 +596,7 @@ export abstract class AbstractTimerService implements ITimerService { for (const mark of marks) { this._telemetryService.publicLog2('startup.timer.mark', { source, - name: new TrustedTelemetryValue(mark.name), + name: new TelemetryTrustedValue(mark.name), startTime: mark.startTime }); } diff --git a/src/vscode-dts/vscode.proposed.telemetryLogger.d.ts b/src/vscode-dts/vscode.proposed.telemetryLogger.d.ts index 5e8dd061963..754d30743ef 100644 --- a/src/vscode-dts/vscode.proposed.telemetryLogger.d.ts +++ b/src/vscode-dts/vscode.proposed.telemetryLogger.d.ts @@ -9,90 +9,148 @@ declare module 'vscode' { * A special value wrapper denoting a value that is safe to not clean. * This is to be used when you can guarantee no identifiable information is contained in the value and the cleaning is improperly redacting it. */ - export class TrustedTelemetryValue { + export class TelemetryTrustedValue { readonly value: T; + constructor(value: T); } - export interface TelemetryInitializationOptions { - /** - * Whether or not you want to avoid having the built-in common properties such as os, extension name, etc injected into the data object. - * Defaults to false if not defined. - */ - readonly ignoreBuiltInCommonProperties?: boolean; - - /** - * Any additional common properties which should be injected into the data object. - */ - readonly additionalCommonProperties?: Record; - - /** - * Whether or not unhandled errors on the extension host caused by your extension should be logged to your appender. - * Defaults to false if not defined. - */ - readonly ignoreUnhandledErrors?: boolean; - } - + /** + * A telemetry logger which can be used by extensions to log usage and error telementry. + * + * A logger wraps around an {@link TelemetrySender appender} but it guarantees that + * - user settings to disable or tweak telemetry are respected, and that + * - potential sensitive data is removed + * + * It also enables an "echo UI" that prints whatever data is send and it allows the editor + * to forward unhandled errors to the respective extensions. + * + * To get an instance of a `TelemetryLogger`, use + * {@link env.createTelemetryLogger `createTelemetryLogger`}. + */ export interface TelemetryLogger { + + /** + * An {@link Event} which fires when the enablement state of usage or error telemetry changes. + */ readonly onDidChangeEnableStates: Event; + + /** + * Whether or not usage telemetry is enabled for this logger. + */ readonly isUsageEnabled: boolean; + + /** + * Whether or not error telemetry is enabled for this logger. + */ readonly isErrorsEnabled: boolean; /** + * Log a usage event. + * * After completing cleaning, telemetry setting checks, and data mix-in calls `TelemetryAppender.logEvent` to log the event. * Automatically supports echoing to extension telemetry output channel. * @param eventName The event name to log * @param data The data to log */ - logUsage(eventName: string, data?: Record): void; + logUsage(eventName: string, data?: Record): void; /** + * Log an error event. + * * After completing cleaning, telemetry setting checks, and data mix-in calls `TelemetryAppender.logEvent` to log the event. Differs from `logUsage` in that it will log the event if the telemetry setting is Error+. * Automatically supports echoing to extension telemetry output channel. * @param eventName The event name to log * @param data The data to log */ - logError(eventName: string, data?: Record): void; + logError(eventName: string, data?: Record): void; /** + * Log an error event. + * * Calls `TelemetryAppender.logException`. Does cleaning, telemetry checks, and data mix-in. * Automatically supports echoing to extension telemetry output channel. * Will also automatically log any exceptions thrown within the extension host process. * @param error The error object which contains the stack trace cleaned of PII * @param data Additional data to log alongside the stack trace */ - logError(error: Error, data?: Record): void; + logError(error: Error, data?: Record): void; + /** + * Dispose this object and free resources. + */ dispose(): void; } - export interface TelemetryAppender { + /** + * The telemetry sender is the contract between a telemetry logger and some telemetry service. **Note** that extensions must NOT + * call the methods of their sender directly as the logger provides extra guards and cleaning. + * + * ```js + * const appender: vscode.TelemetrySender = {...}; + * const logger = vscode.env.createTelemetryLogger(appender); + * + * // GOOD - uses the logger + * logger.logUsage('myEvent', { myData: 'myValue' }); + * + * // BAD - uses the appender directly: no data cleansing, ignores user settings, no echoing to the telemetry output channel etc + * appender.logEvent('myEvent', { myData: 'myValue' }); + * ``` + */ + export interface TelemetrySender { /** - * User-defined function which logs an event, used within the TelemetryLogger + * Function to send event data without a stacktrace. Used within a {@link TelemetryLogger} + * * @param eventName The name of the event which you are logging * @param data A serializable key value pair that is being logged */ - logEvent(eventName: string, data?: Record): void; + sendEventData(eventName: string, data?: Record): void; /** - * User-defined function which logs an error, used within the TelemetryLogger + * Function to send an error. Used within a {@link TelemetryLogger} + * * @param error The error being logged * @param data Any additional data to be collected with the exception */ - logError(error: Error, data?: Record): void; + sendErrorData(error: Error, data?: Record): void; /** - * Optional flush function which will give your appender one last chance to send any remaining events as the TelemetryLogger is being disposed + * Optional flush function which will give this sender a chance to send any remaining events + * as its {@link TelemetryLogger} is being disposed */ flush?(): void | Thenable; } + /** + * Options for creating a {@link TelemetryLogger} + */ + export interface TelemetryLoggerOptions { + /** + * Whether or not you want to avoid having the built-in common properties such as os, extension name, etc injected into the data object. + * Defaults to `false` if not defined. + */ + readonly ignoreBuiltInCommonProperties?: boolean; + + /** + * Whether or not unhandled errors on the extension host caused by your extension should be logged to your appender. + * Defaults to `false` if not defined. + */ + readonly ignoreUnhandledErrors?: boolean; + + /** + * Any additional common properties which should be injected into the data object. + */ + readonly additionalCommonProperties?: Record; + } + export namespace env { /** - * A wrapper around a TelemetryAppender which provides built-in setting checks, common properties, data cleaning, output channel logging, and internal ext host process exception catching. - * @param appender The core piece which we call when it is time to log telemetry. It is highly recommended that you don't call the methods within the appender directly as the logger provides extra guards and cleaning. - * @returns An instantiated telemetry logger which you can use for recording telemetry + * Creates a new {@link TelemetryLogger telemetry logger}. + * + * @param sender The telemetry sender that is used by the telemetry logger. + * @param options Options for the telementry logger. + * @returns A new telemetry logger */ - export function createTelemetryLogger(appender: TelemetryAppender, options?: TelemetryInitializationOptions): TelemetryLogger; + export function createTelemetryLogger(sender: TelemetrySender, options?: TelemetryLoggerOptions): TelemetryLogger; } }