From 37034045ae93389e2eebf3a58fcb3824e7d48432 Mon Sep 17 00:00:00 2001 From: owenofbrien <86964623+owenofbrien@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:47:37 -0500 Subject: [PATCH] Fix Clearcut logging wire format (#1359) Fix for Clearcut logging wire format based on validation thread with Clearcut / Concord eng --- .../clearcut-logger/clearcut-logger.ts | 225 ++++++++++-------- 1 file changed, 121 insertions(+), 104 deletions(-) diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index edf1d952..d88c12df 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -66,7 +66,8 @@ export class ClearcutLogger { createLogEvent(name: string, data: object): object { return { - Application: 'GEMINI_CLI', + console_type: 'GEMINI_CLI', + application: 102, event_name: name, client_install_id: getPersistentUserId(), event_metadata: [data] as object[], @@ -97,7 +98,7 @@ export class ClearcutLogger { }, ]; const body = JSON.stringify(request); - if (this.config?.getDebugMode()) { + if (this.config?.getDebugMode() ?? false) { console.log('Clearcut POST request body:', body); } const options = { @@ -178,63 +179,62 @@ export class ClearcutLogger { logStartSessionEvent(event: StartSessionEvent): void { const data = [ { - EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL, + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL, value: event.model, }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EMBEDDING_MODEL, value: event.embedding_model, }, { - EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_SANDBOX, + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_SANDBOX, value: event.sandbox_enabled.toString(), }, { - EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_CORE_TOOLS, + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_CORE_TOOLS, value: event.core_tools_enabled, }, { - EventMetadataKey: - EventMetadataKey.GEMINI_CLI_START_SESSION_APPROVAL_MODE, + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_APPROVAL_MODE, value: event.approval_mode, }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_API_KEY_ENABLED, value: event.api_key_enabled.toString(), }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED, value: event.vertex_ai_enabled.toString(), }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_DEBUG_MODE_ENABLED, value: event.debug_enabled.toString(), }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED, value: event.vertex_ai_enabled.toString(), }, { - EventMetadataKey: EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_SERVERS, + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_MCP_SERVERS, value: event.mcp_servers, }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_VERTEX_API_ENABLED, value: event.vertex_ai_enabled.toString(), }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_ENABLED, value: event.telemetry_enabled.toString(), }, { - EventMetadataKey: + gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED, value: event.telemetry_log_user_prompts_enabled.toString(), }, @@ -245,124 +245,141 @@ export class ClearcutLogger { } logNewPromptEvent(event: UserPromptEvent): void { - const data: Map = new Map(); - - data.set( - EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH, - JSON.stringify(event.prompt_length), - ); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH, + value: JSON.stringify(event.prompt_length), + }, + ]; this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data)); this.flushToClearcut(); } logToolCallEvent(event: ToolCallEvent): void { - const data: Map = new Map(); - - data.set(EventMetadataKey.GEMINI_CLI_TOOL_CALL_NAME, event.function_name); - data.set( - EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION, - JSON.stringify(event.decision), - ); - data.set( - EventMetadataKey.GEMINI_CLI_TOOL_CALL_SUCCESS, - JSON.stringify(event.success), - ); - data.set( - EventMetadataKey.GEMINI_CLI_TOOL_CALL_DURATION_MS, - JSON.stringify(event.duration_ms), - ); - data.set( - EventMetadataKey.GEMINI_CLI_TOOL_ERROR_MESSAGE, - JSON.stringify(event.error), - ); - data.set( - EventMetadataKey.GEMINI_CLI_TOOL_CALL_ERROR_TYPE, - JSON.stringify(event.error_type), - ); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_NAME, + value: JSON.stringify(event.function_name), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION, + value: JSON.stringify(event.decision), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_SUCCESS, + value: JSON.stringify(event.success), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DURATION_MS, + value: JSON.stringify(event.duration_ms), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_ERROR_MESSAGE, + value: JSON.stringify(event.error), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_ERROR_TYPE, + value: JSON.stringify(event.error_type), + }, + ]; this.enqueueLogEvent(this.createLogEvent(tool_call_event_name, data)); this.flushToClearcut(); } logApiRequestEvent(event: ApiRequestEvent): void { - const data: Map = new Map(); - - data.set(EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL, event.model); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL, + value: JSON.stringify(event.model), + }, + ]; this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data)); this.flushToClearcut(); } logApiResponseEvent(event: ApiResponseEvent): void { - const data: Map = new Map(); - - data.set(EventMetadataKey.GEMINI_CLI_API_RESPONSE_MODEL, event.model); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE, - JSON.stringify(event.status_code), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_DURATION_MS, - JSON.stringify(event.duration_ms), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_ERROR_MESSAGE, - JSON.stringify(event.error), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_INPUT_TOKEN_COUNT, - JSON.stringify(event.input_token_count), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_OUTPUT_TOKEN_COUNT, - JSON.stringify(event.output_token_count), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_CACHED_TOKEN_COUNT, - JSON.stringify(event.cached_content_token_count), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_THINKING_TOKEN_COUNT, - JSON.stringify(event.thoughts_token_count), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_RESPONSE_TOOL_TOKEN_COUNT, - JSON.stringify(event.tool_token_count), - ); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_MODEL, + value: JSON.stringify(event.model), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE, + value: JSON.stringify(event.status_code), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_DURATION_MS, + value: JSON.stringify(event.duration_ms), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_MESSAGE, + value: JSON.stringify(event.error), + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_API_RESPONSE_INPUT_TOKEN_COUNT, + value: JSON.stringify(event.input_token_count), + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_API_RESPONSE_OUTPUT_TOKEN_COUNT, + value: JSON.stringify(event.output_token_count), + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_API_RESPONSE_CACHED_TOKEN_COUNT, + value: JSON.stringify(event.cached_content_token_count), + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_API_RESPONSE_THINKING_TOKEN_COUNT, + value: JSON.stringify(event.thoughts_token_count), + }, + { + gemini_cli_key: + EventMetadataKey.GEMINI_CLI_API_RESPONSE_THINKING_TOKEN_COUNT, + value: JSON.stringify(event.tool_token_count), + }, + ]; this.enqueueLogEvent(this.createLogEvent(api_response_event_name, data)); this.flushToClearcut(); } logApiErrorEvent(event: ApiErrorEvent): void { - const data: Map = new Map(); - - data.set(EventMetadataKey.GEMINI_CLI_API_ERROR_MODEL, event.model); - data.set( - EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE, - JSON.stringify(event.error_type), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_ERROR_STATUS_CODE, - JSON.stringify(event.status_code), - ); - data.set( - EventMetadataKey.GEMINI_CLI_API_ERROR_DURATION_MS, - JSON.stringify(event.duration_ms), - ); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_MODEL, + value: JSON.stringify(event.model), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE, + value: JSON.stringify(event.error_type), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_STATUS_CODE, + value: JSON.stringify(event.status_code), + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_DURATION_MS, + value: JSON.stringify(event.duration_ms), + }, + ]; this.enqueueLogEvent(this.createLogEvent(api_error_event_name, data)); this.flushToClearcut(); } logEndSessionEvent(event: EndSessionEvent): void { - const data: Map = new Map(); - - data.set( - EventMetadataKey.GEMINI_CLI_END_SESSION_ID, - event?.session_id?.toString() ?? '', - ); + const data = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_END_SESSION_ID, + value: event?.session_id?.toString() ?? '', + }, + ]; this.enqueueLogEvent(this.createLogEvent(end_session_event_name, data)); // Flush immediately on session end.