diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index 1acf9259110..051557ebb63 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -12,6 +12,7 @@ export interface ITelemetryInfo { sessionId: string; machineId: string; instanceId: string; + firstSessionDate: string; msftInternal?: boolean; } diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index 07f2a795a2b..f30cde48b64 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -105,9 +105,10 @@ export class TelemetryService implements ITelemetryService { let sessionId = values['sessionID']; let instanceId = values['common.instanceId']; let machineId = values['common.machineId']; + let firstSessionDate = values['common.firstSessionDate']; let msftInternal = values['common.msftInternal']; - return { sessionId, instanceId, machineId, msftInternal }; + return { sessionId, instanceId, machineId, firstSessionDate, msftInternal }; } dispose(): void { diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index c3d103335bd..ae7180d241e 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -35,7 +35,8 @@ export const NullTelemetryService = new class implements ITelemetryService { return Promise.resolve({ instanceId: 'someValue.instanceId', sessionId: 'someValue.sessionId', - machineId: 'someValue.machineId' + machineId: 'someValue.machineId', + firstSessionDate: 'someValue.firstSessionDate' }); } }; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 13fc8277203..daa743c3888 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2166,6 +2166,11 @@ declare module 'vscode' { export interface ExtensionContext { readonly extensionRuntime: ExtensionRuntime; + + /** + * Indicates that this is a fresh install of VS Code. + */ + readonly isNewInstall: boolean; } //#endregion diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 47641e7993c..56fb1c262be 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -388,6 +388,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const extensionMode = extensionDescription.isUnderDevelopment ? (this._initData.environment.extensionTestsLocationURI ? ExtensionMode.Test : ExtensionMode.Development) : ExtensionMode.Production; + const installAge = Date.now() - new Date(this._initData.telemetryInfo.firstSessionDate).getTime(); this._logService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.identifier.value}`); @@ -424,6 +425,10 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme checkProposedApiEnabled(extensionDescription); return that.extensionRuntime; }, + get isNewInstall() { + checkProposedApiEnabled(extensionDescription); + return isNaN(installAge) ? false : installAge < 1000 * 60 * 60 * 24; // installAge is less than a day; + }, get environmentVariableCollection() { return that._extHostTerminalService.getEnvironmentVariableCollection(extensionDescription); } }); }); diff --git a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts index fb480250176..03249aa685f 100644 --- a/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts +++ b/src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts @@ -459,7 +459,8 @@ class SimpleTelemetryService implements ITelemetryService { return { instanceId: 'someValue.instanceId', sessionId: 'someValue.sessionId', - machineId: 'someValue.machineId' + machineId: 'someValue.machineId', + firstSessionDate: 'someValue.firstSessionDate' }; } } diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index 8a199b024d7..226ab14a9ae 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -202,7 +202,8 @@ class TestTelemetryService implements ITelemetryService { return Promise.resolve({ instanceId: 'someValue.instanceId', sessionId: 'someValue.sessionId', - machineId: 'someValue.machineId' + machineId: 'someValue.machineId', + firstSessionDate: 'someValue.firstSessionDate' }); } }