Skip to content

Commit 7ead951

Browse files
committed
AG-54780 Update session_start logic in telemetry service
1 parent b715b96 commit 7ead951

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

Extension/src/background/services/telemetry/Telemetry.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ export class Telemetry {
6969
*/
7070
private static isSessionStartInProgress = false;
7171

72+
/**
73+
* Flag indicating that session_start has been successfully sent in this
74+
* process lifetime.
75+
*/
76+
private static isSessionStartSent = false;
77+
7278
/**
7379
* Initializes telemetry service.
7480
*
@@ -257,7 +263,7 @@ export class Telemetry {
257263
* Prevents concurrent calls to avoid duplicate requests.
258264
*/
259265
private static async runSessionStart(): Promise<void> {
260-
if (!Telemetry.isAnonymizedUsageDataAllowed()) {
266+
if (!Telemetry.isAnonymizedUsageDataAllowed() || Telemetry.isSessionStartSent) {
261267
return;
262268
}
263269

@@ -283,6 +289,7 @@ export class Telemetry {
283289

284290
const response = await TelemetryApi.sendSessionStart(request);
285291
await ABTestManager.processResponse(response);
292+
Telemetry.isSessionStartSent = true;
286293
} catch (e) {
287294
logger.debug('[ext.Telemetry.runSessionStart]: session_start failed', e);
288295
} finally {

tests/src/background/telemetry/Telemetry.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ vi.mock('../../../../Extension/src/background/api', () => ({
5050
},
5151
TelemetryApi: {
5252
sendEvent: vi.fn(),
53+
sendSessionStart: vi.fn().mockResolvedValue({ versions: {} }),
5354
},
5455
}));
5556

@@ -99,6 +100,13 @@ describe('Telemetry', () => {
99100
},
100101
});
101102

103+
// Reset session start state so each test starts fresh
104+
// @ts-ignore - accessing private field for testing
105+
Telemetry.isSessionStartSent = false;
106+
// @ts-ignore - accessing private field for testing
107+
Telemetry.isSessionStartInProgress = false;
108+
vi.mocked(TelemetryApi.sendSessionStart).mockResolvedValue({ versions: {} });
109+
102110
await Telemetry.init();
103111
});
104112

@@ -200,6 +208,37 @@ describe('Telemetry', () => {
200208
});
201209
});
202210

211+
describe('session_start', () => {
212+
test('sends session_start during init when telemetry is enabled', async () => {
213+
// beforeEach calls init() with telemetry enabled
214+
expect(TelemetryApi.sendSessionStart).toHaveBeenCalledTimes(1);
215+
});
216+
217+
test('does not send session_start again on re-init', async () => {
218+
vi.clearAllMocks();
219+
await Telemetry.init();
220+
221+
expect(TelemetryApi.sendSessionStart).not.toHaveBeenCalled();
222+
});
223+
224+
test('does not send session_start when telemetry is disabled', async () => {
225+
// @ts-ignore - accessing private field for testing
226+
Telemetry.isSessionStartSent = false;
227+
// @ts-ignore - accessing private field for testing
228+
Telemetry.isSessionStartInProgress = false;
229+
vi.clearAllMocks();
230+
vi.mocked(SettingsApi.getSetting).mockImplementation((key) => {
231+
if (key === SettingOption.AllowAnonymizedUsageData) {
232+
return false;
233+
}
234+
return undefined;
235+
});
236+
await Telemetry.init();
237+
238+
expect(TelemetryApi.sendSessionStart).not.toHaveBeenCalled();
239+
});
240+
});
241+
203242
describe('experiment props', () => {
204243
test('does not include empty experiment fields in telemetry events', async () => {
205244
vi.spyOn(ABTestManager, 'getVariantsForProps').mockResolvedValue({});

0 commit comments

Comments
 (0)