Skip to content

Commit 767c538

Browse files
authored
Integrate experimentation platform. Remove ABTesting. (#7659)
1 parent 6dba4f6 commit 767c538

File tree

8 files changed

+153
-194
lines changed

8 files changed

+153
-194
lines changed

Extension/cpptools.json

Lines changed: 0 additions & 8 deletions
This file was deleted.

Extension/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,9 +2779,10 @@
27792779
"plist": "^3.0.2",
27802780
"tmp": "^0.1.0",
27812781
"vscode-cpptools": "^5.0.0",
2782-
"vscode-extension-telemetry": "^0.1.2",
2782+
"vscode-extension-telemetry": "^0.1.7",
27832783
"vscode-languageclient": "^5.2.1",
27842784
"vscode-nls": "^4.1.1",
2785+
"vscode-tas-client": "^0.1.22",
27852786
"which": "^2.0.2",
27862787
"yauzl": "^2.10.0"
27872788
},
@@ -3120,4 +3121,4 @@
31203121
"integrity": "E5046509D510086B99F171595114220AD8E9F820E7238B6A5199CD78B9AD2078"
31213122
}
31223123
]
3123-
}
3124+
}

Extension/src/LanguageServer/client.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import { updateLanguageConfigurations, registerCommands } from './extension';
3737
import { SettingsTracker, getTracker } from './settingsTracker';
3838
import { getTestHook, TestHook } from '../testHook';
3939
import { getCustomConfigProviders, CustomConfigurationProvider1, isSameProviderExtensionId } from '../LanguageServer/customProviders';
40-
import { ABTestSettings, getABTestSettings } from '../abTesting';
4140
import * as fs from 'fs';
4241
import * as os from 'os';
4342
import * as refs from './references';
@@ -1117,8 +1116,6 @@ export class DefaultClient implements Client {
11171116
}
11181117
}
11191118

1120-
const abTestSettings: ABTestSettings = getABTestSettings();
1121-
11221119
let intelliSenseCacheDisabled: boolean = false;
11231120
if (os.platform() === "darwin") {
11241121
const releaseParts: string[] = os.release().split(".");
@@ -1254,7 +1251,6 @@ export class DefaultClient implements Client {
12541251
systemIncludePath: settings_defaultSystemIncludePath
12551252
},
12561253
vcpkg_root: util.getVcpkgRoot(),
1257-
gotoDefIntelliSense: abTestSettings.UseGoToDefIntelliSense,
12581254
experimentalFeatures: workspaceSettings.experimentalFeatures,
12591255
edgeMessagesDirectory: path.join(util.getExtensionFilePath("bin"), "messages", util.getLocaleId()),
12601256
localizedStrings: localizedStrings,

Extension/src/LanguageServer/configurations.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import * as util from '../common';
1111
import * as telemetry from '../telemetry';
1212
import { PersistentFolderState } from './persistentState';
1313
import { CppSettings, OtherSettings } from './settings';
14-
import { ABTestSettings, getABTestSettings } from '../abTesting';
1514
import { CustomConfigurationProviderCollection, getCustomConfigProviders } from './customProviders';
1615
import { SettingsPanel } from './settingsPanel';
1716
import * as os from 'os';
@@ -358,8 +357,7 @@ export class CppProperties {
358357

359358
// Only add settings from the default compiler if user hasn't explicitly set the corresponding VS Code setting.
360359

361-
const abTestSettings: ABTestSettings = getABTestSettings();
362-
const rootFolder: string = abTestSettings.UseRecursiveIncludes ? "${workspaceFolder}/**" : "${workspaceFolder}";
360+
const rootFolder: string = "${workspaceFolder}/**";
363361
const defaultFolder: string = "${default}";
364362
// We don't add system includes to the includePath anymore. The language server has this information.
365363
if (isUnset(settings.defaultIncludePath)) {

Extension/src/LanguageServer/extension.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ import { getTemporaryCommandRegistrarInstance } from '../commands';
2727
import * as rd from 'readline';
2828
import * as yauzl from 'yauzl';
2929
import { Readable, Writable } from 'stream';
30-
import { ABTestSettings, getABTestSettings } from '../abTesting';
3130
import * as nls from 'vscode-nls';
3231
import { CppBuildTaskProvider } from './cppBuildTaskProvider';
3332
import * as which from 'which';
33+
import { IExperimentationService } from 'tas-client';
3434

3535
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
3636
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
@@ -331,25 +331,28 @@ function realActivation(): void {
331331

332332
vcpkgDbPromise = initVcpkgDatabase();
333333

334-
PlatformInformation.GetPlatformInformation().then(info => {
334+
PlatformInformation.GetPlatformInformation().then(async info => {
335335
// Skip Insiders processing for 32-bit Linux.
336336
if (info.platform !== "linux" || info.architecture === "x64" || info.architecture === "arm" || info.architecture === "arm64") {
337337
// Skip Insiders processing for unsupported VS Code versions.
338-
const vscodeVersion: PackageVersion = new PackageVersion(vscode.version);
339-
const abTestSettings: ABTestSettings = getABTestSettings();
340-
const minimumSupportedVersionForInsidersUpgrades: PackageVersion = abTestSettings.getMinimumVSCodeVersion();
341-
if (!minimumSupportedVersionForInsidersUpgrades.isMajorMinorPatchGreaterThan(vscodeVersion)) {
342-
insiderUpdateEnabled = true;
343-
if (settings.updateChannel === 'Default') {
344-
const userVersion: PackageVersion = new PackageVersion(util.packageJson.version);
345-
if (userVersion.suffix === "insiders") {
338+
const experimentationService: IExperimentationService | undefined = await telemetry.getExperimentationService();
339+
// If we can't get to the experimentation service, don't suggest Insiders.
340+
if (experimentationService !== undefined) {
341+
const allowInsiders: boolean | undefined = await experimentationService.getTreatmentVariableAsync<boolean>("vscode", "allowInsiders");
342+
// If we can't get the minimum supported VS Code version for Insiders, don't suggest Insiders.
343+
if (allowInsiders) {
344+
insiderUpdateEnabled = true;
345+
if (settings.updateChannel === 'Default') {
346+
const userVersion: PackageVersion = new PackageVersion(util.packageJson.version);
347+
if (userVersion.suffix === "insiders") {
348+
checkAndApplyUpdate(settings.updateChannel, false);
349+
} else {
350+
suggestInsidersChannel();
351+
}
352+
} else if (settings.updateChannel === 'Insiders') {
353+
insiderUpdateTimer = global.setInterval(checkAndApplyUpdateOnTimer, insiderUpdateTimerInterval);
346354
checkAndApplyUpdate(settings.updateChannel, false);
347-
} else {
348-
suggestInsidersChannel();
349355
}
350-
} else if (settings.updateChannel === 'Insiders') {
351-
insiderUpdateTimer = global.setInterval(checkAndApplyUpdateOnTimer, insiderUpdateTimerInterval);
352-
checkAndApplyUpdate(settings.updateChannel, false);
353356
}
354357
}
355358
}

Extension/src/abTesting.ts

Lines changed: 0 additions & 126 deletions
This file was deleted.

Extension/src/telemetry.ts

Lines changed: 91 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,121 @@
55
'use strict';
66

77
import TelemetryReporter from 'vscode-extension-telemetry';
8+
import { getExperimentationServiceAsync, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from 'vscode-tas-client';
89
import * as util from './common';
10+
import { PackageVersion } from './packageVersion';
911

1012
interface IPackageInfo {
1113
name: string;
1214
version: string;
1315
}
1416

15-
let telemetryReporter: TelemetryReporter | null;
17+
export class ExperimentationTelemetry implements IExperimentationTelemetry {
18+
private sharedProperties: Record<string, string> = {};
19+
20+
constructor(private baseReporter: TelemetryReporter) { }
21+
22+
sendTelemetryEvent(eventName: string, properties?: Record<string, string>, measurements?: Record<string, number>): void {
23+
this.baseReporter.sendTelemetryEvent(
24+
eventName,
25+
{
26+
...this.sharedProperties,
27+
...properties
28+
},
29+
measurements
30+
);
31+
}
32+
33+
sendTelemetryErrorEvent(eventName: string, properties?: Record<string, string>, _measurements?: Record<string, number>): void {
34+
this.baseReporter.sendTelemetryErrorEvent(eventName, {
35+
...this.sharedProperties,
36+
...properties
37+
});
38+
}
39+
40+
setSharedProperty(name: string, value: string): void {
41+
this.sharedProperties[name] = value;
42+
}
43+
44+
postEvent(eventName: string, props: Map<string, string>): void {
45+
const event: Record<string, string> = {};
46+
for (const [key, value] of props) {
47+
event[key] = value;
48+
}
49+
this.sendTelemetryEvent(eventName, event);
50+
}
51+
52+
dispose(): Promise<any> {
53+
return this.baseReporter.dispose();
54+
}
55+
}
56+
57+
let initializationPromise: Promise<IExperimentationService> | undefined;
58+
let experimentationTelemetry: ExperimentationTelemetry | undefined;
1659
const appInsightsKey: string = "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217";
1760

1861
export function activate(): void {
1962
try {
20-
telemetryReporter = createReporter();
63+
if (util.extensionContext) {
64+
const packageInfo: IPackageInfo = getPackageInfo();
65+
if (packageInfo) {
66+
let targetPopulation: TargetPopulation;
67+
const userVersion: PackageVersion = new PackageVersion(packageInfo.version);
68+
if (userVersion.suffix === "") {
69+
targetPopulation = TargetPopulation.Public;
70+
} else if (userVersion.suffix === "insiders") {
71+
targetPopulation = TargetPopulation.Insiders;
72+
} else {
73+
targetPopulation = TargetPopulation.Internal;
74+
}
75+
experimentationTelemetry = new ExperimentationTelemetry(new TelemetryReporter(packageInfo.name, packageInfo.version, appInsightsKey));
76+
initializationPromise = getExperimentationServiceAsync(packageInfo.name, packageInfo.version, targetPopulation, experimentationTelemetry, util.extensionContext.globalState);
77+
}
78+
}
2179
} catch (e) {
22-
// can't really do much about this
80+
// Handle error with a try/catch, but do nothing for errors.
2381
}
2482
}
2583

26-
export function deactivate(): void {
27-
if (telemetryReporter) {
28-
telemetryReporter.dispose();
29-
}
84+
export async function getExperimentationService(): Promise<IExperimentationService | undefined> {
85+
return initializationPromise;
3086
}
3187

32-
export function logDebuggerEvent(eventName: string, properties?: { [key: string]: string }): void {
33-
if (telemetryReporter) {
34-
const eventNamePrefix: string = "cppdbg/VS/Diagnostics/Debugger/";
35-
telemetryReporter.sendTelemetryEvent(eventNamePrefix + eventName, properties);
88+
export async function deactivate(): Promise<void> {
89+
if (initializationPromise) {
90+
try {
91+
await initializationPromise;
92+
} catch (e) {
93+
// Continue even if we were not able to initialize the experimentation platform.
94+
}
95+
if (experimentationTelemetry) {
96+
experimentationTelemetry.dispose();
97+
}
3698
}
3799
}
38100

39-
export function logLanguageServerEvent(eventName: string, properties?: { [key: string]: string }, metrics?: { [key: string]: number }): void {
40-
if (telemetryReporter) {
41-
const eventNamePrefix: string = "C_Cpp/LanguageServer/";
42-
telemetryReporter.sendTelemetryEvent(eventNamePrefix + eventName, properties, metrics);
101+
export async function logDebuggerEvent(eventName: string, properties?: { [key: string]: string }): Promise<void> {
102+
try {
103+
await initializationPromise;
104+
} catch (e) {
105+
// Continue even if we were not able to initialize the experimentation platform.
106+
}
107+
if (experimentationTelemetry) {
108+
const eventNamePrefix: string = "cppdbg/VS/Diagnostics/Debugger/";
109+
experimentationTelemetry.sendTelemetryEvent(eventNamePrefix + eventName, properties);
43110
}
44111
}
45112

46-
function createReporter(): TelemetryReporter | null {
47-
if (util.extensionContext) {
48-
const packageInfo: IPackageInfo = getPackageInfo();
49-
if (packageInfo) {
50-
return new TelemetryReporter(packageInfo.name, packageInfo.version, appInsightsKey);
51-
}
113+
export async function logLanguageServerEvent(eventName: string, properties?: { [key: string]: string }, metrics?: { [key: string]: number }): Promise<void> {
114+
try {
115+
await initializationPromise;
116+
} catch (e) {
117+
// Continue even if we were not able to initialize the experimentation platform.
118+
}
119+
if (experimentationTelemetry) {
120+
const eventNamePrefix: string = "C_Cpp/LanguageServer/";
121+
experimentationTelemetry.sendTelemetryEvent(eventNamePrefix + eventName, properties, metrics);
52122
}
53-
return null;
54123
}
55124

56125
function getPackageInfo(): IPackageInfo {

0 commit comments

Comments
 (0)