From 3f90001f83946f4b25a808438a7b419994440235 Mon Sep 17 00:00:00 2001 From: owenofbrien <86964623+owenofbrien@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:21:49 -0600 Subject: [PATCH] Added active experiment ids to Clearcut log events (#12745) --- .../clearcut-logger/clearcut-logger.test.ts | 38 ++++++++++++++++++- .../clearcut-logger/clearcut-logger.ts | 2 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts index 8ce24d2a59..65a1dc15da 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts @@ -42,6 +42,7 @@ interface CustomMatchers { toHaveMetadataValue: ([key, value]: [EventMetadataKey, string]) => R; toHaveEventName: (name: EventNames) => R; toHaveMetadataKey: (key: EventMetadataKey) => R; + toHaveGwsExperiments: (exps: number[]) => R; } declare module 'vitest' { @@ -92,6 +93,21 @@ expect.extend({ `event ${received} ${isNot ? 'has' : 'does not have'} the metadata key ${key}`, }; }, + + toHaveGwsExperiments(received: LogEventEntry[], expected_exps: number[]) { + const { isNot } = this; + const exps = received[0].gws_experiment; + + const pass = + exps.length === expected_exps.length && + exps.every((value, index) => value === expected_exps[index]); + + return { + pass, + message: () => + `event ${received} ${isNot ? 'has' : 'does not have'} expected exp ids: ${expected_exps.join(',')}`, + }; + }, }); vi.mock('../../utils/userAccountManager.js'); @@ -133,7 +149,11 @@ describe('ClearcutLogger', () => { }); function setup({ - config = {} as Partial, + config = { + experiments: { + experimentIds: [123, 456, 789], + }, + } as unknown as Partial, lifetimeGoogleAccounts = 1, cachedGoogleAccount = 'test@google.com', } = {}) { @@ -564,6 +584,7 @@ describe('ClearcutLogger', () => { { event_time_ms: Date.now(), source_extension_json: JSON.stringify({ event_id: i }), + gws_experiment: [], }, ]); } @@ -597,6 +618,7 @@ describe('ClearcutLogger', () => { { event_time_ms: Date.now(), source_extension_json: JSON.stringify({ event_id: `failed_${i}` }), + gws_experiment: [], }, ]); } @@ -713,6 +735,20 @@ describe('ClearcutLogger', () => { }); }); + describe('logExperiments', () => { + it('logs an event with gws_experiment field containing exp ids', () => { + const { logger } = setup(); + const event = new AgentStartEvent('agent-123', 'TestAgent'); + + logger?.logAgentStartEvent(event); + + const events = getEvents(logger!); + expect(events.length).toBe(1); + expect(events[0]).toHaveEventName(EventNames.AGENT_START); + expect(events[0]).toHaveGwsExperiments([123, 456, 789]); + }); + }); + describe('logAgentFinishEvent', () => { it('logs an event with proper fields (success)', () => { const { logger } = setup(); diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index bb9e35f1fc..e31bd40127 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -101,6 +101,7 @@ export interface LogResponse { export interface LogEventEntry { event_time_ms: number; source_extension_json: string; + gws_experiment: number[]; } export interface EventValue { @@ -236,6 +237,7 @@ export class ClearcutLogger { { event_time_ms: Date.now(), source_extension_json: safeJsonStringify(event), + gws_experiment: this.config?.getExperiments()?.experimentIds ?? [], }, ]);