Skip to content

Commit efab04d

Browse files
committed
added telemetry disable strategy
1 parent d30e061 commit efab04d

File tree

3 files changed

+56
-25
lines changed

3 files changed

+56
-25
lines changed

vscode/src/telemetry/impl/telemetryReporterImpl.ts

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ import { PostTelemetry, TelemetryPostResponse } from "./postTelemetry";
2727

2828
export 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

vscode/src/telemetry/impl/telemetryRetry.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class TelemetryRetry {
5757
}
5858

5959
private increaseTimePeriod = (): void => {
60-
if (this.numOfAttemptsWhenTimerHits <= this.TELEMETRY_RETRY_CONFIG.maxRetries) {
60+
if (this.numOfAttemptsWhenTimerHits < this.TELEMETRY_RETRY_CONFIG.maxRetries) {
6161
this.timePeriod = this.calculateDelay();
6262
this.numOfAttemptsWhenTimerHits++;
6363
return;
@@ -91,9 +91,8 @@ export class TelemetryRetry {
9191
LOGGER.debug("Keeping queue capacity same as max retries exceeded");
9292
}
9393

94-
public IsMaxRetryReached = (): boolean =>
95-
this.numOfAttemptsWhenQueueIsFull >= this.TELEMETRY_RETRY_CONFIG.maxRetries ||
96-
this.numOfAttemptsWhenTimerHits > this.TELEMETRY_RETRY_CONFIG.maxRetries
94+
public IsQueueMaxCapacityReached = (): boolean =>
95+
this.numOfAttemptsWhenQueueIsFull > this.TELEMETRY_RETRY_CONFIG.maxRetries;
9796

9897
private resetQueueCapacity = (): void => {
9998
LOGGER.debug("Resetting queue capacity to default");

vscode/src/telemetry/telemetryManager.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,11 @@ export class TelemetryManager {
7171

7272
private onTelemetryEnable = () => {
7373
LOGGER.log("Telemetry is now enabled");
74-
this.telemetryRetryManager.startTimer();
7574
this.reporter?.startEvent();
7675
}
7776

7877
private onTelemetryDisable = () => {
79-
// Remaining: Check what needs to be done when disabled
8078
LOGGER.log("Telemetry is now disabled");
81-
this.telemetryRetryManager.clearTimer();
79+
this.reporter?.closeEvent();
8280
}
8381
};

0 commit comments

Comments
 (0)