From 2b8404d41e83298b19aceaaa3306592276e2213a Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Thu, 9 Apr 2026 10:06:24 -0400 Subject: [PATCH] Don't redact ABExp Contact --- .../telemetry/common/baseTelemetryService.ts | 16 +++++++++------- .../telemetry/common/msftTelemetrySender.ts | 19 +------------------ .../telemetry/common/telemetryService.ts | 6 +++--- 3 files changed, 13 insertions(+), 28 deletions(-) diff --git a/extensions/copilot/src/platform/telemetry/common/baseTelemetryService.ts b/extensions/copilot/src/platform/telemetry/common/baseTelemetryService.ts index 52d5eb8b84fcc..61171959bc7ca 100644 --- a/extensions/copilot/src/platform/telemetry/common/baseTelemetryService.ts +++ b/extensions/copilot/src/platform/telemetry/common/baseTelemetryService.ts @@ -8,13 +8,13 @@ import { ICopilotTokenStore } from '../../authentication/common/copilotTokenStor import { ICAPIClientService } from '../../endpoint/common/capiClient'; import { BaseGHTelemetrySender } from './ghTelemetrySender'; import { BaseMsftTelemetrySender } from './msftTelemetrySender'; -import { ITelemetryService, TelemetryDestination, TelemetryEventMeasurements, TelemetryEventProperties } from './telemetry'; +import { ITelemetryService, TelemetryDestination, TelemetryEventMeasurements, TelemetryEventProperties, TelemetryTrustedValue } from './telemetry'; export class BaseTelemetryService implements ITelemetryService { declare readonly _serviceBrand: undefined; // Properties that are applied to all telemetry events (currently only used by the exp service // TODO @lramos15 extend further to include more - private _sharedProperties: Record = {}; + private _sharedProperties: Record> = {}; private _originalExpAssignments: string | undefined; private _additionalExpAssignments: string[] = []; private _disposables: IDisposable[] = []; @@ -143,7 +143,7 @@ export class BaseTelemetryService implements ITelemetryService { } } this._capiClientService.abExpContext = value; - this._sharedProperties['abexp.assignmentcontext'] = value; + this._sharedProperties['abexp.assignmentcontext'] = new TelemetryTrustedValue(value); } setSharedProperty(name: string, value: string): void { @@ -165,9 +165,11 @@ export class BaseTelemetryService implements ITelemetryService { } postEvent(eventName: string, props: Map): void { - for (const [key, value] of Object.entries(this._sharedProperties)) { - props.set(key, value); - } - this._microsoftTelemetrySender.postEvent(eventName, props); + const properties: Record> = { + ...Object.fromEntries(props), + ...this._sharedProperties + }; + this._microsoftTelemetrySender.sendInternalTelemetryEvent(eventName, properties); + this._microsoftTelemetrySender.sendTelemetryEvent(eventName, properties); } } diff --git a/extensions/copilot/src/platform/telemetry/common/msftTelemetrySender.ts b/extensions/copilot/src/platform/telemetry/common/msftTelemetrySender.ts index b334748a94b77..2074272384dd8 100644 --- a/extensions/copilot/src/platform/telemetry/common/msftTelemetrySender.ts +++ b/extensions/copilot/src/platform/telemetry/common/msftTelemetrySender.ts @@ -36,23 +36,6 @@ export class BaseMsftTelemetrySender implements IMSFTTelemetrySender { this._disposables.add(copilotTokenStore.onDidStoreUpdate(() => this.processToken(copilotTokenStore.copilotToken))); } - /** - * **NOTE**: Do not call directly - * This is just used by the experimentation service to log events to the scorecards - * @param eventName - * @param props - */ - postEvent(eventName: string, props: Map): void { - const event: Record = {}; - for (const [key, value] of props) { - event[key] = value; - } - if (this._isInternal) { - this.sendInternalTelemetryEvent(eventName, event); - } - this.sendTelemetryEvent(eventName, event); - } - /** * Sends a telemetry event regarding internal Microsoft staff only. Will be dropped if telemetry level is below Usage * @param eventName The name of the event to send @@ -61,7 +44,7 @@ export class BaseMsftTelemetrySender implements IMSFTTelemetrySender { * @returns */ sendInternalTelemetryEvent(eventName: string, properties?: TelemetryEventProperties, measurements?: TelemetryEventMeasurements): void { - if (!this._internalTelemetryReporter) { + if (!this._internalTelemetryReporter || !this._isInternal) { return; } properties = { ...properties, 'common.tid': this._tid, 'common.userName': this._username ?? 'undefined' }; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index dfdd41ae6c14d..dd0a632b9f01f 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -17,7 +17,7 @@ import { IProductService } from '../../product/common/productService.js'; 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 { cleanData, getTelemetryLevel, ITelemetryAppender } from './telemetryUtils.js'; +import { cleanData, getTelemetryLevel, ITelemetryAppender, TelemetryTrustedValue } from './telemetryUtils.js'; export interface ITelemetryServiceConfig { appenders: ITelemetryAppender[]; @@ -60,7 +60,7 @@ export class TelemetryService implements ITelemetryService { private _appenders: ITelemetryAppender[]; private _commonProperties: ICommonProperties; - private _experimentProperties: { [name: string]: string } = {}; + private _experimentProperties: { [name: string]: string | TelemetryTrustedValue } = {}; private _piiPaths: string[]; private _telemetryLevel: TelemetryLevel; private _sendErrorTelemetry: boolean; @@ -127,7 +127,7 @@ export class TelemetryService implements ITelemetryService { } setExperimentProperty(name: string, value: string): void { - this._experimentProperties[name] = value; + this._experimentProperties[name] = new TelemetryTrustedValue(value); // On first call, flush all pending events that were buffered waiting for experiment properties if (!this._isExperimentPropertySet) {