From 6db64aab2bf761c1943a42b1d04871cc224fc96b Mon Sep 17 00:00:00 2001 From: Sandy Tao Date: Mon, 27 Oct 2025 13:40:03 -0700 Subject: [PATCH] fix(telemetry): Prevent duplicate StartSessionEvent logging (#12090) --- packages/cli/src/core/initializer.ts | 7 +++++++ packages/cli/src/gemini.test.tsx | 24 ++++++++++++++++++++++++ packages/core/src/config/config.test.ts | 18 ------------------ packages/core/src/config/config.ts | 9 +-------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/packages/cli/src/core/initializer.ts b/packages/cli/src/core/initializer.ts index 089e0fb505..b7b2c6be16 100644 --- a/packages/cli/src/core/initializer.ts +++ b/packages/cli/src/core/initializer.ts @@ -10,6 +10,8 @@ import { IdeConnectionType, logIdeConnection, type Config, + StartSessionEvent, + logCliConfiguration, } from '@google/gemini-cli-core'; import { type LoadedSettings } from '../config/settings.js'; import { performInitialAuth } from './auth.js'; @@ -42,6 +44,11 @@ export async function initializeApp( const shouldOpenAuthDialog = settings.merged.security?.auth?.selectedType === undefined || !!authError; + logCliConfiguration( + config, + new StartSessionEvent(config, config.getToolRegistry()), + ); + if (config.getIdeMode()) { const ideClient = await IdeClient.getInstance(); await ideClient.connect(); diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index 8be78561b9..645928cfb1 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -174,6 +174,18 @@ describe('gemini.tsx main function', () => { getMessageBus: () => ({ subscribe: vi.fn(), }), + getToolRegistry: vi.fn(), + getContentGeneratorConfig: vi.fn(), + getModel: () => 'gemini-pro', + getEmbeddingModel: () => 'embedding-001', + getApprovalMode: () => 'default', + getCoreTools: () => [], + getTelemetryEnabled: () => false, + getTelemetryLogPromptsEnabled: () => false, + getFileFilteringRespectGitIgnore: () => true, + getOutputFormat: () => 'text', + getExtensions: () => [], + getUsageStatisticsEnabled: () => false, } as unknown as Config; }); vi.mocked(loadSettings).mockReturnValue({ @@ -309,6 +321,18 @@ describe('gemini.tsx main function kitty protocol', () => { getMessageBus: () => ({ subscribe: vi.fn(), }), + getToolRegistry: vi.fn(), + getContentGeneratorConfig: vi.fn(), + getModel: () => 'gemini-pro', + getEmbeddingModel: () => 'embedding-001', + getApprovalMode: () => 'default', + getCoreTools: () => [], + getTelemetryEnabled: () => false, + getTelemetryLogPromptsEnabled: () => false, + getFileFilteringRespectGitIgnore: () => true, + getOutputFormat: () => 'text', + getExtensions: () => [], + getUsageStatisticsEnabled: () => false, } as unknown as Config); vi.mocked(loadSettings).mockReturnValue({ errors: [], diff --git a/packages/core/src/config/config.test.ts b/packages/core/src/config/config.test.ts index d1549c5355..5c49e50ec1 100644 --- a/packages/core/src/config/config.test.ts +++ b/packages/core/src/config/config.test.ts @@ -25,8 +25,6 @@ import { } from '../core/contentGenerator.js'; import { GeminiClient } from '../core/client.js'; import { GitService } from '../services/gitService.js'; -import { ClearcutLogger } from '../telemetry/clearcut-logger/clearcut-logger.js'; - import { ShellTool } from '../tools/shell.js'; import { ReadFileTool } from '../tools/read-file.js'; import { GrepTool } from '../tools/grep.js'; @@ -180,10 +178,6 @@ describe('Server Config (config.ts)', () => { beforeEach(() => { // Reset mocks if necessary vi.clearAllMocks(); - vi.spyOn( - ClearcutLogger.prototype, - 'logStartSessionEvent', - ).mockImplementation(() => undefined); }); describe('initialize', () => { @@ -432,18 +426,6 @@ describe('Server Config (config.ts)', () => { expect(config.getUsageStatisticsEnabled()).toBe(enabled); }, ); - - it('logs the session start event', async () => { - const config = new Config({ - ...baseParams, - usageStatisticsEnabled: true, - }); - await config.refreshAuth(AuthType.USE_GEMINI); - - expect( - ClearcutLogger.prototype.logStartSessionEvent, - ).toHaveBeenCalledOnce(); - }); }); describe('Telemetry Settings', () => { diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 5e3a337218..860a166f21 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -42,7 +42,6 @@ import { uiTelemetryService, } from '../telemetry/index.js'; import { tokenLimit } from '../core/tokenLimits.js'; -import { StartSessionEvent } from '../telemetry/index.js'; import { DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_GEMINI_FLASH_MODEL, @@ -55,10 +54,7 @@ import { ideContextStore } from '../ide/ideContext.js'; import { WriteTodosTool } from '../tools/write-todos.js'; import type { FileSystemService } from '../services/fileSystemService.js'; import { StandardFileSystemService } from '../services/fileSystemService.js'; -import { - logCliConfiguration, - logRipgrepFallback, -} from '../telemetry/loggers.js'; +import { logRipgrepFallback } from '../telemetry/loggers.js'; import { RipgrepFallbackEvent } from '../telemetry/types.js'; import type { FallbackModelHandler } from '../fallback/types.js'; import { ModelRouterService } from '../routing/modelRouterService.js'; @@ -576,9 +572,6 @@ export class Config { // Reset the session flag since we're explicitly changing auth and using default model this.inFallbackMode = false; - - // Logging the cli configuration here as the auth related configuration params would have been loaded by this point - logCliConfiguration(this, new StartSessionEvent(this, this.toolRegistry)); } getUserTier(): UserTierId | undefined {