Skip to content

Commit

Permalink
make appenders a ctor argument, first step towards oop appender, #1000
Browse files Browse the repository at this point in the history
  • Loading branch information
jrieken committed May 6, 2016
1 parent 6d0aa3b commit d99d89d
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 221 deletions.
19 changes: 4 additions & 15 deletions src/vs/platform/telemetry/browser/telemetryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -40,7 +41,6 @@ export class TelemetryService implements ITelemetryService {

protected _telemetryInfo: ITelemetryInfo;
protected _configuration: ITelemetryServiceConfig;
protected _appenders: ITelemetryAppender[] = [];
protected _disposables: IDisposable[] = [];

private _timeKeeper: TimeKeeper;
Expand All @@ -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,
Expand Down Expand Up @@ -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();
}
}
Expand Down Expand Up @@ -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);
}
}
Expand All @@ -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);
}
}
};
}
}

30 changes: 1 addition & 29 deletions src/vs/platform/telemetry/common/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand All @@ -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({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand All @@ -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';

Expand All @@ -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 = {};
Expand All @@ -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();
Expand All @@ -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);
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(() => {
Expand All @@ -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', () => {
Expand All @@ -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);
Expand All @@ -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');
});
});
Loading

0 comments on commit d99d89d

Please sign in to comment.