From 6d5752bd0cdd5db790dcdf053d6e1ef1dc6f4537 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Mon, 10 Nov 2025 16:21:14 -0500 Subject: [PATCH] Cleanup some eslint exemptions (#276581) * Cleanup some eslint exemptions * Fix test * More test fix --- eslint.config.js | 12 ------ .../platform/telemetry/browser/1dsAppender.ts | 2 +- .../platform/telemetry/common/1dsAppender.ts | 12 +++--- .../platform/telemetry/common/gdprTypings.ts | 2 +- src/vs/platform/telemetry/common/telemetry.ts | 2 +- .../platform/telemetry/common/telemetryIpc.ts | 11 ++--- .../telemetry/common/telemetryLogAppender.ts | 2 +- .../telemetry/common/telemetryService.ts | 4 +- .../telemetry/common/telemetryUtils.ts | 22 ++++++---- src/vs/platform/telemetry/node/1dsAppender.ts | 6 +-- .../platform/telemetry/node/errorTelemetry.ts | 6 +-- .../workbench/api/common/extHostTelemetry.ts | 17 +++++--- .../browser/parts/editor/editorGroupView.ts | 4 +- .../test/browser/commonProperties.test.ts | 26 ++++++------ .../test/node/commonProperties.test.ts | 42 ++++++++++--------- .../services/timer/browser/timerService.ts | 4 +- 16 files changed, 88 insertions(+), 86 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index eae21581059..8ef6af01ba0 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -249,7 +249,6 @@ export default tseslint.config( 'src/vs/workbench/api/common/extHostNotebookKernels.ts', 'src/vs/workbench/api/common/extHostQuickOpen.ts', 'src/vs/workbench/api/common/extHostRequireInterceptor.ts', - 'src/vs/workbench/api/common/extHostTelemetry.ts', 'src/vs/workbench/api/common/extHostTypeConverters.ts', 'src/vs/workbench/api/common/extHostTypes.ts', 'src/vs/workbench/api/node/loopbackServer.ts', @@ -341,8 +340,6 @@ export default tseslint.config( 'src/vs/workbench/services/preferences/common/preferencesValidation.ts', 'src/vs/workbench/services/remote/common/tunnelModel.ts', 'src/vs/workbench/services/search/common/textSearchManager.ts', - 'src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts', - 'src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts', 'src/vs/workbench/test/browser/workbenchTestServices.ts', 'test/automation/src/playwrightDriver.ts', '.eslint-plugin-local/**/*', @@ -524,18 +521,9 @@ export default tseslint.config( 'src/vs/platform/request/common/requestIpc.ts', 'src/vs/platform/request/electron-utility/requestService.ts', 'src/vs/platform/request/node/proxy.ts', - 'src/vs/platform/telemetry/browser/1dsAppender.ts', 'src/vs/platform/telemetry/browser/errorTelemetry.ts', - 'src/vs/platform/telemetry/common/1dsAppender.ts', 'src/vs/platform/telemetry/common/errorTelemetry.ts', - 'src/vs/platform/telemetry/common/gdprTypings.ts', 'src/vs/platform/telemetry/common/remoteTelemetryChannel.ts', - 'src/vs/platform/telemetry/common/telemetry.ts', - 'src/vs/platform/telemetry/common/telemetryIpc.ts', - 'src/vs/platform/telemetry/common/telemetryLogAppender.ts', - 'src/vs/platform/telemetry/common/telemetryService.ts', - 'src/vs/platform/telemetry/common/telemetryUtils.ts', - 'src/vs/platform/telemetry/node/1dsAppender.ts', 'src/vs/platform/telemetry/node/errorTelemetry.ts', 'src/vs/platform/theme/common/iconRegistry.ts', 'src/vs/platform/theme/common/tokenClassificationRegistry.ts', diff --git a/src/vs/platform/telemetry/browser/1dsAppender.ts b/src/vs/platform/telemetry/browser/1dsAppender.ts index 99792303d01..184da1d0a9a 100644 --- a/src/vs/platform/telemetry/browser/1dsAppender.ts +++ b/src/vs/platform/telemetry/browser/1dsAppender.ts @@ -10,7 +10,7 @@ export class OneDataSystemWebAppender extends AbstractOneDataSystemAppender { constructor( isInternalTelemetry: boolean, eventPrefix: string, - defaultData: { [key: string]: any } | null, + defaultData: { [key: string]: unknown } | null, iKeyOrClientFactory: string | (() => IAppInsightsCore), // allow factory function for testing ) { super(isInternalTelemetry, eventPrefix, defaultData, iKeyOrClientFactory); diff --git a/src/vs/platform/telemetry/common/1dsAppender.ts b/src/vs/platform/telemetry/common/1dsAppender.ts index 59a0dadcb7d..0daaabd02b5 100644 --- a/src/vs/platform/telemetry/common/1dsAppender.ts +++ b/src/vs/platform/telemetry/common/1dsAppender.ts @@ -57,7 +57,7 @@ async function getClient(instrumentationKey: string, addInternalFlag?: boolean, appInsightsCore.initialize(coreConfig, []); - appInsightsCore.addTelemetryInitializer((envelope: any) => { + appInsightsCore.addTelemetryInitializer((envelope) => { // Opt the user out of 1DS data sharing envelope['ext'] = envelope['ext'] ?? {}; envelope['ext']['web'] = envelope['ext']['web'] ?? {}; @@ -84,7 +84,7 @@ export abstract class AbstractOneDataSystemAppender implements ITelemetryAppende constructor( private readonly _isInternalTelemetry: boolean, private _eventPrefix: string, - private _defaultData: { [key: string]: any } | null, + private _defaultData: { [key: string]: unknown } | null, iKeyOrClientFactory: string | (() => IAppInsightsCore), // allow factory function for testing private _xhrOverride?: IXHROverride ) { @@ -125,20 +125,20 @@ export abstract class AbstractOneDataSystemAppender implements ITelemetryAppende ); } - log(eventName: string, data?: any): void { + log(eventName: string, data?: unknown): void { if (!this._aiCoreOrKey) { return; } data = mixin(data, this._defaultData); - data = validateTelemetryData(data); + const validatedData = validateTelemetryData(data); const name = this._eventPrefix + '/' + eventName; try { this._withAIClient((aiClient) => { - aiClient.pluginVersionString = data?.properties.version ?? 'Unknown'; + aiClient.pluginVersionString = validatedData?.properties.version ?? 'Unknown'; aiClient.track({ name, - baseData: { name, properties: data?.properties, measurements: data?.measurements } + baseData: { name, properties: validatedData?.properties, measurements: validatedData?.measurements } }); }); } catch { } diff --git a/src/vs/platform/telemetry/common/gdprTypings.ts b/src/vs/platform/telemetry/common/gdprTypings.ts index 20638f84273..36a34a4daba 100644 --- a/src/vs/platform/telemetry/common/gdprTypings.ts +++ b/src/vs/platform/telemetry/common/gdprTypings.ts @@ -21,7 +21,7 @@ type IGDPRPropertyWithoutMetadata = Omit = Omit; export type ClassifiedEvent = { - [k in keyof T]: any + [k in keyof T]: unknown; }; export type StrictPropertyChecker = keyof TEvent extends keyof OmitMetadata ? keyof OmitMetadata extends keyof TEvent ? TEvent : TError : TError; diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index 5f82501a81e..11fd408cda0 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -11,7 +11,7 @@ export const ITelemetryService = createDecorator('telemetrySe export interface ITelemetryData { from?: string; target?: string; - [key: string]: any; + [key: string]: string | unknown | undefined; } export interface ITelemetryService { diff --git a/src/vs/platform/telemetry/common/telemetryIpc.ts b/src/vs/platform/telemetry/common/telemetryIpc.ts index 64eaed7d289..f43064678f5 100644 --- a/src/vs/platform/telemetry/common/telemetryIpc.ts +++ b/src/vs/platform/telemetry/common/telemetryIpc.ts @@ -5,11 +5,12 @@ import { Event } from '../../../base/common/event.js'; import { IChannel, IServerChannel } from '../../../base/parts/ipc/common/ipc.js'; +import { ITelemetryData } from './telemetry.js'; import { ITelemetryAppender } from './telemetryUtils.js'; export interface ITelemetryLog { eventName: string; - data?: any; + data?: ITelemetryData; } export class TelemetryAppenderChannel implements IServerChannel { @@ -20,9 +21,9 @@ export class TelemetryAppenderChannel implements IServerChannel { throw new Error(`Event not found: ${event}`); } - call(_: unknown, command: string, { eventName, data }: ITelemetryLog): Promise { - this.appenders.forEach(a => a.log(eventName, data)); - return Promise.resolve(null); + call(_: unknown, command: string, { eventName, data }: ITelemetryLog) { + this.appenders.forEach(a => a.log(eventName, data ?? {})); + return Promise.resolve(null as unknown as T); } } @@ -30,7 +31,7 @@ export class TelemetryAppenderClient implements ITelemetryAppender { constructor(private channel: IChannel) { } - log(eventName: string, data?: any): any { + log(eventName: string, data?: unknown): unknown { this.channel.call('log', { eventName, data }) .then(undefined, err => `Failed to log telemetry: ${console.warn(err)}`); diff --git a/src/vs/platform/telemetry/common/telemetryLogAppender.ts b/src/vs/platform/telemetry/common/telemetryLogAppender.ts index f41ab3bd097..63683618396 100644 --- a/src/vs/platform/telemetry/common/telemetryLogAppender.ts +++ b/src/vs/platform/telemetry/common/telemetryLogAppender.ts @@ -44,7 +44,7 @@ export class TelemetryLogAppender extends Disposable implements ITelemetryAppend return Promise.resolve(); } - log(eventName: string, data: any): void { + log(eventName: string, data: unknown): void { this.logger.trace(`${this.prefix}telemetry/${eventName}`, validateTelemetryData(data)); } } diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index e26d733e98e..df5658c8258 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -132,13 +132,13 @@ export class TelemetryService implements ITelemetryService { data = mixin(data, this._experimentProperties); // remove all PII from data - data = cleanData(data as Record, this._cleanupPatterns); + data = cleanData(data, this._cleanupPatterns); // add common properties data = mixin(data, this._commonProperties); // Log to the appenders of sufficient level - this._appenders.forEach(a => a.log(eventName, data)); + this._appenders.forEach(a => a.log(eventName, data ?? {})); } publicLog(eventName: string, data?: ITelemetryData) { diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 0f3e4c81b21..aae9661e235 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -60,7 +60,7 @@ export const telemetryLogId = 'telemetry'; export const TelemetryLogGroup: LoggerGroup = { id: telemetryLogId, name: localize('telemetryLogName', "Telemetry") }; export interface ITelemetryAppender { - log(eventName: string, data: any): void; + log(eventName: string, data: ITelemetryData): void; flush(): Promise; } @@ -165,12 +165,12 @@ export interface Measurements { [key: string]: number; } -export function validateTelemetryData(data?: any): { properties: Properties; measurements: Measurements } { +export function validateTelemetryData(data?: unknown): { properties: Properties; measurements: Measurements } { const properties: Properties = {}; const measurements: Measurements = {}; - const flat: Record = {}; + const flat: Record = {}; flatten(data, flat); for (let prop in flat) { @@ -193,7 +193,7 @@ export function validateTelemetryData(data?: any): { properties: Properties; mea properties[prop] = value.substring(0, 8191); } else if (typeof value !== 'undefined' && value !== null) { - properties[prop] = value; + properties[prop] = String(value); } } @@ -213,13 +213,14 @@ export function cleanRemoteAuthority(remoteAuthority?: string): string { return telemetryAllowedAuthorities.has(remoteName) ? remoteName : 'other'; } -function flatten(obj: any, result: { [key: string]: any }, order: number = 0, prefix?: string): void { - if (!obj) { +function flatten(obj: unknown, result: Record, order: number = 0, prefix?: string): void { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { return; } - for (const item of Object.getOwnPropertyNames(obj)) { - const value = obj[item]; + const source = obj as Record; + for (const item of Object.getOwnPropertyNames(source)) { + const value = source[item]; const index = prefix ? prefix + item : item; if (Array.isArray(value)) { @@ -360,7 +361,10 @@ function removePropertiesWithPossibleUserInfo(property: string): string { * @param paths Any additional patterns that should be removed from the data set * @returns A new object with the PII removed */ -export function cleanData(data: Record, cleanUpPatterns: RegExp[]): Record { +export function cleanData(data: ITelemetryData | undefined, cleanUpPatterns: RegExp[]): Record { + if (!data) { + return {}; + } return cloneAndChange(data, value => { // If it's a trusted value it means it's okay to skip cleaning so we don't clean it diff --git a/src/vs/platform/telemetry/node/1dsAppender.ts b/src/vs/platform/telemetry/node/1dsAppender.ts index 53da3a31210..0d3f9369eb5 100644 --- a/src/vs/platform/telemetry/node/1dsAppender.ts +++ b/src/vs/platform/telemetry/node/1dsAppender.ts @@ -28,7 +28,7 @@ async function makeTelemetryRequest(options: IRequestOptions, requestService: IR const response = await requestService.request(options, CancellationToken.None); const responseData = (await streamToBuffer(response.stream)).toString(); const statusCode = response.res.statusCode ?? 200; - const headers = response.res.headers as Record; + const headers = response.res.headers as Record; return { headers, statusCode, @@ -51,7 +51,7 @@ async function makeLegacyTelemetryRequest(options: IRequestOptions): Promise { res.on('data', function (responseData) { resolve({ - headers: res.headers as Record, + headers: res.headers as Record, statusCode: res.statusCode ?? 200, responseData: responseData.toString() }); @@ -100,7 +100,7 @@ export class OneDataSystemAppender extends AbstractOneDataSystemAppender { requestService: IRequestService | undefined, isInternalTelemetry: boolean, eventPrefix: string, - defaultData: { [key: string]: any } | null, + defaultData: { [key: string]: unknown } | null, iKeyOrClientFactory: string | (() => IAppInsightsCore), // allow factory function for testing ) { // Override the way events get sent since node doesn't have XHTMLRequest diff --git a/src/vs/platform/telemetry/node/errorTelemetry.ts b/src/vs/platform/telemetry/node/errorTelemetry.ts index 933182f0dfb..7287799d05a 100644 --- a/src/vs/platform/telemetry/node/errorTelemetry.ts +++ b/src/vs/platform/telemetry/node/errorTelemetry.ts @@ -13,8 +13,8 @@ export default class ErrorTelemetry extends BaseErrorTelemetry { // Print a console message when rejection isn't handled within N seconds. For details: // see https://nodejs.org/api/process.html#process_event_unhandledrejection // and https://nodejs.org/api/process.html#process_event_rejectionhandled - const unhandledPromises: Promise[] = []; - process.on('unhandledRejection', (reason: any, promise: Promise) => { + const unhandledPromises: Promise[] = []; + process.on('unhandledRejection', (reason: unknown, promise: Promise) => { unhandledPromises.push(promise); setTimeout(() => { const idx = unhandledPromises.indexOf(promise); @@ -35,7 +35,7 @@ export default class ErrorTelemetry extends BaseErrorTelemetry { }, 1000); }); - process.on('rejectionHandled', (promise: Promise) => { + process.on('rejectionHandled', (promise: Promise) => { const idx = unhandledPromises.indexOf(promise); if (idx >= 0) { unhandledPromises.splice(idx, 1); diff --git a/src/vs/workbench/api/common/extHostTelemetry.ts b/src/vs/workbench/api/common/extHostTelemetry.ts index 872150c93f3..8be91fe4c35 100644 --- a/src/vs/workbench/api/common/extHostTelemetry.ts +++ b/src/vs/workbench/api/common/extHostTelemetry.ts @@ -18,6 +18,11 @@ import { mixin } from '../../../base/common/objects.js'; import { Disposable } from '../../../base/common/lifecycle.js'; import { localize } from '../../../nls.js'; +type ExtHostTelemetryEventData = Record & { + properties?: Record; + measurements?: Record; +}; + export class ExtHostTelemetry extends Disposable implements ExtHostTelemetryShape { readonly _serviceBrand: undefined; @@ -210,10 +215,10 @@ export class ExtHostTelemetryLogger { } } - mixInCommonPropsAndCleanData(data: Record): Record { + mixInCommonPropsAndCleanData(data: ExtHostTelemetryEventData): Record { // Some telemetry modules prefer to break properties and measurmements up // We mix common properties into the properties tab. - let updatedData = 'properties' in data ? (data.properties ?? {}) : data; + let updatedData = data.properties ? (data.properties ?? {}) : data; // We don't clean measurements since they are just numbers updatedData = cleanData(updatedData, []); @@ -226,7 +231,7 @@ export class ExtHostTelemetryLogger { updatedData = mixin(updatedData, this._commonProperties); } - if ('properties' in data) { + if (data.properties) { data.properties = updatedData; } else { data = updatedData; @@ -275,11 +280,11 @@ export class ExtHostTelemetryLogger { }; const cleanedErrorData = cleanData(errorData, []); // Reconstruct the error object with the cleaned data - const cleanedError = new Error(cleanedErrorData.message, { + const cleanedError = new Error(typeof cleanedErrorData.message === 'string' ? cleanedErrorData.message : undefined, { cause: cleanedErrorData.cause }); - cleanedError.stack = cleanedErrorData.stack; - cleanedError.name = cleanedErrorData.name; + cleanedError.stack = typeof cleanedErrorData.stack === 'string' ? cleanedErrorData.stack : undefined; + cleanedError.name = typeof cleanedErrorData.name === 'string' ? cleanedErrorData.name : 'unknown'; data = this.mixInCommonPropsAndCleanData(data || {}); if (!this._inLoggingOnlyMode) { this._sender.sendErrorData(cleanedError, data); diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index db09725746a..a1050be0194 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -25,7 +25,7 @@ import { EditorProgressIndicator } from '../../../services/progress/browser/prog import { localize } from '../../../../nls.js'; import { coalesce } from '../../../../base/common/arrays.js'; import { DisposableStore, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; -import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; +import { ITelemetryData, ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { DeferredPromise, Promises, RunOnceWorker } from '../../../../base/common/async.js'; import { EventType as TouchEventType, GestureEvent } from '../../../../base/browser/touch.js'; import { IEditorGroupsView, IEditorGroupView, fillActiveEditorViewState, EditorServiceImpl, IEditorGroupTitleHeight, IInternalEditorOpenOptions, IInternalMoveCopyOptions, IInternalEditorCloseOptions, IInternalEditorTitleControlOptions, IEditorPartsView, IEditorGroupViewOptions } from './editor.js'; @@ -724,7 +724,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { }; } - private toEditorTelemetryDescriptor(editor: EditorInput): object { + private toEditorTelemetryDescriptor(editor: EditorInput): ITelemetryData { const descriptor = editor.getTelemetryDescriptor(); const resource = EditorResourceAccessor.getOriginalUri(editor, { supportSideBySide: SideBySideEditor.BOTH }); diff --git a/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts b/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts index 0b691a36561..69aac95c914 100644 --- a/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts +++ b/src/vs/workbench/services/telemetry/test/browser/commonProperties.test.ts @@ -6,6 +6,7 @@ import assert from 'assert'; import { resolveWorkbenchCommonProperties } from '../../browser/workbenchCommonProperties.js'; import { InMemoryStorageService } from '../../../../../platform/storage/common/storage.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; +import { hasKey } from '../../../../../base/common/types.js'; suite('Browser Telemetry - common properties', function () { @@ -32,18 +33,19 @@ suite('Browser Telemetry - common properties', function () { const props = resolveWorkbenchCommonProperties(testStorageService, commit, version, false, undefined, undefined, false, resolveCommonTelemetryProperties); - assert.ok('commitHash' in props); - assert.ok('sessionID' in props); - assert.ok('timestamp' in props); - assert.ok('common.platform' in props); - assert.ok('common.timesincesessionstart' in props); - assert.ok('common.sequence' in props); - assert.ok('version' in props); - assert.ok('common.firstSessionDate' in props, 'firstSessionDate'); - assert.ok('common.lastSessionDate' in props, 'lastSessionDate'); - assert.ok('common.isNewSession' in props, 'isNewSession'); - assert.ok('common.machineId' in props, 'machineId'); - + assert.ok(hasKey(props, { + commitHash: true, + sessionID: true, + timestamp: true, + 'common.platform': true, + 'common.timesincesessionstart': true, + 'common.sequence': true, + version: true, + 'common.firstSessionDate': true, + 'common.lastSessionDate': true, + 'common.isNewSession': true, + 'common.machineId': true + })); assert.strictEqual(props['userId'], '1'); }); diff --git a/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts b/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts index 3214a8242c4..91d79243e59 100644 --- a/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts +++ b/src/vs/workbench/services/telemetry/test/node/commonProperties.test.ts @@ -9,6 +9,7 @@ import { resolveWorkbenchCommonProperties } from '../../common/workbenchCommonPr import { StorageScope, InMemoryStorageService, StorageTarget } from '../../../../../platform/storage/common/storage.js'; import { timeout } from '../../../../../base/common/async.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; +import { hasKey } from '../../../../../base/common/types.js'; suite('Telemetry - common properties', function () { const commit: string = (undefined)!; @@ -28,24 +29,25 @@ suite('Telemetry - common properties', function () { test('default', function () { const props = resolveWorkbenchCommonProperties(testStorageService, release(), hostname(), commit, version, 'someMachineId', 'someSqmId', 'somedevDeviceId', false, process, date); - assert.ok('commitHash' in props); - assert.ok('sessionID' in props); - assert.ok('timestamp' in props); - assert.ok('common.platform' in props); - assert.ok('common.nodePlatform' in props); - assert.ok('common.nodeArch' in props); - assert.ok('common.timesincesessionstart' in props); - assert.ok('common.sequence' in props); - // assert.ok('common.version.shell' in first.data); // only when running on electron - // assert.ok('common.version.renderer' in first.data); - assert.ok('common.platformVersion' in props, 'platformVersion'); - assert.ok('version' in props); - assert.ok('common.releaseDate' in props); - assert.ok('common.firstSessionDate' in props, 'firstSessionDate'); - assert.ok('common.lastSessionDate' in props, 'lastSessionDate'); // conditional, see below, 'lastSessionDate'ow - assert.ok('common.isNewSession' in props, 'isNewSession'); - // machine id et al - assert.ok('common.machineId' in props, 'machineId'); + assert.ok(hasKey(props, { + commitHash: true, + sessionID: true, + timestamp: true, + 'common.platform': true, + 'common.nodePlatform': true, + 'common.nodeArch': true, + 'common.timesincesessionstart': true, + 'common.sequence': true, + // 'common.version.shell': true, // only when running on electron + // 'common.version.renderer': true, + 'common.platformVersion': true, + version: true, + 'common.releaseDate': true, + 'common.firstSessionDate': true, + 'common.lastSessionDate': true, + 'common.isNewSession': true, + 'common.machineId': true + })); }); test('lastSessionDate when available', function () { @@ -53,8 +55,8 @@ suite('Telemetry - common properties', function () { testStorageService.store('telemetry.lastSessionDate', new Date().toUTCString(), StorageScope.APPLICATION, StorageTarget.MACHINE); const props = resolveWorkbenchCommonProperties(testStorageService, release(), hostname(), commit, version, 'someMachineId', 'someSqmId', 'somedevDeviceId', false, process, date); - assert.ok('common.lastSessionDate' in props); // conditional, see below - assert.ok('common.isNewSession' in props); + assert.ok(props['common.lastSessionDate']); // conditional, see below + assert.ok(props['common.isNewSession']); assert.strictEqual(props['common.isNewSession'], '0'); }); diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index dd80dce0eb4..df3a9b6dd3b 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -11,7 +11,7 @@ import { IUpdateService } from '../../../../platform/update/common/update.js'; import { ILifecycleService, LifecyclePhase } from '../../lifecycle/common/lifecycle.js'; import { IEditorService } from '../../editor/common/editorService.js'; import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js'; -import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; +import { ITelemetryData, ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { Barrier, timeout } from '../../../../base/common/async.js'; import { IWorkbenchLayoutService } from '../../layout/browser/layoutService.js'; import { IPaneCompositePartService } from '../../panecomposite/browser/panecomposite.js'; @@ -644,7 +644,7 @@ export abstract class AbstractTimerService implements ITimerService { ] } */ - this._telemetryService.publicLog('startupTimeVaried', metrics); + this._telemetryService.publicLog('startupTimeVaried', metrics as unknown as ITelemetryData); } protected _shouldReportPerfMarks(): boolean {