提交 fbc77471 编写于 作者: S Sofian Hnaide

add optinstatus event

上级 4062cc17
......@@ -24,6 +24,7 @@ export class MainTelemetryService extends AbstractTelemetryService implements IT
private eventCount: number;
private userIdHash: string;
private startTime: Date;
private optInFriendly: string[];
constructor(config?: ITelemetryServiceConfig) {
super(config);
......@@ -41,6 +42,9 @@ export class MainTelemetryService extends AbstractTelemetryService implements IT
this.eventCount = 0;
this.startTime = new Date();
//holds a cache of predefined events that can be sent regardress of user optin status
this.optInFriendly = ['optInStatus'];
}
private onUserIdle(): void {
......@@ -68,13 +72,13 @@ export class MainTelemetryService extends AbstractTelemetryService implements IT
return;
}
// don't send telemetry when not enabled
// don't send telemetry when channel is not enabled
if (!this.config.enableTelemetry) {
return;
}
// don't send events when user is optout
if(!this.config.userOptIn) {
// don't send events when the user is optout unless the event is flaged as optin friendly
if(!this.config.userOptIn && this.optInFriendly.indexOf(eventName) === -1) {
return;
}
......
......@@ -24,13 +24,25 @@ class StorageKeys {
public static InstanceId: string = 'telemetry.instanceId';
}
interface ITelemetryEvent {
eventName: string;
data?: any;
}
export class ElectronTelemetryService extends MainTelemetryService implements ITelemetryService {
private static MAX_BUFFER_SIZE = 100;
private _setupIds: Promise<ITelemetryInfo>;
private _buffer: ITelemetryEvent[];
private _optInStatusLoaded: boolean;
constructor(@IConfigurationService private configurationService: IConfigurationService, @IStorageService private storageService: IStorageService, config?: ITelemetryServiceConfig) {
super(config);
this._buffer = [];
this._optInStatusLoaded = false;
this.loadOptinSettings();
this._setupIds = this.setupIds();
}
......@@ -41,8 +53,36 @@ export class ElectronTelemetryService extends MainTelemetryService implements IT
public getTelemetryInfo(): Promise<ITelemetryInfo> {
return this._setupIds;
}
/**
* override the base publicLog to prevent reporting any events before the optIn status is read from configuration
*/
public publicLog(eventName:string, data?: any): void {
if (this._optInStatusLoaded) {
super.publicLog(eventName, data);
} else {
// in case loading configuration is delayed, make sure the buffer does not grow beyond MAX_BUFFER_SIZE
if (this._buffer.length > ElectronTelemetryService.MAX_BUFFER_SIZE) {
this._buffer = [];
}
this._buffer.push({eventName: eventName, data: data});
}
}
private flushBuffer(): void {
let event: ITelemetryEvent = null;
while(event = this._buffer.pop()) {
super.publicLog(event.eventName, event.data);
}
}
private loadOptinSettings(): void {
this.configurationService.loadConfiguration(TELEMETRY_SECTION_ID).done(config => {
this.config.userOptIn = config ? config.enableTelemetry : this.config.userOptIn;
this._optInStatusLoaded = true;
this.publicLog('optInStatus', {optIn: this.config.userOptIn});
this.flushBuffer();
});
this.toUnbind.push(this.configurationService.addListener(ConfigurationServiceEventTypes.UPDATED, (e: IConfigurationServiceEvent) => {
this.config.userOptIn = e.config && e.config[TELEMETRY_SECTION_ID] ? e.config[TELEMETRY_SECTION_ID].enableTelemetry : this.config.userOptIn;
}));
......
......@@ -16,6 +16,8 @@ import Platform = require('vs/platform/platform');
import * as sinon from 'sinon';
import {createSyncDescriptor} from 'vs/platform/instantiation/common/descriptors';
const optInStatusEventName: string = 'optInStatus';
class TestTelemetryAppender implements TelemetryService.ITelemetryAppender {
public events: any[];
......@@ -778,4 +780,19 @@ suite('TelemetryService', () => {
service.dispose();
}));
test('Telemetry Service allows optin friendly events', sinon.test(function() {
let service = new MainTelemetryService.MainTelemetryService({userOptIn: false, enableTelemetry: true});
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 0);
service.publicLog(optInStatusEventName, {userOptIn: false});
assert.equal(testAppender.getEventsCount(), 1);
assert.equal(testAppender.events[0].eventName, optInStatusEventName);
assert.equal(testAppender.events[0].data.userOptIn, false);
service.dispose();
}));
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册