Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/vs/platform/telemetry/common/serverTelemetryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ export class ServerTelemetryService extends TelemetryService implements IServerT
this._injectedTelemetryLevel = injectedTelemetryLevel;
}

override publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void> {
override publicLog(eventName: string, data?: ITelemetryData): Promise<void> {
if (this._injectedTelemetryLevel < TelemetryLevel.USAGE) {
return Promise.resolve(undefined);
}
return super.publicLog(eventName, data, anonymizeFilePaths);
return super.publicLog(eventName, data);
}

override publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>, anonymizeFilePaths?: boolean): Promise<void> {
return this.publicLog(eventName, data as ITelemetryData | undefined, anonymizeFilePaths);
override publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>): Promise<void> {
return this.publicLog(eventName, data as ITelemetryData | undefined);
}

override publicLogError(errorEventName: string, data?: ITelemetryData): Promise<void> {
Expand Down
4 changes: 2 additions & 2 deletions src/vs/platform/telemetry/common/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ export interface ITelemetryService {
/**
* @deprecated Use publicLog2 and the typescript GDPR annotation where possible
*/
publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void>;
publicLog(eventName: string, data?: ITelemetryData): Promise<void>;

/**
* Sends a telemetry event that has been privacy approved.
* Do not call this unless you have been given approval.
*/
publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>, anonymizeFilePaths?: boolean): Promise<void>;
publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>): Promise<void>;

/**
* @deprecated Use publicLogError2 and the typescript GDPR annotation where possible
Expand Down
12 changes: 6 additions & 6 deletions src/vs/platform/telemetry/common/telemetryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export class TelemetryService implements ITelemetryService {
this._disposables.dispose();
}

private _log(eventName: string, eventLevel: TelemetryLevel, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<any> {
private _log(eventName: string, eventLevel: TelemetryLevel, data?: ITelemetryData): Promise<any> {
// don't send events when the user is optout
if (this.telemetryLevel.value < eventLevel) {
return Promise.resolve(undefined);
Expand All @@ -128,12 +128,12 @@ export class TelemetryService implements ITelemetryService {
});
}

publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<any> {
return this._log(eventName, TelemetryLevel.USAGE, data, anonymizeFilePaths);
publicLog(eventName: string, data?: ITelemetryData): Promise<any> {
return this._log(eventName, TelemetryLevel.USAGE, data);
}

publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>, anonymizeFilePaths?: boolean): Promise<any> {
return this.publicLog(eventName, data as ITelemetryData, anonymizeFilePaths);
publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>): Promise<any> {
return this.publicLog(eventName, data as ITelemetryData);
}

publicLogError(errorEventName: string, data?: ITelemetryData): Promise<any> {
Expand All @@ -142,7 +142,7 @@ export class TelemetryService implements ITelemetryService {
}

// Send error event and anonymize paths
return this._log(errorEventName, TelemetryLevel.ERROR, data, true);
return this._log(errorEventName, TelemetryLevel.ERROR, data);
}

publicLogError2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>): Promise<any> {
Expand Down
14 changes: 14 additions & 0 deletions src/vs/platform/telemetry/common/telemetryUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ import { verifyMicrosoftInternalDomain } from 'vs/platform/telemetry/common/comm
import { ClassifiedEvent, IGDPRProperty, OmitMetadata, StrictPropertyCheck } from 'vs/platform/telemetry/common/gdprTypings';
import { ICustomEndpointTelemetryService, ITelemetryData, ITelemetryEndpoint, ITelemetryInfo, ITelemetryService, TelemetryConfiguration, TelemetryLevel, TELEMETRY_OLD_SETTING_ID, TELEMETRY_SETTING_ID } from 'vs/platform/telemetry/common/telemetry';

/**
* A special class used to denoate a telemetry value which should not be clean.
* This is because that value is "Trusted" not to contain identifiable information such as paths
*/
export class TrustedTelemetryValue {
constructor(public readonly value: any) { }
}

export class NullTelemetryServiceShape implements ITelemetryService {
declare readonly _serviceBrand: undefined;
readonly sendErrorTelemetry = false;
Expand Down Expand Up @@ -399,6 +407,12 @@ function removePropertiesWithPossibleUserInfo(property: string): string {
*/
export function cleanData(data: Record<string, any>, cleanUpPatterns: RegExp[]): Record<string, any> {
return cloneAndChange(data, value => {

// If it's a trusted value it means it's okay to skip cleaning so we don't clean it
if (value instanceof TrustedTelemetryValue) {
return value.value;
}

// We only know how to clean strings
if (typeof value === 'string') {
let updatedProperty = value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ suite('TelemetryService', () => {
return Promise.all(this.promises);
}

override publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void> {
const p = super.publicLog(eventName, data, anonymizeFilePaths);
override publicLog(eventName: string, data?: ITelemetryData): Promise<void> {
const p = super.publicLog(eventName, data);
// publicLog is called from the ctor and therefore promises can be undefined
this.promises = this.promises ?? [];
this.promises.push(p);
Expand Down
3 changes: 2 additions & 1 deletion src/vs/workbench/browser/parts/editor/editorGroupView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'
import { isLinux, isMacintosh, isNative, isWindows } from 'vs/base/common/platform';
import { ILogService } from 'vs/platform/log/common/log';
import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles';
import { TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils';

export class EditorGroupView extends Themable implements IEditorGroupView {

Expand Down Expand Up @@ -642,7 +643,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView {
// Remove query parameters from the resource extension
const queryStringLocation = resourceExt.indexOf('?');
resourceExt = queryStringLocation !== -1 ? resourceExt.substr(0, queryStringLocation) : resourceExt;
descriptor['resource'] = { mimeType: getMimeTypes(resource).join(', '), scheme: resource.scheme, ext: resourceExt, path: hash(path) };
descriptor['resource'] = { mimeType: new TrustedTelemetryValue(getMimeTypes(resource).join(', ')), scheme: resource.scheme, ext: resourceExt, path: hash(path) };

/* __GDPR__FRAGMENT__
"EditorTelemetryDescriptor" : {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
import { language } from 'vs/base/common/platform';
import { Disposable } from 'vs/base/common/lifecycle';
import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry';
import { configurationTelemetry } from 'vs/platform/telemetry/common/telemetryUtils';
import { configurationTelemetry, TrustedTelemetryValue } from 'vs/platform/telemetry/common/telemetryUtils';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ITextFileService, ITextFileSaveEvent, ITextFileResolveEvent } from 'vs/workbench/services/textfile/common/textfiles';
import { extname, basename, isEqual, isEqualOrParent } from 'vs/base/common/resources';
Expand All @@ -28,7 +28,7 @@ import { ViewContainerLocation } from 'vs/workbench/common/views';
import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile';

type TelemetryData = {
mimeType: string;
mimeType: TrustedTelemetryValue;
ext: string;
path: number;
reason?: number;
Expand Down Expand Up @@ -216,7 +216,7 @@ export class TelemetryContribution extends Disposable implements IWorkbenchContr
const fileName = basename(resource);
const path = resource.scheme === Schemas.file ? resource.fsPath : resource.path;
const telemetryData = {
mimeType: getMimeTypes(resource).join(', '),
mimeType: new TrustedTelemetryValue(getMimeTypes(resource).join(', ')),
ext,
path: hash(path),
reason,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager {
if (err && err.stack) {
failureTelemetryEvent.errorStack = err.stack;
}
this._telemetryService.publicLog2<ExtensionHostStartupEvent, ExtensionHostStartupClassification>('extensionHostStartup', failureTelemetryEvent, true);
this._telemetryService.publicLog2<ExtensionHostStartupEvent, ExtensionHostStartupClassification>('extensionHostStartup', failureTelemetryEvent);

return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,12 @@ export class TelemetryService extends Disposable implements ITelemetryService {
return this.impl.telemetryLevel;
}

publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void> {
return this.impl.publicLog(eventName, data, anonymizeFilePaths);
publicLog(eventName: string, data?: ITelemetryData): Promise<void> {
return this.impl.publicLog(eventName, data);
}

publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>, anonymizeFilePaths?: boolean) {
return this.publicLog(eventName, data as ITelemetryData, anonymizeFilePaths);
publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>) {
return this.publicLog(eventName, data as ITelemetryData);
}

publicLogError(errorEventName: string, data?: ITelemetryData): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ export class TelemetryService extends Disposable implements ITelemetryService {
return this.impl.telemetryLevel;
}

publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void> {
return this.impl.publicLog(eventName, data, anonymizeFilePaths);
publicLog(eventName: string, data?: ITelemetryData): Promise<void> {
return this.impl.publicLog(eventName, data);
}

publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>, anonymizeFilePaths?: boolean) {
return this.publicLog(eventName, data as ITelemetryData, anonymizeFilePaths);
publicLog2<E extends ClassifiedEvent<OmitMetadata<T>> = never, T extends IGDPRProperty = never>(eventName: string, data?: StrictPropertyCheck<T, E>) {
return this.publicLog(eventName, data as ITelemetryData);
}

publicLogError(errorEventName: string, data?: ITelemetryData): Promise<void> {
Expand Down