summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts')
-rw-r--r--packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts85
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);
});