diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index c3e05eb2..eb04c7a1 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore } from '../../../base/common/lifecycle.js'; +// import { mixin } from '../../../base/common/objects.js'; import { isWeb } from '../../../base/common/platform.js'; import { escapeRegExpCharacters } from '../../../base/common/strings.js'; import { localize } from '../../../nls.js'; @@ -15,6 +16,7 @@ import { Registry } from '../../registry/common/platform.js'; import { ClassifiedEvent, IGDPRProperty, OmitMetadata, StrictPropertyCheck } from './gdprTypings.js'; import { ITelemetryData, ITelemetryService, TelemetryConfiguration, TelemetryLevel, TELEMETRY_CRASH_REPORTER_SETTING_ID, TELEMETRY_OLD_SETTING_ID, TELEMETRY_SECTION_ID, TELEMETRY_SETTING_ID, ICommonProperties } from './telemetry.js'; import { getTelemetryLevel, ITelemetryAppender } from './telemetryUtils.js'; +// import { cleanData } from './telemetryUtils.js'; export interface ITelemetryServiceConfig { appenders: ITelemetryAppender[]; diff --git a/src/vs/platform/void/common/metricsService.ts b/src/vs/platform/void/common/metricsService.ts index 7002af45..a3aeb6a8 100644 --- a/src/vs/platform/void/common/metricsService.ts +++ b/src/vs/platform/void/common/metricsService.ts @@ -7,10 +7,15 @@ import { createDecorator } from '../../instantiation/common/instantiation.js'; import { ProxyChannel } from '../../../base/parts/ipc/common/ipc.js'; import { IMainProcessService } from '../../ipc/common/mainProcessService.js'; import { InstantiationType, registerSingleton } from '../../instantiation/common/extensions.js'; +import { Action2, registerAction2 } from '../../actions/common/actions.js'; +import { localize2 } from '../../../nls.js'; +import { ServicesAccessor } from '../../../editor/browser/editorExtensions.js'; +import { INotificationService } from '../../notification/common/notification.js'; export interface IMetricsService { readonly _serviceBrand: undefined; capture(event: string, params: Record): void; + getDebuggingProperties(): Promise; } export const IMetricsService = createDecorator('metricsService'); @@ -34,7 +39,30 @@ export class MetricsService implements IMetricsService { this.metricsService.capture(...params); } + // anything transmitted over a channel must be async even if it looks like it doesn't have to be + async getDebuggingProperties(): Promise { + return this.metricsService.getDebuggingProperties() + } } registerSingleton(IMetricsService, MetricsService, InstantiationType.Eager); + +// debugging action +registerAction2(class extends Action2 { + constructor() { + super({ + id: 'voidDebugInfo', + f1: true, + title: localize2('voidMetricsDebug', 'Void: Log Debug Info'), + }); + } + async run(accessor: ServicesAccessor): Promise { + const metricsService = accessor.get(IMetricsService) + const notifService = accessor.get(INotificationService) + + const debugProperties = await metricsService.getDebuggingProperties() + console.log('Metrics:', debugProperties) + notifService.info(`Void Debug info:\n${JSON.stringify(debugProperties, null, 2)}`) + } +}) diff --git a/src/vs/platform/void/electron-main/metricsMainService.ts b/src/vs/platform/void/electron-main/metricsMainService.ts index e1811e4c..d9b5b852 100644 --- a/src/vs/platform/void/electron-main/metricsMainService.ts +++ b/src/vs/platform/void/electron-main/metricsMainService.ts @@ -5,6 +5,7 @@ import { Disposable } from '../../../base/common/lifecycle.js'; import { isLinux, isMacintosh, isWindows } from '../../../base/common/platform.js'; + import { IProductService } from '../../product/common/productService.js'; import { ITelemetryService } from '../../telemetry/common/telemetry.js'; @@ -19,36 +20,73 @@ import { PostHog } from 'posthog-node' // const buildNumber = '1.0.0'; // const isMac = process.platform === 'darwin'; + +const os = isWindows ? 'windows' : isMacintosh ? 'mac' : isLinux ? 'linux' : null + export class MetricsMainService extends Disposable implements IMetricsService { _serviceBrand: undefined; - readonly _distinctId: string + readonly distinctId: string readonly client: PostHog + readonly _initProperties: object + + constructor( @ITelemetryService private readonly _telemetryService: ITelemetryService, - @IProductService private readonly _productService: IProductService + @IProductService private readonly _productService: IProductService, ) { super() - this.client = new PostHog('phc_UanIdujHiLp55BkUTjB1AuBXcasVkdqRwgnwRlWESH2', { host: 'https://us.i.posthog.com', }) + this.client = new PostHog('phc_UanIdujHiLp55BkUTjB1AuBXcasVkdqRwgnwRlWESH2', { + host: 'https://us.i.posthog.com', + }) const { devDeviceId, firstSessionDate, machineId } = this._telemetryService + this.distinctId = devDeviceId + const { commit, version, quality } = this._productService - this._distinctId = devDeviceId + // custom properties we identify + this._initProperties = { + firstSessionDate, + machineId, + commit, + version, + os, + quality, + distinctId: this.distinctId, + ...this._getOSInfo(), + } - const { commit, version } = this._productService - const os = isWindows ? 'windows' : isMacintosh ? 'mac' : isLinux ? 'linux' : null + const identifyMessage = { + distinctId: this.distinctId, + properties: this._initProperties, + } + this.client.identify(identifyMessage) - this.client.identify({ distinctId: this._distinctId, properties: { firstSessionDate, machineId, commit, version, os } }) + console.log('Void posthog metrics info:', JSON.stringify(identifyMessage, null, 2)) - console.log('Void posthog metrics info:', JSON.stringify({ devDeviceId, firstSessionDate, machineId })) + } + + _getOSInfo() { + try { + const { platform, arch } = process // see platform.ts + return { platform, arch } + } + catch (e) { + return { osInfo: { platform: '??', arch: '??' } } + } } capture: IMetricsService['capture'] = (event, params) => { - const capture = { distinctId: this._distinctId, event, properties: params } as const + const capture = { distinctId: this.distinctId, event, properties: params } as const // console.log('full capture:', capture) this.client.capture(capture) } + + + async getDebuggingProperties() { + return this._initProperties + } }