@@ -27,8 +27,9 @@ import { PostTelemetry, TelemetryPostResponse } from "./postTelemetry";
2727
2828export class TelemetryReporterImpl implements TelemetryReporter {
2929 private activationTime : number = getCurrentUTCDateInSeconds ( ) ;
30- private disableReporter : boolean = false ;
3130 private postTelemetry : PostTelemetry = new PostTelemetry ( ) ;
31+ private onCloseEventState : { status : boolean , numOfRetries : number } = { status : false , numOfRetries : 0 } ;
32+ private readonly MAX_RETRY_ON_CLOSE = 5 ;
3233
3334 constructor (
3435 private queue : TelemetryEventQueue ,
@@ -38,14 +39,22 @@ export class TelemetryReporterImpl implements TelemetryReporter {
3839 }
3940
4041 public startEvent = ( ) : void => {
42+ this . resetOnCloseEventState ( ) ;
43+ this . retryManager . startTimer ( ) ;
44+
4145 const extensionStartEvent = ExtensionStartEvent . builder ( ) ;
42- if ( extensionStartEvent != null ) {
46+ if ( extensionStartEvent != null ) {
4347 this . addEventToQueue ( extensionStartEvent ) ;
4448 LOGGER . debug ( `Start event enqueued: ${ extensionStartEvent . getPayload } ` ) ;
45- }
49+ }
4650 }
4751
4852 public closeEvent = ( ) : void => {
53+ this . onCloseEventState = {
54+ status : true ,
55+ numOfRetries : 0
56+ } ;
57+
4958 const extensionCloseEvent = ExtensionCloseEvent . builder ( this . activationTime ) ;
5059 this . addEventToQueue ( extensionCloseEvent ) ;
5160
@@ -54,22 +63,46 @@ export class TelemetryReporterImpl implements TelemetryReporter {
5463 }
5564
5665 public addEventToQueue = ( event : BaseEvent < any > ) : void => {
57- if ( ! this . disableReporter ) {
58- this . queue . enqueue ( event ) ;
59- if ( this . retryManager . isQueueOverflow ( this . queue . size ( ) ) ) {
60- LOGGER . debug ( `Send triggered to queue size overflow` ) ;
61- if ( this . retryManager . IsMaxRetryReached ( ) ) {
62- LOGGER . debug ( 'Decreasing size of the queue' ) ;
63- this . queue . decreaseSizeOnMaxOverflow ( ) ;
64- }
65- this . sendEvents ( ) ;
66+ this . resetOnCloseEventState ( ) ;
67+
68+ this . queue . enqueue ( event ) ;
69+ if ( this . retryManager . isQueueOverflow ( this . queue . size ( ) ) ) {
70+ LOGGER . debug ( `Send triggered to queue size overflow` ) ;
71+ if ( this . retryManager . IsQueueMaxCapacityReached ( ) ) {
72+ LOGGER . debug ( 'Decreasing size of the queue as max capacity reached' ) ;
73+ this . queue . decreaseSizeOnMaxOverflow ( ) ;
74+ }
75+ this . sendEvents ( ) ;
76+ }
77+ }
78+
79+ private resetOnCloseEventState = ( ) => {
80+ this . onCloseEventState = {
81+ status : false ,
82+ numOfRetries : 0
83+ } ;
84+ }
85+
86+ private increaseRetryCountOrDisableRetry = ( ) => {
87+ if ( this . onCloseEventState . status ) {
88+ if ( this . onCloseEventState . numOfRetries < this . MAX_RETRY_ON_CLOSE && this . queue . size ( ) ) {
89+ LOGGER . debug ( "Telemetry disabled state: Increasing retry count" ) ;
90+ this . onCloseEventState . numOfRetries ++ ;
91+ } else {
92+ LOGGER . debug ( `Telemetry disabled state: ${ this . queue . size ( ) ? 'Max retries reached' : 'queue is empty' } , resetting timer` ) ;
93+ this . retryManager . clearTimer ( ) ;
94+ this . queue . flush ( ) ;
95+ this . onCloseEventState = {
96+ status : false ,
97+ numOfRetries : 0
98+ } ;
6699 }
67100 }
68101 }
69102
70103 private sendEvents = async ( ) : Promise < void > => {
71104 try {
72- if ( ! this . queue . size ( ) ) {
105+ if ( ! this . queue . size ( ) ) {
73106 LOGGER . debug ( `Queue is empty nothing to send` ) ;
74107 return ;
75108 }
@@ -84,20 +117,21 @@ export class TelemetryReporterImpl implements TelemetryReporter {
84117
85118 LOGGER . debug ( `Number of events successfully sent: ${ response . success . length } ` ) ;
86119 LOGGER . debug ( `Number of events failed to send: ${ response . failures . length } ` ) ;
87- const isResetRetryParams = this . handlePostTelemetryResponse ( response ) ;
120+ const isAllEventsSuccess = this . handlePostTelemetryResponse ( response ) ;
88121
89- this . retryManager . startTimer ( isResetRetryParams ) ;
122+ this . retryManager . startTimer ( isAllEventsSuccess ) ;
123+
124+ this . increaseRetryCountOrDisableRetry ( ) ;
90125 } catch ( err : any ) {
91- this . disableReporter = true ;
92126 LOGGER . debug ( `Error while sending telemetry: ${ isError ( err ) ? err . message : err } ` ) ;
93127 }
94128 }
95-
129+
96130 private transformEvents = ( events : BaseEvent < any > [ ] ) : BaseEvent < any > [ ] => {
97131 const jdkFeatureEvents = events . filter ( event => event . NAME === JdkFeatureEvent . NAME ) ;
98132 const concatedEvents = JdkFeatureEvent . concatEvents ( jdkFeatureEvents ) ;
99133 const removedJdkFeatureEvents = events . filter ( event => event . NAME !== JdkFeatureEvent . NAME ) ;
100-
134+
101135 return [ ...removedJdkFeatureEvents , ...concatedEvents ] ;
102136 }
103137
0 commit comments