Skip to content

Commit 89377d1

Browse files
Compute telemetry for OmniSharp server requests
1 parent 661c0a6 commit 89377d1

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

src/omnisharpMain.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export function activate(context: vscode.ExtensionContext): any {
4141
scheme: 'file' // only files from disk
4242
};
4343

44-
const server = new StdioOmnisharpServer();
44+
const server = new StdioOmnisharpServer(reporter);
4545
const advisor = new Advisor(server); // create before server is started
4646
const disposables: vscode.Disposable[] = [];
4747
const localDisposables: vscode.Disposable[] = [];

src/omnisharpServer.ts

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import omnisharpLauncher from './omnisharpServerLauncher';
1313
import {Disposable, CancellationToken, OutputChannel, workspace, window} from 'vscode';
1414
import {ErrorMessage, UnresolvedDependenciesMessage, MSBuildProjectDiagnostics, ProjectInformationResponse} from './protocol';
1515
import getLaunchTargets, {LaunchTarget} from './launchTargetFinder';
16+
import TelemetryReporter from 'vscode-extension-telemetry';
1617

1718
enum ServerState {
1819
Starting,
@@ -56,8 +57,45 @@ module Events {
5657
export const Started = 'started';
5758
}
5859

60+
class Delays {
61+
immediateDelays: number = 0; // 0-25 milliseconds
62+
nearImmediateDelays: number = 0; // 26-50 milliseconds
63+
shortDelays: number = 0; // 51-250 milliseconds
64+
mediumDelays: number = 0; // 251-500 milliseconds
65+
idleDelays: number = 0; // 501-1500 milliseconds
66+
nonFocusDelays: number = 0; // 1501-3000 milliseconds
67+
bigDelays: number = 0; // 3000+ milliseconds
68+
69+
public reportDelay(elapsedTime: number) {
70+
if (elapsedTime <= 25) {
71+
this.immediateDelays += 1;
72+
}
73+
else if (elapsedTime <= 50) {
74+
this.nearImmediateDelays += 1;
75+
}
76+
else if (elapsedTime <= 250) {
77+
this.shortDelays += 1;
78+
}
79+
else if (elapsedTime <= 500) {
80+
this.mediumDelays += 1;
81+
}
82+
else if (elapsedTime <= 1500) {
83+
this.idleDelays += 1;
84+
}
85+
else if (elapsedTime <= 3000) {
86+
this.nonFocusDelays += 1;
87+
}
88+
else {
89+
this.bigDelays += 1;
90+
}
91+
}
92+
}
93+
5994
export abstract class OmnisharpServer {
6095

96+
private _reporter: TelemetryReporter;
97+
private _requestDelays: { [path: string]: Delays } = {};
98+
6199
private _eventBus = new EventEmitter();
62100
private _start: Promise<void>;
63101
private _state: ServerState = ServerState.Stopped;
@@ -69,9 +107,10 @@ export abstract class OmnisharpServer {
69107
protected _serverProcess: ChildProcess;
70108
protected _extraArgv: string[];
71109

72-
constructor() {
110+
constructor(reporter: TelemetryReporter) {
73111
this._extraArgv = [];
74112
this._channel = window.createOutputChannel('OmniSharp Log');
113+
this._reporter = reporter;
75114
}
76115

77116
public isRunning(): boolean {
@@ -88,6 +127,16 @@ export abstract class OmnisharpServer {
88127
this._fireEvent(Events.StateChanged, this._state);
89128
}
90129
}
130+
131+
private _recordDelay(path: string, elapsedTime: number) {
132+
let delays = this._requestDelays[path];
133+
if (!delays) {
134+
delays = new Delays();
135+
this._requestDelays[path] = delays;
136+
}
137+
138+
delays.reportDelay(elapsedTime);
139+
}
91140

92141
public getSolutionPathOrFolder(): string {
93142
return this._solutionPath;
@@ -296,9 +345,13 @@ export abstract class OmnisharpServer {
296345
if (this._getState() !== ServerState.Started) {
297346
return Promise.reject<TResponse>('server has been stopped or not started');
298347
}
299-
348+
349+
let startTime: number;
300350
let request: Request;
351+
301352
let promise = new Promise<TResponse>((resolve, reject) => {
353+
startTime = Date.now();
354+
302355
request = {
303356
path,
304357
data,
@@ -308,7 +361,6 @@ export abstract class OmnisharpServer {
308361
};
309362

310363
this._queue.push(request);
311-
// this._statOnRequestStart(request);
312364

313365
if (this._getState() === ServerState.Started && !this._isProcessingQueue) {
314366
this._processQueue();
@@ -327,7 +379,13 @@ export abstract class OmnisharpServer {
327379
});
328380
}
329381

330-
return promise;
382+
return promise.then(response => {
383+
let endTime = Date.now();
384+
let elapsedTime = endTime - startTime;
385+
this._recordDelay(path, elapsedTime);
386+
387+
return response;
388+
});
331389
}
332390

333391
private _processQueue(): void {
@@ -346,11 +404,9 @@ export abstract class OmnisharpServer {
346404
this._makeNextRequest(thisRequest.path, thisRequest.data).then(value => {
347405
thisRequest.onSuccess(value);
348406
this._processQueue();
349-
// this._statOnRequestEnd(thisRequest, true);
350407
}, err => {
351408
thisRequest.onError(err);
352409
this._processQueue();
353-
// this._statOnRequestEnd(thisRequest, false);
354410
}).catch(err => {
355411
console.error(err);
356412
this._processQueue();
@@ -396,8 +452,8 @@ export class StdioOmnisharpServer extends OmnisharpServer {
396452
private _activeRequest: { [seq: number]: { onSuccess: Function; onError: Function; } } = Object.create(null);
397453
private _callOnStop: Function[] = [];
398454

399-
constructor() {
400-
super();
455+
constructor(reporter: TelemetryReporter) {
456+
super(reporter);
401457

402458
// extra argv
403459
this._extraArgv.push('--stdio');

0 commit comments

Comments
 (0)