@@ -27,8 +27,9 @@ import { PostTelemetry, TelemetryPostResponse } from "./postTelemetry";
27
27
28
28
export class TelemetryReporterImpl implements TelemetryReporter {
29
29
private activationTime : number = getCurrentUTCDateInSeconds ( ) ;
30
- private disableReporter : boolean = false ;
31
30
private postTelemetry : PostTelemetry = new PostTelemetry ( ) ;
31
+ private onCloseEventState : { status : boolean , numOfRetries : number } = { status : false , numOfRetries : 0 } ;
32
+ private readonly MAX_RETRY_ON_CLOSE = 5 ;
32
33
33
34
constructor (
34
35
private queue : TelemetryEventQueue ,
@@ -38,14 +39,22 @@ export class TelemetryReporterImpl implements TelemetryReporter {
38
39
}
39
40
40
41
public startEvent = ( ) : void => {
42
+ this . resetOnCloseEventState ( ) ;
43
+ this . retryManager . startTimer ( ) ;
44
+
41
45
const extensionStartEvent = ExtensionStartEvent . builder ( ) ;
42
- if ( extensionStartEvent != null ) {
46
+ if ( extensionStartEvent != null ) {
43
47
this . addEventToQueue ( extensionStartEvent ) ;
44
48
LOGGER . debug ( `Start event enqueued: ${ extensionStartEvent . getPayload } ` ) ;
45
- }
49
+ }
46
50
}
47
51
48
52
public closeEvent = ( ) : void => {
53
+ this . onCloseEventState = {
54
+ status : true ,
55
+ numOfRetries : 0
56
+ } ;
57
+
49
58
const extensionCloseEvent = ExtensionCloseEvent . builder ( this . activationTime ) ;
50
59
this . addEventToQueue ( extensionCloseEvent ) ;
51
60
@@ -54,22 +63,46 @@ export class TelemetryReporterImpl implements TelemetryReporter {
54
63
}
55
64
56
65
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
+ } ;
66
99
}
67
100
}
68
101
}
69
102
70
103
private sendEvents = async ( ) : Promise < void > => {
71
104
try {
72
- if ( ! this . queue . size ( ) ) {
105
+ if ( ! this . queue . size ( ) ) {
73
106
LOGGER . debug ( `Queue is empty nothing to send` ) ;
74
107
return ;
75
108
}
@@ -84,20 +117,21 @@ export class TelemetryReporterImpl implements TelemetryReporter {
84
117
85
118
LOGGER . debug ( `Number of events successfully sent: ${ response . success . length } ` ) ;
86
119
LOGGER . debug ( `Number of events failed to send: ${ response . failures . length } ` ) ;
87
- const isResetRetryParams = this . handlePostTelemetryResponse ( response ) ;
120
+ const isAllEventsSuccess = this . handlePostTelemetryResponse ( response ) ;
88
121
89
- this . retryManager . startTimer ( isResetRetryParams ) ;
122
+ this . retryManager . startTimer ( isAllEventsSuccess ) ;
123
+
124
+ this . increaseRetryCountOrDisableRetry ( ) ;
90
125
} catch ( err : any ) {
91
- this . disableReporter = true ;
92
126
LOGGER . debug ( `Error while sending telemetry: ${ isError ( err ) ? err . message : err } ` ) ;
93
127
}
94
128
}
95
-
129
+
96
130
private transformEvents = ( events : BaseEvent < any > [ ] ) : BaseEvent < any > [ ] => {
97
131
const jdkFeatureEvents = events . filter ( event => event . NAME === JdkFeatureEvent . NAME ) ;
98
132
const concatedEvents = JdkFeatureEvent . concatEvents ( jdkFeatureEvents ) ;
99
133
const removedJdkFeatureEvents = events . filter ( event => event . NAME !== JdkFeatureEvent . NAME ) ;
100
-
134
+
101
135
return [ ...removedJdkFeatureEvents , ...concatedEvents ] ;
102
136
}
103
137
0 commit comments