提交 d99d89dc 编写于 作者: J Johannes Rieken

make appenders a ctor argument, first step towards oop appender, #1000

上级 6d0aa3bc
......@@ -17,6 +17,7 @@ import {TimeKeeper, ITimerEvent} from 'vs/base/common/timer';
import {withDefaults, cloneAndChange} from 'vs/base/common/objects';
export interface ITelemetryServiceConfig {
appender: ITelemetryAppender[];
userOptIn?: boolean;
enableHardIdle?: boolean;
enableSoftIdle?: boolean;
......@@ -40,7 +41,6 @@ export class TelemetryService implements ITelemetryService {
protected _telemetryInfo: ITelemetryInfo;
protected _configuration: ITelemetryServiceConfig;
protected _appenders: ITelemetryAppender[] = [];
protected _disposables: IDisposable[] = [];
private _timeKeeper: TimeKeeper;
......@@ -54,6 +54,7 @@ export class TelemetryService implements ITelemetryService {
constructor(config?: ITelemetryServiceConfig) {
this._configuration = withDefaults(config, <ITelemetryServiceConfig>{
appender: [],
cleanupPatterns: [],
sessionID: uuid.generateUuid() + Date.now(),
enableHardIdle: true,
......@@ -131,7 +132,7 @@ export class TelemetryService implements ITelemetryService {
public dispose(): void {
this._disposables = dispose(this._disposables);
for (let appender of this._appenders) {
for (let appender of this._configuration.appender) {
appender.dispose();
}
}
......@@ -185,7 +186,7 @@ export class TelemetryService implements ITelemetryService {
}
});
for (let appender of this._appenders) {
for (let appender of this._configuration.appender) {
appender.log(eventName, data);
}
}
......@@ -200,17 +201,5 @@ export class TelemetryService implements ITelemetryService {
return stack;
}
public addTelemetryAppender(appender: ITelemetryAppender): IDisposable {
this._appenders.push(appender);
return {
dispose: () => {
let index = this._appenders.indexOf(appender);
if (index > -1) {
this._appenders.splice(index, 1);
}
}
};
}
}
......@@ -7,7 +7,7 @@
import {TPromise} from 'vs/base/common/winjs.base';
import {IDisposable} from 'vs/base/common/lifecycle';
import {ITimerEvent, nullEvent} from 'vs/base/common/timer';
import {createDecorator, ServiceIdentifier, IInstantiationService, ServicesAccessor, IConstructorSignature0} from 'vs/platform/instantiation/common/instantiation';
import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation';
export const ITelemetryService = createDecorator<ITelemetryService>('telemetryService');
......@@ -34,40 +34,12 @@ export interface ITelemetryService {
getTelemetryInfo(): TPromise<ITelemetryInfo>;
isOptedIn: boolean;
addTelemetryAppender(appender: ITelemetryAppender): IDisposable;
}
export namespace Extenstions {
let _telemetryAppenderCtors: IConstructorSignature0<ITelemetryAppender>[] = [];
export const TelemetryAppenders = {
activate(accessor: ServicesAccessor): void {
const telemetryService = accessor.get(ITelemetryService);
const instantiationService = accessor.get(IInstantiationService);
for (let ctor of _telemetryAppenderCtors) {
const instance = instantiationService.createInstance(ctor);
telemetryService.addTelemetryAppender(instance);
}
// can only be done once
_telemetryAppenderCtors = undefined;
},
registerTelemetryAppenderDescriptor(ctor: IConstructorSignature0<ITelemetryAppender>): void {
_telemetryAppenderCtors.push(ctor);
}
};
};
export interface ITelemetryAppendersRegistry {
activate(instantiationService: IInstantiationService): void;
}
export const NullTelemetryService: ITelemetryService = {
serviceId: undefined,
timedPublicLog(name: string, data?: any): ITimerEvent { return nullEvent; },
publicLog(eventName: string, data?: any): void { },
addTelemetryAppender(appender): IDisposable { return { dispose() { } }; },
isOptedIn: true,
getTelemetryInfo(): TPromise<ITelemetryInfo> {
return TPromise.as({
......
......@@ -4,14 +4,11 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
/* tslint:disable:semicolon */
import errors = require('vs/base/common/errors');
import {IStorageService} from 'vs/platform/storage/common/storage';
import {ITelemetryAppender} from 'vs/platform/telemetry/common/telemetry';
import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace';
import {AIAdapter, IAIAdapter} from 'vs/base/node/aiAdapter';
import winreg = require('winreg');
import os = require('os');
......@@ -22,7 +19,7 @@ class StorageKeys {
public static firstSessionDate: string = 'telemetry.firstSessionDate';
}
export class NodeAppInsightsTelemetryAppender implements ITelemetryAppender {
export class AppInsightsAppender implements ITelemetryAppender {
public static EVENT_NAME_PREFIX: string = 'monacoworkbench';
......@@ -40,8 +37,7 @@ export class NodeAppInsightsTelemetryAppender implements ITelemetryAppender {
constructor(
@IStorageService storageService: IStorageService,
@IWorkspaceContextService contextService: IWorkspaceContextService,
/* for test only */
client: any
_testing_client?: any
) {
this.commonProperties = {};
this.commonMetrics = {};
......@@ -54,21 +50,21 @@ export class NodeAppInsightsTelemetryAppender implements ITelemetryAppender {
let asimovKey = config ? config.asimovKey: null;
// for test
if (client) {
this.appInsights = client;
if (_testing_client) {
this.appInsights = _testing_client;
if (asimovKey) {
this.appInsightsVortex = client;
this.appInsightsVortex = _testing_client;
}
return;
}
if (key) {
this.appInsights = new AIAdapter(key, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX);
this.appInsights = new AIAdapter(key, AppInsightsAppender.EVENT_NAME_PREFIX);
}
if(asimovKey) {
this.appInsightsVortex = new AIAdapter(asimovKey, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX);
this.appInsightsVortex = new AIAdapter(asimovKey, AppInsightsAppender.EVENT_NAME_PREFIX);
}
this.loadAddtionaProperties();
......@@ -87,7 +83,7 @@ export class NodeAppInsightsTelemetryAppender implements ITelemetryAppender {
if (sqmUserId) {
this.commonProperties['sqm.userid'] = sqmUserId;
} else {
this.getWinRegKeyData(NodeAppInsightsTelemetryAppender.SQM_KEY, 'UserId', winreg.HKCU, (error, result: string) => {
this.getWinRegKeyData(AppInsightsAppender.SQM_KEY, 'UserId', winreg.HKCU, (error, result: string) => {
if (!error && result) {
this.commonProperties['sqm.userid'] = result;
this.storageService.store(StorageKeys.sqmUserId, result);
......@@ -100,7 +96,7 @@ export class NodeAppInsightsTelemetryAppender implements ITelemetryAppender {
this.commonProperties['sqm.machineid'] = sqmMachineId;
}
else {
this.getWinRegKeyData(NodeAppInsightsTelemetryAppender.SQM_KEY, 'MachineId', winreg.HKLM,(error, result) => {
this.getWinRegKeyData(AppInsightsAppender.SQM_KEY, 'MachineId', winreg.HKLM,(error, result) => {
if (!error && result) {
this.commonProperties['sqm.machineid'] = result;
this.storageService.store(StorageKeys.sqmMachineId, result);
......
......@@ -6,7 +6,7 @@
import * as assert from 'assert';
import {IAIAdapter} from 'vs/base/node/aiAdapter';
import { NodeAppInsightsTelemetryAppender } from 'vs/workbench/parts/telemetry/node/nodeAppInsightsTelemetryAppender';
import {AppInsightsAppender} from 'vs/platform/telemetry/node/appInsightsAppender';
interface IAppInsightsEvent {
eventName: string;
......@@ -49,17 +49,17 @@ class ContextServiceMock {
asimovKey: this.asimovKey
}
}
}
};
}
}
suite('Telemetry - AppInsightsTelemetryAppender', () => {
var appInsightsMock: AIAdapterMock;
var appender: NodeAppInsightsTelemetryAppender;
var appender: AppInsightsAppender;
setup(() => {
appInsightsMock = new AIAdapterMock(NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX);
appender = new NodeAppInsightsTelemetryAppender(null,<any> new ContextServiceMock('123'), appInsightsMock);
appInsightsMock = new AIAdapterMock(AppInsightsAppender.EVENT_NAME_PREFIX, AppInsightsAppender.EVENT_NAME_PREFIX);
appender = new AppInsightsAppender(null,<any> new ContextServiceMock('123'), appInsightsMock);
});
teardown(() => {
......@@ -70,7 +70,7 @@ suite('Telemetry - AppInsightsTelemetryAppender', () => {
appender.log('testEvent');
assert.equal(appInsightsMock.events.length, 1);
assert.equal(appInsightsMock.events[0].eventName, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX+'/testEvent');
assert.equal(appInsightsMock.events[0].eventName, AppInsightsAppender.EVENT_NAME_PREFIX+'/testEvent');
});
test('Event with data', () => {
......@@ -81,7 +81,7 @@ suite('Telemetry - AppInsightsTelemetryAppender', () => {
});
assert.equal(appInsightsMock.events.length, 1);
assert.equal(appInsightsMock.events[0].eventName, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX+'/testEvent');
assert.equal(appInsightsMock.events[0].eventName, AppInsightsAppender.EVENT_NAME_PREFIX+'/testEvent');
assert.equal(appInsightsMock.events[0].data['title'], 'some title');
assert.equal(appInsightsMock.events[0].data['width'], 100);
......@@ -90,14 +90,14 @@ suite('Telemetry - AppInsightsTelemetryAppender', () => {
});
test('Test asimov', () => {
appender = new NodeAppInsightsTelemetryAppender(null, <any> new ContextServiceMock('123', 'AIF-123'), appInsightsMock);
appender = new AppInsightsAppender(null, <any> new ContextServiceMock('123', 'AIF-123'), appInsightsMock);
appender.log('testEvent');
assert.equal(appInsightsMock.events.length, 2);
assert.equal(appInsightsMock.events[0].eventName, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX+'/testEvent');
assert.equal(appInsightsMock.events[0].eventName, AppInsightsAppender.EVENT_NAME_PREFIX+'/testEvent');
// test vortex
assert.equal(appInsightsMock.events[1].eventName, NodeAppInsightsTelemetryAppender.EVENT_NAME_PREFIX+'/testEvent');
assert.equal(appInsightsMock.events[1].eventName, AppInsightsAppender.EVENT_NAME_PREFIX+'/testEvent');
});
});
\ No newline at end of file
......@@ -8,8 +8,6 @@ import * as assert from 'assert';
import IdleMonitor = require('vs/base/browser/idleMonitor');
import {TelemetryService} from 'vs/platform/telemetry/browser/telemetryService';
import Telemetry = require('vs/platform/telemetry/common/telemetry');
import {InstantiationService} from 'vs/platform/instantiation/common/instantiationService';
import {ServiceCollection} from 'vs/platform/instantiation/common/serviceCollection';
import Errors = require('vs/base/common/errors');
import Timer = require('vs/base/common/timer');
import * as sinon from 'sinon';
......@@ -88,7 +86,7 @@ suite('TelemetryService', () => {
class AppenderCountTelemetryService extends TelemetryService {
getAppendersCount() {
return this._appenders.length;
return this._configuration.appender.length;
}
}
......@@ -106,99 +104,9 @@ suite('TelemetryService', () => {
service.dispose();
}));
test('Add appender', sinon.test(function() {
let service = new AppenderCountTelemetryService();
assert.equal(service.getAppendersCount(), 0);
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
assert.equal(service.getAppendersCount(), 1);
service.dispose();
}));
test('Remove appender', sinon.test(function() {
let service = new AppenderCountTelemetryService();
assert.equal(service.getAppendersCount(), 0);
let testAppender = new TestTelemetryAppender();
let registration = service.addTelemetryAppender(testAppender);
assert.equal(service.getAppendersCount(), 1);
//report event
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 1);
//remove appender
registration.dispose();
assert.equal(service.getAppendersCount(), 0);
//verify events not being sent
service.publicLog('testEvent2');
assert.equal(testAppender.getEventsCount(), 1);
service.dispose();
}));
test('Multiple appenders', sinon.test(function() {
let service = new AppenderCountTelemetryService();
assert.equal(service.getAppendersCount(), 0);
let testAppender1 = new TestTelemetryAppender();
let registrgation1 = service.addTelemetryAppender(testAppender1);
assert.equal(service.getAppendersCount(), 1);
//report event
service.publicLog('testEvent');
assert.equal(testAppender1.getEventsCount(), 1);
// add second appender
let testAppender2 = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender2);
assert.equal(service.getAppendersCount(), 2);
//report event
service.publicLog('testEvent2');
assert.equal(testAppender1.getEventsCount(), 2);
assert.equal(testAppender2.getEventsCount(), 1);
//remove appender 1
registrgation1.dispose();
assert.equal(service.getAppendersCount(), 1);
//verify events not being sent to the removed appender
service.publicLog('testEvent3');
assert.equal(testAppender1.getEventsCount(), 2);
assert.equal(testAppender2.getEventsCount(), 2);
service.dispose();
}));
test('TelemetryAppendersRegistry, activate', function() {
Telemetry.Extenstions.TelemetryAppenders.registerTelemetryAppenderDescriptor(TestTelemetryAppender);
let callCount = 0;
let telemetryService: Telemetry.ITelemetryService = <any> {
addTelemetryAppender(appender) {
assert.ok(appender);
callCount += 1;
}
};
let instantiationService = new InstantiationService(new ServiceCollection([Telemetry.ITelemetryService, telemetryService]));
instantiationService.invokeFunction(Telemetry.Extenstions.TelemetryAppenders.activate);
assert.equal(callCount, 1);
// registry is now active/read-only
assert.throws(() => Telemetry.Extenstions.TelemetryAppenders.registerTelemetryAppenderDescriptor(TestTelemetryAppender));
assert.throws(() => instantiationService.invokeFunction(Telemetry.Extenstions.TelemetryAppenders.activate));
});
test('Disposing', sinon.test(function() {
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
service.publicLog('testPrivateEvent');
assert.equal(testAppender.getEventsCount(), 1);
......@@ -209,12 +117,11 @@ suite('TelemetryService', () => {
// event reporting
test('Simple event', sinon.test(function() {
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
let service = new TelemetryService({ appender: [testAppender] });
return service.getTelemetryInfo().then(info => {
service.addTelemetryAppender(testAppender);
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 1);
......@@ -228,11 +135,10 @@ suite('TelemetryService', () => {
}));
test('Event with data', sinon.test(function() {
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
let service = new TelemetryService({ appender: [testAppender] });
return service.getTelemetryInfo().then(info => {
service.addTelemetryAppender(testAppender);
service.publicLog('testEvent', {
'stringProp': 'property',
......@@ -260,9 +166,8 @@ suite('TelemetryService', () => {
test('Telemetry Timer events', sinon.test(function() {
Timer.ENABLE_TIMER = true;
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let t1 = service.timedPublicLog('editorDance');
this.clock.tick(20);
......@@ -293,9 +198,8 @@ suite('TelemetryService', () => {
}));
test('enableTelemetry on by default', sinon.test(function() {
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 1);
......@@ -310,9 +214,8 @@ suite('TelemetryService', () => {
Errors.setUnexpectedErrorHandler(() => { });
try {
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let e: any = new Error('This is a test.');
......@@ -365,9 +268,8 @@ suite('TelemetryService', () => {
test('Handle global errors', sinon.test(function() {
let errorStub = this.stub(window, 'onerror');
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let testError = new Error('test');
(<any>window.onerror)('Error Message', 'file.js', 2, 42, testError);
......@@ -390,9 +292,8 @@ suite('TelemetryService', () => {
test('Uncaught Error Telemetry removes PII from filename', sinon.test(function() {
let errorStub = this.stub(window, 'onerror');
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let dangerousFilenameError: any = new Error('dangerousFilename');
dangerousFilenameError.stack = settings.stack;
......@@ -419,9 +320,8 @@ suite('TelemetryService', () => {
Errors.setUnexpectedErrorHandler(() => { });
try {
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let dangerousPathWithoutImportantInfoError: any = new Error(settings.dangerousPathWithoutImportantInfo);
dangerousPathWithoutImportantInfoError.stack = settings.stack;
......@@ -446,9 +346,8 @@ suite('TelemetryService', () => {
test('Uncaught Error Telemetry removes PII', sinon.test(function() {
let errorStub = this.stub(window, 'onerror');
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let dangerousPathWithoutImportantInfoError: any = new Error('dangerousPathWithoutImportantInfo');
dangerousPathWithoutImportantInfoError.stack = settings.stack;
......@@ -474,9 +373,8 @@ suite('TelemetryService', () => {
try {
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let dangerousPathWithImportantInfoError: any = new Error(settings.dangerousPathWithImportantInfo);
dangerousPathWithImportantInfoError.stack = settings.stack;
......@@ -504,9 +402,8 @@ suite('TelemetryService', () => {
test('Uncaught Error Telemetry removes PII but preserves Code file path', sinon.test(function() {
let errorStub = this.stub(window, 'onerror');
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let dangerousPathWithImportantInfoError: any = new Error('dangerousPathWithImportantInfo');
dangerousPathWithImportantInfoError.stack = settings.stack;
......@@ -534,9 +431,8 @@ suite('TelemetryService', () => {
try {
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let missingModelError: any = new Error(settings.missingModelMessage);
missingModelError.stack = settings.stack;
......@@ -564,9 +460,8 @@ suite('TelemetryService', () => {
test('Uncaught Error Telemetry removes PII but preserves Missing Model error message', sinon.test(function() {
let errorStub = this.stub(window, 'onerror');
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let missingModelError: any = new Error('missingModelMessage');
missingModelError.stack = settings.stack;
......@@ -595,9 +490,8 @@ suite('TelemetryService', () => {
try {
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let noSuchFileError: any = new Error(settings.noSuchFileMessage);
noSuchFileError.stack = settings.stack;
......@@ -629,9 +523,8 @@ suite('TelemetryService', () => {
try {
let errorStub = this.stub(window, 'onerror');
let settings = new ErrorTestingSettings();
let service = new TelemetryService();
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ appender: [testAppender] });
let noSuchFileError: any = new Error('noSuchFileMessage');
noSuchFileError.stack = settings.stack;
......@@ -659,9 +552,9 @@ suite('TelemetryService', () => {
test('Test hard idle does not affect sending normal events in active state', sinon.test(function() {
let service = new TelemetryService({ enableHardIdle: true, enableSoftIdle: false });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ enableHardIdle: true, enableSoftIdle: false, appender: [testAppender] });
//report an event
service.publicLog('testEvent');
......@@ -675,9 +568,8 @@ suite('TelemetryService', () => {
test('Test hard idle stops events from being sent in idle state', sinon.test(function() {
let service = new TelemetryService({ enableHardIdle: true, enableSoftIdle: false });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ enableHardIdle: true, enableSoftIdle: false, appender: [testAppender] });
// make the user idle
this.clock.tick(IdleMonitor.DEFAULT_IDLE_TIME);
......@@ -714,9 +606,8 @@ suite('TelemetryService', () => {
this.stub(IdleMonitor, 'IdleMonitor', MockIdleMonitor);
let service = new TelemetryService({ enableHardIdle: false, enableSoftIdle: true });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({ enableHardIdle: false, enableSoftIdle: true, appender: [testAppender] });
assert.equal(testAppender.getEventsCount(), 0);
......@@ -741,7 +632,7 @@ suite('TelemetryService', () => {
test('Telemetry Service uses provided session ID', sinon.test(function() {
let testSessionId = 'test session id';
let service = new TelemetryService({ sessionID: testSessionId });
let service = new TelemetryService({ sessionID: testSessionId, appender: [] });
return service.getTelemetryInfo().then(info => {
assert.equal(info.sessionId, testSessionId);
......@@ -750,9 +641,8 @@ suite('TelemetryService', () => {
}));
test('Telemetry Service respects user opt-in settings', sinon.test(function() {
let service = new TelemetryService({userOptIn: false });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({userOptIn: false, appender: [testAppender] });
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 0);
......@@ -761,9 +651,8 @@ suite('TelemetryService', () => {
}));
test('Telemetry Service sends events when enableTelemetry is on even user optin is on', sinon.test(function() {
let service = new TelemetryService({userOptIn: true });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({userOptIn: true, appender: [testAppender] });
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 1);
......@@ -772,9 +661,8 @@ suite('TelemetryService', () => {
}));
test('Telemetry Service allows optin friendly events', sinon.test(function() {
let service = new TelemetryService({userOptIn: false });
let testAppender = new TestTelemetryAppender();
service.addTelemetryAppender(testAppender);
let service = new TelemetryService({userOptIn: false, appender: [testAppender] });
service.publicLog('testEvent');
assert.equal(testAppender.getEventsCount(), 0);
......
......@@ -62,7 +62,7 @@ import {IInstantiationService} from 'vs/platform/instantiation/common/instantiat
import {ServiceCollection} from 'vs/platform/instantiation/common/serviceCollection';
import {ILifecycleService} from 'vs/platform/lifecycle/common/lifecycle';
import {IMessageService} from 'vs/platform/message/common/message';
import {ITelemetryService, Extenstions as TelemetryExtensions} from 'vs/platform/telemetry/common/telemetry';
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
import {IThreadService} from 'vs/platform/thread/common/thread';
import {MainThreadService} from 'vs/platform/thread/common/mainThreadService';
import {IStatusbarService} from 'vs/platform/statusbar/common/statusbar';
......@@ -389,8 +389,6 @@ export class Workbench implements IPartService {
<IActionBarRegistry>Registry.as(ActionBarExtensions.Actionbar).setInstantiationService(this.instantiationService);
<IWorkbenchContributionsRegistry>Registry.as(WorkbenchExtensions.Workbench).setInstantiationService(this.instantiationService);
<IEditorRegistry>Registry.as(EditorExtensions.Editors).setInstantiationService(this.instantiationService);
this.instantiationService.invokeFunction(TelemetryExtensions.TelemetryAppenders.activate);
}
private initSettings(): void {
......
......@@ -21,6 +21,7 @@ import {Workbench} from 'vs/workbench/browser/workbench';
import {Storage, inMemoryLocalStorageInstance} from 'vs/workbench/common/storage';
import {ITelemetryService, NullTelemetryService} from 'vs/platform/telemetry/common/telemetry';
import {ElectronTelemetryService} from 'vs/platform/telemetry/electron-browser/electronTelemetryService';
import {AppInsightsAppender} from 'vs/platform/telemetry/node/appInsightsAppender';
import {ElectronIntegration} from 'vs/workbench/electron-browser/integration';
import {Update} from 'vs/workbench/electron-browser/update';
import {WorkspaceStats} from 'vs/platform/telemetry/common/workspaceStats';
......@@ -207,7 +208,8 @@ export class WorkbenchShell {
appRoot: this.configuration.env.appRoot,
extensionsRoot: this.configuration.env.userExtensionsHome,
version: this.configuration.env.version,
commitHash: this.configuration.env.commitHash
commitHash: this.configuration.env.commitHash,
appender: [new AppInsightsAppender(this.storageService, this.contextService)]
});
} else {
this.telemetryService = NullTelemetryService;
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import {Extenstions} from 'vs/platform/telemetry/common/telemetry';
import AppInsightsTelemetryAppender = require('vs/workbench/parts/telemetry/node/nodeAppInsightsTelemetryAppender');
Extenstions.TelemetryAppenders.registerTelemetryAppenderDescriptor(AppInsightsTelemetryAppender.NodeAppInsightsTelemetryAppender);
\ No newline at end of file
......@@ -74,8 +74,6 @@ define([
'vs/workbench/parts/contentprovider/common/contentprovider.contribution',
'vs/workbench/parts/telemetry/node/appInsights.telemetry.contribution',
'vs/workbench/parts/themes/electron-browser/themes.contribution',
'vs/workbench/parts/feedback/electron-browser/feedback.contribution',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册