From f3a1b159e4e3a16b41cebe47e2182e43b6da5707 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Wed, 23 Mar 2016 14:37:28 -0700 Subject: [PATCH 1/5] Clean up OmniSharp server a bit --- src/omnisharpServer.ts | 102 +++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/src/omnisharpServer.ts b/src/omnisharpServer.ts index 7da66900de..cd433b15cb 100644 --- a/src/omnisharpServer.ts +++ b/src/omnisharpServer.ts @@ -28,6 +28,34 @@ interface Request { _enqueued: number; } +module Events { + export const StateChanged = 'stateChanged'; + + export const StdOut = 'stdout'; + export const StdErr = 'stderr'; + + export const Error = 'Error'; + export const ServerError = 'ServerError'; + + export const UnresolvedDependencies = 'UnresolvedDependencies'; + export const PackageRestoreStarted = 'PackageRestoreStarted'; + export const PackageRestoreFinished = 'PackageRestoreFinished'; + + export const ProjectChanged = 'ProjectChanged'; + export const ProjectAdded = 'ProjectAdded'; + export const ProjectRemoved = 'ProjectRemoved'; + + export const MsBuildProjectDiagnostics = 'MsBuildProjectDiagnostics'; + + export const BeforeServerStart = 'BeforeServerStart'; + export const ServerStart = 'ServerStart'; + export const ServerStop = 'ServerStop'; + + export const MultipleLaunchTargets = 'server:MultipleLaunchTargets'; + + export const Started = 'started'; +} + export abstract class OmnisharpServer { private _eventBus = new EventEmitter(); @@ -57,7 +85,7 @@ export abstract class OmnisharpServer { private _setState(value: ServerState) : void { if (typeof value !== 'undefined' && value !== this._state) { this._state = value; - this._fireEvent('stateChanged', this._state); + this._fireEvent(Events.StateChanged, this._state); } } @@ -72,67 +100,67 @@ export abstract class OmnisharpServer { // --- eventing public onStdout(listener: (e: string) => any, thisArg?: any) { - return this._addListener('stdout', listener, thisArg); + return this._addListener(Events.StdOut, listener, thisArg); } public onStderr(listener: (e: string) => any, thisArg?: any) { - return this._addListener('stderr', listener, thisArg); + return this._addListener(Events.StdErr, listener, thisArg); } public onError(listener: (e: ErrorMessage) => any, thisArg?: any) { - return this._addListener('Error', listener, thisArg); + return this._addListener(Events.Error, listener, thisArg); } public onServerError(listener: (err: any) => any, thisArg?: any) { - return this._addListener('ServerError', listener, thisArg); + return this._addListener(Events.ServerError, listener, thisArg); } public onUnresolvedDependencies(listener: (e: UnresolvedDependenciesMessage) => any, thisArg?:any) { - return this._addListener('UnresolvedDependencies', listener, thisArg); + return this._addListener(Events.UnresolvedDependencies, listener, thisArg); } public onBeforePackageRestore(listener: () => any, thisArg?: any) { - return this._addListener('PackageRestoreStarted', listener, thisArg); + return this._addListener(Events.PackageRestoreStarted, listener, thisArg); } public onPackageRestore(listener: () => any, thisArg?: any) { - return this._addListener('PackageRestoreFinished', listener, thisArg); + return this._addListener(Events.PackageRestoreFinished, listener, thisArg); } public onProjectChange(listener: (e: ProjectInformationResponse) => any, thisArg?: any) { - return this._addListener('ProjectChanged', listener, thisArg); + return this._addListener(Events.ProjectChanged, listener, thisArg); } public onProjectAdded(listener: (e: ProjectInformationResponse) => any, thisArg?: any) { - return this._addListener('ProjectAdded', listener, thisArg); + return this._addListener(Events.ProjectAdded, listener, thisArg); } public onProjectRemoved(listener: (e: ProjectInformationResponse) => any, thisArg?: any) { - return this._addListener('ProjectRemoved', listener, thisArg); + return this._addListener(Events.ProjectRemoved, listener, thisArg); } public onMsBuildProjectDiagnostics(listener: (e: MSBuildProjectDiagnostics) => any, thisArg?: any) { - return this._addListener('MsBuildProjectDiagnostics', listener, thisArg); + return this._addListener(Events.MsBuildProjectDiagnostics, listener, thisArg); } public onBeforeServerStart(listener: (e:string) => any) { - return this._addListener('BeforeServerStart', listener); + return this._addListener(Events.BeforeServerStart, listener); } public onServerStart(listener: (e: string) => any) { - return this._addListener('ServerStart', listener); + return this._addListener(Events.ServerStart, listener); } public onServerStop(listener: () => any) { - return this._addListener('ServerStop', listener); + return this._addListener(Events.ServerStop, listener); } public onMultipleLaunchTargets(listener: (targets: LaunchTarget[]) => any, thisArg?: any) { - return this._addListener('server:MultipleLaunchTargets', listener, thisArg); + return this._addListener(Events.MultipleLaunchTargets, listener, thisArg); } public onOmnisharpStart(listener: () => any) { - return this._addListener('started', listener); + return this._addListener(Events.Started, listener); } private _addListener(event: string, listener: (e: any) => any, thisArg?: any): Disposable { @@ -162,19 +190,19 @@ export abstract class OmnisharpServer { const cwd = dirname(solutionPath), argv = ['-s', solutionPath, '--hostPID', process.pid.toString(), 'dnx:enablePackageRestore=false'].concat(this._extraArgv); - this._fireEvent('stdout', `[INFO] Starting OmniSharp at '${solutionPath}'...\n`); - this._fireEvent('BeforeServerStart', solutionPath); + this._fireEvent(Events.StdOut, `[INFO] Starting OmniSharp at '${solutionPath}'...\n`); + this._fireEvent(Events.BeforeServerStart, solutionPath); return omnisharpLauncher(cwd, argv).then(value => { this._serverProcess = value.process; - this._fireEvent('stdout', `[INFO] Started OmniSharp from '${value.command}' with process id ${value.process.pid}...\n`); - this._fireEvent('ServerStart', solutionPath); + this._fireEvent(Events.StdOut, `[INFO] Started OmniSharp from '${value.command}' with process id ${value.process.pid}...\n`); + this._fireEvent(Events.ServerStart, solutionPath); this._setState(ServerState.Started); return this._doConnect(); }).then(_ => { this._processQueue(); }, err => { - this._fireEvent('ServerError', err); + this._fireEvent(Events.ServerError, err); throw err; }); } @@ -189,7 +217,8 @@ export abstract class OmnisharpServer { // nothing to kill ret = Promise.resolve(undefined); - } else if (/^win/.test(process.platform)) { + } + else if (process.platform === 'win32') { // when killing a process in windows its child // processes are *not* killed but become root // processes. Therefore we use TASKKILL.EXE @@ -199,13 +228,16 @@ export abstract class OmnisharpServer { return reject(err); } }); + killer.on('exit', resolve); killer.on('error', reject); }); - } else { + } + else { this._serverProcess.kill('SIGTERM'); ret = Promise.resolve(undefined); } + return ret.then(_ => { this._start = null; this._serverProcess = null; @@ -248,7 +280,7 @@ export abstract class OmnisharpServer { } } - this._fireEvent('server:MultipleLaunchTargets', targets); + this._fireEvent(Events.MultipleLaunchTargets, targets); return Promise.reject(undefined); } @@ -326,17 +358,6 @@ export abstract class OmnisharpServer { } protected abstract _makeNextRequest(path: string, data: any): Promise; - - // private _statOnRequestStart(request: Request): void { - // console.log(`[DEBUG] *enqueuing* request '${request.path}' (queue size is ${this._queue.length})\n`); - // } - - // private _statOnRequestEnd(request: Request, successfully: boolean): void { - // var duration = Date.now() - request._enqueued, - // state = successfully ? 'successfully' : 'with errors'; - - // console.log(`[DEBUG] request '${request.path}' finished *${state}* after ${duration}ms\n`); - // } } namespace WireProtocol { @@ -370,7 +391,6 @@ export class StdioOmnisharpServer extends OmnisharpServer { private static _seqPool = 1; private static StartupTimeout = 1000 * 60; - //private static ResponsePacketTimeout = 1000 * 60 * 15; // helps debugging private _rl: ReadLine; private _activeRequest: { [seq: number]: { onSuccess: Function; onError: Function; } } = Object.create(null); @@ -433,14 +453,15 @@ export class StdioOmnisharpServer extends OmnisharpServer { const onLineReceived = (line: string) => { if (line[0] !== '{') { - this._fireEvent('stdout', `${line}\n`); + this._fireEvent(Events.StdOut, `${line}\n`); return; } let packet: WireProtocol.Packet; try { packet = JSON.parse(line); - } catch (e) { + } + catch (e) { // not json return; } @@ -462,6 +483,7 @@ export class StdioOmnisharpServer extends OmnisharpServer { break; } }; + this._rl.addListener('line', onLineReceived); this._callOnStop.push(() => this._rl.removeListener('line', onLineReceived)); } @@ -490,7 +512,7 @@ export class StdioOmnisharpServer extends OmnisharpServer { if (packet.Event === 'log') { // handle log events const entry = <{ LogLevel: string; Name: string; Message: string; }> packet.Body; - this._fireEvent('stdout', `[${entry.LogLevel}:${entry.Name}] ${entry.Message}\n`); + this._fireEvent(Events.StdOut, `[${entry.LogLevel}:${entry.Name}] ${entry.Message}\n`); return; } else { // fwd all other events From 661c0a65299bed74e27f81045f4cb5f94bf637c4 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Wed, 23 Mar 2016 15:37:24 -0700 Subject: [PATCH 2/5] Move TelemetryReporter initialization to extension activation --- package.json | 1 - src/coreclr-debug.ts | 15 ++------------- src/omnisharpMain.ts | 10 +++++++++- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 410ace4e70..3aacce7033 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,6 @@ "windows": { "program": "./coreclr-debug/debugAdapters/OpenDebugAD7.exe" }, - "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "configurationAttributes": { "launch": { "required": [ diff --git a/src/coreclr-debug.ts b/src/coreclr-debug.ts index da1fbd4ca3..df33d9b86a 100644 --- a/src/coreclr-debug.ts +++ b/src/coreclr-debug.ts @@ -17,7 +17,7 @@ let _installLog: NodeJS.WritableStream; let _reporter: TelemetryReporter; // Telemetry reporter const _completionFileName: string = 'install.complete'; -export function installCoreClrDebug(context: vscode.ExtensionContext) { +export function installCoreClrDebug(context: vscode.ExtensionContext, reporter: TelemetryReporter) { _coreClrDebugDir = path.join(context.extensionPath, 'coreclr-debug'); _debugAdapterDir = path.join(_coreClrDebugDir, 'debugAdapters'); @@ -39,7 +39,7 @@ export function installCoreClrDebug(context: vscode.ExtensionContext) { return; } - initializeTelemetry(context); + _reporter = reporter; _channel = vscode.window.createOutputChannel('coreclr-debug'); // Create our log file and override _channel.append to also outpu to the log @@ -95,17 +95,6 @@ export function installCoreClrDebug(context: vscode.ExtensionContext) { }); } -function initializeTelemetry(context: vscode.ExtensionContext) { - // parse our own package.json into json - const packageJson = JSON.parse(fs.readFileSync(path.join(context.extensionPath, 'package.json')).toString()); - - let extensionId = packageJson["publisher"] + "." + packageJson["name"]; - let extensionVersion = packageJson["version"]; - let aiKey = packageJson.contributes.debuggers[0]["aiKey"]; - - _reporter = new TelemetryReporter(extensionId, extensionVersion, aiKey); -} - function logTelemetry(eventName: string, properties?: {[prop: string]: string}) { if (_reporter) { diff --git a/src/omnisharpMain.ts b/src/omnisharpMain.ts index 6c47afc75f..bd69dff80e 100644 --- a/src/omnisharpMain.ts +++ b/src/omnisharpMain.ts @@ -25,8 +25,16 @@ import reportStatus from './features/omnisharpStatus'; import {installCoreClrDebug} from './coreclr-debug'; import {promptToAddBuildTaskIfNecessary} from './tasks'; import * as vscode from 'vscode'; +import TelemetryReporter from 'vscode-extension-telemetry'; export function activate(context: vscode.ExtensionContext): any { + + const extensionId = 'ms-vscode.csharp'; + const extension = vscode.extensions.getExtension(extensionId); + const extensionVersion = extension.packageJSON['version']; + const aiKey = 'AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217'; + + const reporter = new TelemetryReporter(extensionId, extensionVersion, aiKey); const _selector: vscode.DocumentSelector = { language: 'csharp', @@ -81,7 +89,7 @@ export function activate(context: vscode.ExtensionContext): any { promptToAddBuildTaskIfNecessary(); // install coreclr-debug - installCoreClrDebug(context); + installCoreClrDebug(context, reporter); context.subscriptions.push(...disposables); } From 89377d1a6592409c0af2322d42826a2c19b52c9d Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Wed, 23 Mar 2016 17:11:09 -0700 Subject: [PATCH 3/5] Compute telemetry for OmniSharp server requests --- src/omnisharpMain.ts | 2 +- src/omnisharpServer.ts | 72 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/omnisharpMain.ts b/src/omnisharpMain.ts index bd69dff80e..a9482d7722 100644 --- a/src/omnisharpMain.ts +++ b/src/omnisharpMain.ts @@ -41,7 +41,7 @@ export function activate(context: vscode.ExtensionContext): any { scheme: 'file' // only files from disk }; - const server = new StdioOmnisharpServer(); + const server = new StdioOmnisharpServer(reporter); const advisor = new Advisor(server); // create before server is started const disposables: vscode.Disposable[] = []; const localDisposables: vscode.Disposable[] = []; diff --git a/src/omnisharpServer.ts b/src/omnisharpServer.ts index cd433b15cb..4ee7bdb7b1 100644 --- a/src/omnisharpServer.ts +++ b/src/omnisharpServer.ts @@ -13,6 +13,7 @@ import omnisharpLauncher from './omnisharpServerLauncher'; import {Disposable, CancellationToken, OutputChannel, workspace, window} from 'vscode'; import {ErrorMessage, UnresolvedDependenciesMessage, MSBuildProjectDiagnostics, ProjectInformationResponse} from './protocol'; import getLaunchTargets, {LaunchTarget} from './launchTargetFinder'; +import TelemetryReporter from 'vscode-extension-telemetry'; enum ServerState { Starting, @@ -56,8 +57,45 @@ module Events { export const Started = 'started'; } +class Delays { + immediateDelays: number = 0; // 0-25 milliseconds + nearImmediateDelays: number = 0; // 26-50 milliseconds + shortDelays: number = 0; // 51-250 milliseconds + mediumDelays: number = 0; // 251-500 milliseconds + idleDelays: number = 0; // 501-1500 milliseconds + nonFocusDelays: number = 0; // 1501-3000 milliseconds + bigDelays: number = 0; // 3000+ milliseconds + + public reportDelay(elapsedTime: number) { + if (elapsedTime <= 25) { + this.immediateDelays += 1; + } + else if (elapsedTime <= 50) { + this.nearImmediateDelays += 1; + } + else if (elapsedTime <= 250) { + this.shortDelays += 1; + } + else if (elapsedTime <= 500) { + this.mediumDelays += 1; + } + else if (elapsedTime <= 1500) { + this.idleDelays += 1; + } + else if (elapsedTime <= 3000) { + this.nonFocusDelays += 1; + } + else { + this.bigDelays += 1; + } + } +} + export abstract class OmnisharpServer { + private _reporter: TelemetryReporter; + private _requestDelays: { [path: string]: Delays } = {}; + private _eventBus = new EventEmitter(); private _start: Promise; private _state: ServerState = ServerState.Stopped; @@ -69,9 +107,10 @@ export abstract class OmnisharpServer { protected _serverProcess: ChildProcess; protected _extraArgv: string[]; - constructor() { + constructor(reporter: TelemetryReporter) { this._extraArgv = []; this._channel = window.createOutputChannel('OmniSharp Log'); + this._reporter = reporter; } public isRunning(): boolean { @@ -88,6 +127,16 @@ export abstract class OmnisharpServer { this._fireEvent(Events.StateChanged, this._state); } } + + private _recordDelay(path: string, elapsedTime: number) { + let delays = this._requestDelays[path]; + if (!delays) { + delays = new Delays(); + this._requestDelays[path] = delays; + } + + delays.reportDelay(elapsedTime); + } public getSolutionPathOrFolder(): string { return this._solutionPath; @@ -296,9 +345,13 @@ export abstract class OmnisharpServer { if (this._getState() !== ServerState.Started) { return Promise.reject('server has been stopped or not started'); } - + + let startTime: number; let request: Request; + let promise = new Promise((resolve, reject) => { + startTime = Date.now(); + request = { path, data, @@ -308,7 +361,6 @@ export abstract class OmnisharpServer { }; this._queue.push(request); - // this._statOnRequestStart(request); if (this._getState() === ServerState.Started && !this._isProcessingQueue) { this._processQueue(); @@ -327,7 +379,13 @@ export abstract class OmnisharpServer { }); } - return promise; + return promise.then(response => { + let endTime = Date.now(); + let elapsedTime = endTime - startTime; + this._recordDelay(path, elapsedTime); + + return response; + }); } private _processQueue(): void { @@ -346,11 +404,9 @@ export abstract class OmnisharpServer { this._makeNextRequest(thisRequest.path, thisRequest.data).then(value => { thisRequest.onSuccess(value); this._processQueue(); - // this._statOnRequestEnd(thisRequest, true); }, err => { thisRequest.onError(err); this._processQueue(); - // this._statOnRequestEnd(thisRequest, false); }).catch(err => { console.error(err); this._processQueue(); @@ -396,8 +452,8 @@ export class StdioOmnisharpServer extends OmnisharpServer { private _activeRequest: { [seq: number]: { onSuccess: Function; onError: Function; } } = Object.create(null); private _callOnStop: Function[] = []; - constructor() { - super(); + constructor(reporter: TelemetryReporter) { + super(reporter); // extra argv this._extraArgv.push('--stdio'); From 3f033aa60269be83ff3791d0978a4e47128cc40f Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Wed, 23 Mar 2016 17:38:36 -0700 Subject: [PATCH 4/5] Send telemetry for OmniSharp server requests --- src/omnisharpMain.ts | 1 + src/omnisharpServer.ts | 35 +++++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/omnisharpMain.ts b/src/omnisharpMain.ts index a9482d7722..5b69625167 100644 --- a/src/omnisharpMain.ts +++ b/src/omnisharpMain.ts @@ -82,6 +82,7 @@ export function activate(context: vscode.ExtensionContext): any { // stop server on deactivate disposables.push(new vscode.Disposable(() => { advisor.dispose(); + server.reportAndClearTelemetry(); server.stop(); })); diff --git a/src/omnisharpServer.ts b/src/omnisharpServer.ts index 4ee7bdb7b1..a80627b841 100644 --- a/src/omnisharpServer.ts +++ b/src/omnisharpServer.ts @@ -66,7 +66,7 @@ class Delays { nonFocusDelays: number = 0; // 1501-3000 milliseconds bigDelays: number = 0; // 3000+ milliseconds - public reportDelay(elapsedTime: number) { + public report(elapsedTime: number) { if (elapsedTime <= 25) { this.immediateDelays += 1; } @@ -89,12 +89,23 @@ class Delays { this.bigDelays += 1; } } + + public toMeasures(): {[key: string]: number} { + return { + immedateDelays: this.immediateDelays, + nearImmediateDelays: this.nearImmediateDelays, + shortDelays: this.shortDelays, + mediumDelays: this.mediumDelays, + idleDelays: this.idleDelays, + nonFocusDelays: this.nonFocusDelays + }; + } } export abstract class OmnisharpServer { private _reporter: TelemetryReporter; - private _requestDelays: { [path: string]: Delays } = {}; + private _telemetryDelays: { [path: string]: Delays }; private _eventBus = new EventEmitter(); private _start: Promise; @@ -129,13 +140,24 @@ export abstract class OmnisharpServer { } private _recordDelay(path: string, elapsedTime: number) { - let delays = this._requestDelays[path]; + let delays = this._telemetryDelays[path]; if (!delays) { delays = new Delays(); - this._requestDelays[path] = delays; + this._telemetryDelays[path] = delays; } - delays.reportDelay(elapsedTime); + delays.report(elapsedTime); + } + + public reportAndClearTelemetry() { + for (var path in this._telemetryDelays) { + const eventName = 'omnisharp' + path; + const measures = this._telemetryDelays[path].toMeasures(); + + this._reporter.sendTelemetryEvent(eventName, null, measures); + } + + this._telemetryDelays = null; } public getSolutionPathOrFolder(): string { @@ -244,6 +266,7 @@ export abstract class OmnisharpServer { return omnisharpLauncher(cwd, argv).then(value => { this._serverProcess = value.process; + this._telemetryDelays = {}; this._fireEvent(Events.StdOut, `[INFO] Started OmniSharp from '${value.command}' with process id ${value.process.pid}...\n`); this._fireEvent(Events.ServerStart, solutionPath); this._setState(ServerState.Started); @@ -291,7 +314,7 @@ export abstract class OmnisharpServer { this._start = null; this._serverProcess = null; this._setState(ServerState.Stopped); - this._fireEvent('ServerStop', this); + this._fireEvent(Events.ServerStop, this); return; }); } From 1e7d30adbde47716ba33a7a7ef0a30b5862968d9 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 24 Mar 2016 09:41:59 -0700 Subject: [PATCH 5/5] Code review feedback 1. Add aiKey back into package.json for debug-adapter telemetry. In addition, to avoid duplicating the aiKey, the code that constructs a TelemetryReporter once again pulls the key from the package.json. 2. A couple of renames for clarity. --- package.json | 1 + src/omnisharpMain.ts | 6 +++--- src/omnisharpServer.ts | 18 +++++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 3aacce7033..410ace4e70 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ "windows": { "program": "./coreclr-debug/debugAdapters/OpenDebugAD7.exe" }, + "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "configurationAttributes": { "launch": { "required": [ diff --git a/src/omnisharpMain.ts b/src/omnisharpMain.ts index 5b69625167..c41261a359 100644 --- a/src/omnisharpMain.ts +++ b/src/omnisharpMain.ts @@ -31,8 +31,8 @@ export function activate(context: vscode.ExtensionContext): any { const extensionId = 'ms-vscode.csharp'; const extension = vscode.extensions.getExtension(extensionId); - const extensionVersion = extension.packageJSON['version']; - const aiKey = 'AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217'; + const extensionVersion = extension.packageJSON.version; + const aiKey = extension.packageJSON.contributes.debuggers[0].aiKey; const reporter = new TelemetryReporter(extensionId, extensionVersion, aiKey); @@ -82,7 +82,7 @@ export function activate(context: vscode.ExtensionContext): any { // stop server on deactivate disposables.push(new vscode.Disposable(() => { advisor.dispose(); - server.reportAndClearTelemetry(); + server.reportAndClearTelemetry(); server.stop(); })); diff --git a/src/omnisharpServer.ts b/src/omnisharpServer.ts index a80627b841..ba225504f4 100644 --- a/src/omnisharpServer.ts +++ b/src/omnisharpServer.ts @@ -105,7 +105,7 @@ class Delays { export abstract class OmnisharpServer { private _reporter: TelemetryReporter; - private _telemetryDelays: { [path: string]: Delays }; + private _requestDelays: { [requestName: string]: Delays }; private _eventBus = new EventEmitter(); private _start: Promise; @@ -139,25 +139,25 @@ export abstract class OmnisharpServer { } } - private _recordDelay(path: string, elapsedTime: number) { - let delays = this._telemetryDelays[path]; + private _recordRequestDelay(requestName: string, elapsedTime: number) { + let delays = this._requestDelays[requestName]; if (!delays) { delays = new Delays(); - this._telemetryDelays[path] = delays; + this._requestDelays[requestName] = delays; } delays.report(elapsedTime); } public reportAndClearTelemetry() { - for (var path in this._telemetryDelays) { + for (var path in this._requestDelays) { const eventName = 'omnisharp' + path; - const measures = this._telemetryDelays[path].toMeasures(); + const measures = this._requestDelays[path].toMeasures(); this._reporter.sendTelemetryEvent(eventName, null, measures); } - this._telemetryDelays = null; + this._requestDelays = null; } public getSolutionPathOrFolder(): string { @@ -266,7 +266,7 @@ export abstract class OmnisharpServer { return omnisharpLauncher(cwd, argv).then(value => { this._serverProcess = value.process; - this._telemetryDelays = {}; + this._requestDelays = {}; this._fireEvent(Events.StdOut, `[INFO] Started OmniSharp from '${value.command}' with process id ${value.process.pid}...\n`); this._fireEvent(Events.ServerStart, solutionPath); this._setState(ServerState.Started); @@ -405,7 +405,7 @@ export abstract class OmnisharpServer { return promise.then(response => { let endTime = Date.now(); let elapsedTime = endTime - startTime; - this._recordDelay(path, elapsedTime); + this._recordRequestDelay(path, elapsedTime); return response; });