summaryrefslogtreecommitdiff
path: root/packages/core/src
diff options
context:
space:
mode:
authorRichie Foreman <[email protected]>2025-08-13 16:37:08 -0400
committerGitHub <[email protected]>2025-08-13 20:37:08 +0000
commit2dbd5ecdc80b55cc13c81a0f836ad65ef874e8f8 (patch)
tree38dff03aac43d27f205ae5968a53b3db97023084 /packages/core/src
parent61047173a8f5bc279f480c5ab150d74337c0265a (diff)
chore(cli/slashcommands): Add status enum to SlashCommandEvent telemetry (#6166)
Diffstat (limited to 'packages/core/src')
-rw-r--r--packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts7
-rw-r--r--packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts3
-rw-r--r--packages/core/src/telemetry/index.ts4
-rw-r--r--packages/core/src/telemetry/types.ts85
4 files changed, 66 insertions, 33 deletions
diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts
index b7be2af7..9450f06d 100644
--- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts
+++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts
@@ -639,6 +639,13 @@ export class ClearcutLogger {
});
}
+ if (event.status) {
+ data.push({
+ gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_STATUS,
+ value: JSON.stringify(event.status),
+ });
+ }
+
this.enqueueLogEvent(this.createLogEvent(slash_command_event_name, data));
this.flushIfNeeded();
}
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 314e61a8..cb4172ed 100644
--- a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts
+++ b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts
@@ -174,6 +174,9 @@ export enum EventMetadataKey {
// Logs the subcommand of the slash command.
GEMINI_CLI_SLASH_COMMAND_SUBCOMMAND = 42,
+ // Logs the status of the slash command (e.g. 'success', 'error')
+ GEMINI_CLI_SLASH_COMMAND_STATUS = 51,
+
// ==========================================================================
// Next Speaker Check Event Keys
// ===========================================================================
diff --git a/packages/core/src/telemetry/index.ts b/packages/core/src/telemetry/index.ts
index 33781b87..7775802d 100644
--- a/packages/core/src/telemetry/index.ts
+++ b/packages/core/src/telemetry/index.ts
@@ -39,8 +39,10 @@ export {
ApiResponseEvent,
TelemetryEvent,
FlashFallbackEvent,
- SlashCommandEvent,
KittySequenceOverflowEvent,
+ SlashCommandEvent,
+ makeSlashCommandEvent,
+ SlashCommandStatus,
} from './types.js';
export { SpanStatusCode, ValueType } from '@opentelemetry/api';
export { SemanticAttributes } from '@opentelemetry/semantic-conventions';
diff --git a/packages/core/src/telemetry/types.ts b/packages/core/src/telemetry/types.ts
index 2b10280d..3fd16caf 100644
--- a/packages/core/src/telemetry/types.ts
+++ b/packages/core/src/telemetry/types.ts
@@ -14,9 +14,17 @@ import {
ToolCallDecision,
} from './tool-call-decision.js';
-export class StartSessionEvent {
+interface BaseTelemetryEvent {
+ 'event.name': string;
+ /** Current timestamp in ISO 8601 format */
+ 'event.timestamp': string;
+}
+
+type CommonFields = keyof BaseTelemetryEvent;
+
+export class StartSessionEvent implements BaseTelemetryEvent {
'event.name': 'cli_config';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
model: string;
embedding_model: string;
sandbox_enabled: boolean;
@@ -60,9 +68,9 @@ export class StartSessionEvent {
}
}
-export class EndSessionEvent {
+export class EndSessionEvent implements BaseTelemetryEvent {
'event.name': 'end_session';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
session_id?: string;
constructor(config?: Config) {
@@ -72,9 +80,9 @@ export class EndSessionEvent {
}
}
-export class UserPromptEvent {
+export class UserPromptEvent implements BaseTelemetryEvent {
'event.name': 'user_prompt';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
prompt_length: number;
prompt_id: string;
auth_type?: string;
@@ -95,9 +103,9 @@ export class UserPromptEvent {
}
}
-export class ToolCallEvent {
+export class ToolCallEvent implements BaseTelemetryEvent {
'event.name': 'tool_call';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
function_name: string;
function_args: Record<string, unknown>;
duration_ms: number;
@@ -142,9 +150,9 @@ export class ToolCallEvent {
}
}
-export class ApiRequestEvent {
+export class ApiRequestEvent implements BaseTelemetryEvent {
'event.name': 'api_request';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
model: string;
prompt_id: string;
request_text?: string;
@@ -158,9 +166,9 @@ export class ApiRequestEvent {
}
}
-export class ApiErrorEvent {
+export class ApiErrorEvent implements BaseTelemetryEvent {
'event.name': 'api_error';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
model: string;
error: string;
error_type?: string;
@@ -190,9 +198,9 @@ export class ApiErrorEvent {
}
}
-export class ApiResponseEvent {
+export class ApiResponseEvent implements BaseTelemetryEvent {
'event.name': 'api_response';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
model: string;
status_code?: number | string;
duration_ms: number;
@@ -234,9 +242,9 @@ export class ApiResponseEvent {
}
}
-export class FlashFallbackEvent {
+export class FlashFallbackEvent implements BaseTelemetryEvent {
'event.name': 'flash_fallback';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
auth_type: string;
constructor(auth_type: string) {
@@ -252,9 +260,9 @@ export enum LoopType {
LLM_DETECTED_LOOP = 'llm_detected_loop',
}
-export class LoopDetectedEvent {
+export class LoopDetectedEvent implements BaseTelemetryEvent {
'event.name': 'loop_detected';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
loop_type: LoopType;
prompt_id: string;
@@ -266,9 +274,9 @@ export class LoopDetectedEvent {
}
}
-export class NextSpeakerCheckEvent {
+export class NextSpeakerCheckEvent implements BaseTelemetryEvent {
'event.name': 'next_speaker_check';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
prompt_id: string;
finish_reason: string;
result: string;
@@ -282,23 +290,36 @@ export class NextSpeakerCheckEvent {
}
}
-export class SlashCommandEvent {
+export interface SlashCommandEvent extends BaseTelemetryEvent {
'event.name': 'slash_command';
'event.timestamp': string; // ISO 8106
command: string;
subcommand?: string;
+ status?: SlashCommandStatus;
+}
- constructor(command: string, subcommand?: string) {
- this['event.name'] = 'slash_command';
- this['event.timestamp'] = new Date().toISOString();
- this.command = command;
- this.subcommand = subcommand;
- }
+export function makeSlashCommandEvent({
+ command,
+ subcommand,
+ status,
+}: Omit<SlashCommandEvent, CommonFields>): SlashCommandEvent {
+ return {
+ 'event.name': 'slash_command',
+ 'event.timestamp': new Date().toISOString(),
+ command,
+ subcommand,
+ status,
+ };
+}
+
+export enum SlashCommandStatus {
+ SUCCESS = 'success',
+ ERROR = 'error',
}
-export class MalformedJsonResponseEvent {
+export class MalformedJsonResponseEvent implements BaseTelemetryEvent {
'event.name': 'malformed_json_response';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
model: string;
constructor(model: string) {
@@ -315,7 +336,7 @@ export enum IdeConnectionType {
export class IdeConnectionEvent {
'event.name': 'ide_connection';
- 'event.timestamp': string; // ISO 8601
+ 'event.timestamp': string;
connection_type: IdeConnectionType;
constructor(connection_type: IdeConnectionType) {
@@ -350,7 +371,7 @@ export type TelemetryEvent =
| FlashFallbackEvent
| LoopDetectedEvent
| NextSpeakerCheckEvent
- | SlashCommandEvent
+ | KittySequenceOverflowEvent
| MalformedJsonResponseEvent
| IdeConnectionEvent
- | KittySequenceOverflowEvent;
+ | SlashCommandEvent;