Path: blob/main/extensions/github-authentication/src/common/experimentationService.ts
3320 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import TelemetryReporter from '@vscode/extension-telemetry';7import { getExperimentationService, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from 'vscode-tas-client';89export class ExperimentationTelemetry implements IExperimentationTelemetry {10private sharedProperties: Record<string, string> = {};11private experimentationServicePromise: Promise<IExperimentationService> | undefined;1213constructor(private readonly context: vscode.ExtensionContext, private baseReporter: TelemetryReporter) { }1415private async createExperimentationService(): Promise<IExperimentationService> {16let targetPopulation: TargetPopulation;17switch (vscode.env.uriScheme) {18case 'vscode':19targetPopulation = TargetPopulation.Public;20break;21case 'vscode-insiders':22targetPopulation = TargetPopulation.Insiders;23break;24case 'vscode-exploration':25targetPopulation = TargetPopulation.Internal;26break;27case 'code-oss':28targetPopulation = TargetPopulation.Team;29break;30default:31targetPopulation = TargetPopulation.Public;32break;33}3435const id = this.context.extension.id;36const version = this.context.extension.packageJSON.version;37const experimentationService = getExperimentationService(id, version, targetPopulation, this, this.context.globalState);38await experimentationService.initialFetch;39return experimentationService;40}4142/**43* @returns A promise that you shouldn't need to await because this is just telemetry.44*/45async sendTelemetryEvent(eventName: string, properties?: Record<string, string>, measurements?: Record<string, number>) {46if (!this.experimentationServicePromise) {47this.experimentationServicePromise = this.createExperimentationService();48}49await this.experimentationServicePromise;5051this.baseReporter.sendTelemetryEvent(52eventName,53{54...this.sharedProperties,55...properties,56},57measurements,58);59}6061/**62* @returns A promise that you shouldn't need to await because this is just telemetry.63*/64async sendTelemetryErrorEvent(65eventName: string,66properties?: Record<string, string>,67_measurements?: Record<string, number>68) {69if (!this.experimentationServicePromise) {70this.experimentationServicePromise = this.createExperimentationService();71}72await this.experimentationServicePromise;7374this.baseReporter.sendTelemetryErrorEvent(eventName, {75...this.sharedProperties,76...properties,77});78}7980setSharedProperty(name: string, value: string): void {81this.sharedProperties[name] = value;82}8384postEvent(eventName: string, props: Map<string, string>): void {85const event: Record<string, string> = {};86for (const [key, value] of props) {87event[key] = value;88}89this.sendTelemetryEvent(eventName, event);90}9192dispose(): Promise<any> {93return this.baseReporter.dispose();94}95}969798