diff --git a/packages/core/src/config/config.test.ts b/packages/core/src/config/config.test.ts index 3fb71ae8..91f91729 100644 --- a/packages/core/src/config/config.test.ts +++ b/packages/core/src/config/config.test.ts @@ -488,11 +488,12 @@ describe('Server Config (config.ts)', () => { }, ); - it('logs the session start event', () => { - new Config({ + it('logs the session start event', async () => { + const config = new Config({ ...baseParams, usageStatisticsEnabled: true, }); + await config.initialize(); expect( ClearcutLogger.prototype.logStartSessionEvent, diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index 39e885e2..349a0f83 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -346,8 +346,6 @@ export class Config { if (this.telemetrySettings.enabled) { initializeTelemetry(this); } - - logCliConfiguration(this, new StartSessionEvent(this)); } /** @@ -365,6 +363,7 @@ export class Config { } this.promptRegistry = new PromptRegistry(); this.toolRegistry = await this.createToolRegistry(); + logCliConfiguration(this, new StartSessionEvent(this, this.toolRegistry)); } async refreshAuth(authMethod: AuthType) { diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index 5663273d..32dcf926 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -382,6 +382,20 @@ export class ClearcutLogger { EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED, value: event.telemetry_log_user_prompts_enabled.toString(), }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_SERVERS_COUNT, + value: event.mcp_servers_count ? event.mcp_servers_count : '', + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_TOOLS_COUNT, + value: event.mcp_tools_count ? event.mcp_tools_count : '', + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_TOOLS, + value: event.mcp_tools ? event.mcp_tools : '', + }, ]; this.sessionData = data; diff --git a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts index 34c8d9b0..a9c39758 100644 --- a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts +++ b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts @@ -237,4 +237,13 @@ export enum EventMetadataKey { // Logs tool type whether it is mcp or native. GEMINI_CLI_TOOL_TYPE = 62, + + // Logs count of MCP servers in Start Session Event + GEMINI_CLI_START_SESSION_MCP_SERVERS_COUNT = 63, + + // Logs count of MCP tools in Start Session Event + GEMINI_CLI_START_SESSION_MCP_TOOLS_COUNT = 64, + + // Logs name of MCP tools as comma seperated string + GEMINI_CLI_START_SESSION_MCP_TOOLS = 65, } diff --git a/packages/core/src/telemetry/loggers.test.ts b/packages/core/src/telemetry/loggers.test.ts index 8097b4a4..d52cb600 100644 --- a/packages/core/src/telemetry/loggers.test.ts +++ b/packages/core/src/telemetry/loggers.test.ts @@ -63,6 +63,7 @@ describe('loggers', () => { }; beforeEach(() => { + vi.clearAllMocks(); vi.spyOn(sdk, 'isTelemetrySdkInitialized').mockReturnValue(true); vi.spyOn(logs, 'getLogger').mockReturnValue(mockLogger); vi.spyOn(uiTelemetry.uiTelemetryService, 'addEvent').mockImplementation( @@ -161,6 +162,9 @@ describe('loggers', () => { file_filtering_respect_git_ignore: true, debug_mode: true, mcp_servers: 'test-server', + mcp_servers_count: '1', + mcp_tools: undefined, + mcp_tools_count: undefined, }, }); }); diff --git a/packages/core/src/telemetry/loggers.ts b/packages/core/src/telemetry/loggers.ts index 9b9faf79..564e23b2 100644 --- a/packages/core/src/telemetry/loggers.ts +++ b/packages/core/src/telemetry/loggers.ts @@ -79,6 +79,9 @@ export function logCliConfiguration( file_filtering_respect_git_ignore: event.file_filtering_respect_git_ignore, debug_mode: event.debug_enabled, mcp_servers: event.mcp_servers, + mcp_servers_count: event.mcp_servers_count, + mcp_tools: event.mcp_tools, + mcp_tools_count: event.mcp_tools_count, }; const logger = logs.getLogger(SERVICE_NAME); diff --git a/packages/core/src/telemetry/types.ts b/packages/core/src/telemetry/types.ts index 0a49ca02..8b1b5d68 100644 --- a/packages/core/src/telemetry/types.ts +++ b/packages/core/src/telemetry/types.ts @@ -14,6 +14,7 @@ import { getDecisionFromOutcome, ToolCallDecision, } from './tool-call-decision.js'; +import { ToolRegistry } from '../tools/tool-registry.js'; export interface BaseTelemetryEvent { 'event.name': string; @@ -38,8 +39,11 @@ export class StartSessionEvent implements BaseTelemetryEvent { telemetry_enabled: boolean; telemetry_log_user_prompts_enabled: boolean; file_filtering_respect_git_ignore: boolean; + mcp_servers_count?: string; + mcp_tools_count?: string; + mcp_tools?: string; - constructor(config: Config) { + constructor(config: Config, toolRegistry?: ToolRegistry) { const generatorConfig = config.getContentGeneratorConfig(); const mcpServers = config.getMcpServers(); @@ -66,6 +70,18 @@ export class StartSessionEvent implements BaseTelemetryEvent { config.getTelemetryLogPromptsEnabled(); this.file_filtering_respect_git_ignore = config.getFileFilteringRespectGitIgnore(); + this.mcp_servers_count = mcpServers + ? Object.keys(mcpServers).length.toString() + : ''; + if (toolRegistry) { + const mcpTools = toolRegistry + .getAllTools() + .filter((tool) => tool instanceof DiscoveredMCPTool); + this.mcp_tools_count = mcpTools.length.toString(); + this.mcp_tools = mcpTools + .map((tool) => (tool as DiscoveredMCPTool).name) + .join(','); + } } }