diff options
Diffstat (limited to 'packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts')
| -rw-r--r-- | packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index 200a1a0d..14551824 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -20,6 +20,7 @@ import { MalformedJsonResponseEvent, IdeConnectionEvent, KittySequenceOverflowEvent, + ChatCompressionEvent, } from '../types.js'; import { EventMetadataKey } from './event-metadata-key.js'; import { Config } from '../../config/config.js'; @@ -33,20 +34,23 @@ import { FixedDeque } from 'mnemonist'; import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js'; import { DetectedIde, detectIde } from '../../ide/detect-ide.js'; -const start_session_event_name = 'start_session'; -const new_prompt_event_name = 'new_prompt'; -const tool_call_event_name = 'tool_call'; -const api_request_event_name = 'api_request'; -const api_response_event_name = 'api_response'; -const api_error_event_name = 'api_error'; -const end_session_event_name = 'end_session'; -const flash_fallback_event_name = 'flash_fallback'; -const loop_detected_event_name = 'loop_detected'; -const next_speaker_check_event_name = 'next_speaker_check'; -const slash_command_event_name = 'slash_command'; -const malformed_json_response_event_name = 'malformed_json_response'; -const ide_connection_event_name = 'ide_connection'; -const kitty_sequence_overflow_event_name = 'kitty_sequence_overflow'; +export enum EventNames { + START_SESSION = 'start_session', + NEW_PROMPT = 'new_prompt', + TOOL_CALL = 'tool_call', + API_REQUEST = 'api_request', + API_RESPONSE = 'api_response', + API_ERROR = 'api_error', + END_SESSION = 'end_session', + FLASH_FALLBACK = 'flash_fallback', + LOOP_DETECTED = 'loop_detected', + NEXT_SPEAKER_CHECK = 'next_speaker_check', + SLASH_COMMAND = 'slash_command', + MALFORMED_JSON_RESPONSE = 'malformed_json_response', + IDE_CONNECTION = 'ide_connection', + KITTY_SEQUENCE_OVERFLOW = 'kitty_sequence_overflow', + CHAT_COMPRESSION = 'chat_compression', +} export interface LogResponse { nextRequestWaitMs?: number; @@ -58,7 +62,7 @@ export interface LogEventEntry { } export interface EventValue { - gemini_cli_key: EventMetadataKey | string; + gemini_cli_key: EventMetadataKey; value: string; } @@ -168,7 +172,7 @@ export class ClearcutLogger { ClearcutLogger.instance = undefined; } - enqueueLogEvent(event: object): void { + enqueueLogEvent(event: LogEvent): void { try { // Manually handle overflow for FixedDeque, which throws when full. const wasAtCapacity = this.events.size >= MAX_EVENTS; @@ -196,7 +200,7 @@ export class ClearcutLogger { } } - createLogEvent(name: string, data: EventValue[]): LogEvent { + createLogEvent(eventName: EventNames, data: EventValue[] = []): LogEvent { const email = getCachedGoogleAccount(); data = addDefaultFields(data); @@ -204,7 +208,7 @@ export class ClearcutLogger { const logEvent: LogEvent = { console_type: 'GEMINI_CLI', application: 102, // GEMINI_CLI - event_name: name, + event_name: eventName as string, event_metadata: [data], }; @@ -386,7 +390,7 @@ export class ClearcutLogger { ]; // Flush start event immediately - this.enqueueLogEvent(this.createLogEvent(start_session_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.START_SESSION, data)); this.flushToClearcut().catch((error) => { console.debug('Error flushing to Clearcut:', error); }); @@ -412,7 +416,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.NEW_PROMPT, data)); this.flushIfNeeded(); } @@ -466,7 +470,7 @@ export class ClearcutLogger { } } - const logEvent = this.createLogEvent(tool_call_event_name, data); + const logEvent = this.createLogEvent(EventNames.TOOL_CALL, data); this.enqueueLogEvent(logEvent); this.flushIfNeeded(); } @@ -483,7 +487,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.API_REQUEST, data)); this.flushIfNeeded(); } @@ -540,7 +544,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(api_response_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.API_RESPONSE, data)); this.flushIfNeeded(); } @@ -572,10 +576,27 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(api_error_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.API_ERROR, data)); this.flushIfNeeded(); } + logChatCompressionEvent(event: ChatCompressionEvent): void { + const data: EventValue[] = [ + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_BEFORE, + value: `${event.tokens_before}`, + }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_AFTER, + value: `${event.tokens_after}`, + }, + ]; + + this.enqueueLogEvent( + this.createLogEvent(EventNames.CHAT_COMPRESSION, data), + ); + } + logFlashFallbackEvent(event: FlashFallbackEvent): void { const data: EventValue[] = [ { @@ -588,7 +609,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(flash_fallback_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.FLASH_FALLBACK, data)); this.flushToClearcut().catch((error) => { console.debug('Error flushing to Clearcut:', error); }); @@ -606,7 +627,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(loop_detected_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.LOOP_DETECTED, data)); this.flushIfNeeded(); } @@ -631,7 +652,7 @@ export class ClearcutLogger { ]; this.enqueueLogEvent( - this.createLogEvent(next_speaker_check_event_name, data), + this.createLogEvent(EventNames.NEXT_SPEAKER_CHECK, data), ); this.flushIfNeeded(); } @@ -658,7 +679,7 @@ export class ClearcutLogger { }); } - this.enqueueLogEvent(this.createLogEvent(slash_command_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.SLASH_COMMAND, data)); this.flushIfNeeded(); } @@ -672,7 +693,7 @@ export class ClearcutLogger { ]; this.enqueueLogEvent( - this.createLogEvent(malformed_json_response_event_name, data), + this.createLogEvent(EventNames.MALFORMED_JSON_RESPONSE, data), ); this.flushIfNeeded(); } @@ -685,7 +706,7 @@ export class ClearcutLogger { }, ]; - this.enqueueLogEvent(this.createLogEvent(ide_connection_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.IDE_CONNECTION, data)); this.flushIfNeeded(); } @@ -702,7 +723,7 @@ export class ClearcutLogger { ]; this.enqueueLogEvent( - this.createLogEvent(kitty_sequence_overflow_event_name, data), + this.createLogEvent(EventNames.KITTY_SEQUENCE_OVERFLOW, data), ); this.flushIfNeeded(); } @@ -716,7 +737,7 @@ export class ClearcutLogger { ]; // Flush immediately on session end. - this.enqueueLogEvent(this.createLogEvent(end_session_event_name, data)); + this.enqueueLogEvent(this.createLogEvent(EventNames.END_SESSION, data)); this.flushToClearcut().catch((error) => { console.debug('Error flushing to Clearcut:', error); }); |
