@@ -13,6 +13,7 @@ import omnisharpLauncher from './omnisharpServerLauncher';
1313import { Disposable , CancellationToken , OutputChannel , workspace , window } from 'vscode' ;
1414import { ErrorMessage , UnresolvedDependenciesMessage , MSBuildProjectDiagnostics , ProjectInformationResponse } from './protocol' ;
1515import getLaunchTargets , { LaunchTarget } from './launchTargetFinder' ;
16+ import TelemetryReporter from 'vscode-extension-telemetry' ;
1617
1718enum 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+
5994export 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