diff options
| author | uttamkanodia14 <[email protected]> | 2025-07-10 00:19:30 +0530 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-09 18:49:30 +0000 |
| commit | 063481faa4b1c86868689580ff0fbd8cb04141e3 (patch) | |
| tree | f7b38f46a95cd22bbf15a7454963ba834e15d134 /packages/core/src/telemetry | |
| parent | 6c12f9e0d902c60fa5e01422018ce773c405da8d (diff) | |
Adding TurnId to Tool call and API responses and error logs. (#3039)
Co-authored-by: Scott Densmore <[email protected]>
Diffstat (limited to 'packages/core/src/telemetry')
5 files changed, 64 insertions, 5 deletions
diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index 73c82f23..a64a9795 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -265,6 +265,10 @@ export class ClearcutLogger { gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH, value: JSON.stringify(event.prompt_length), }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID, + value: JSON.stringify(event.prompt_id), + }, ]; this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data)); @@ -280,6 +284,10 @@ export class ClearcutLogger { value: JSON.stringify(event.function_name), }, { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID, + value: JSON.stringify(event.prompt_id), + }, + { gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION, value: JSON.stringify(event.decision), }, @@ -313,6 +321,10 @@ export class ClearcutLogger { gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL, value: JSON.stringify(event.model), }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID, + value: JSON.stringify(event.prompt_id), + }, ]; this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data)); @@ -328,6 +340,10 @@ export class ClearcutLogger { value: JSON.stringify(event.model), }, { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID, + value: JSON.stringify(event.prompt_id), + }, + { gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE, value: JSON.stringify(event.status_code), }, @@ -379,6 +395,10 @@ export class ClearcutLogger { value: JSON.stringify(event.model), }, { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID, + value: JSON.stringify(event.prompt_id), + }, + { gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE, value: JSON.stringify(event.error_type), }, 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 146dcdeb..e8a74936 100644 --- a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts +++ b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts @@ -137,6 +137,13 @@ export enum EventMetadataKey { // Logs the end of a session. GEMINI_CLI_END_SESSION_ID = 34, + + // ========================================================================== + // Shared Keys + // =========================================================================== + + // Logs the Prompt Id + GEMINI_CLI_PROMPT_ID = 35, } export function getEventMetadataKey( diff --git a/packages/core/src/telemetry/loggers.test.ts b/packages/core/src/telemetry/loggers.test.ts index 5b922333..e7dd721f 100644 --- a/packages/core/src/telemetry/loggers.test.ts +++ b/packages/core/src/telemetry/loggers.test.ts @@ -127,7 +127,7 @@ describe('loggers', () => { } as unknown as Config; it('should log a user prompt', () => { - const event = new UserPromptEvent(11, 'test-prompt'); + const event = new UserPromptEvent(11, 'prompt-id-8', 'test-prompt'); logUserPrompt(mockConfig, event); @@ -201,6 +201,7 @@ describe('loggers', () => { const event = new ApiResponseEvent( 'test-model', 100, + 'prompt-id-1', usageData, 'test-response', ); @@ -224,6 +225,7 @@ describe('loggers', () => { tool_token_count: 2, total_token_count: 0, response_text: 'test-response', + prompt_id: 'prompt-id-1', }, }); @@ -260,6 +262,7 @@ describe('loggers', () => { const event = new ApiResponseEvent( 'test-model', 100, + 'prompt-id-1', usageData, 'test-response', 'test-error', @@ -296,7 +299,11 @@ describe('loggers', () => { } as Config; it('should log an API request with request_text', () => { - const event = new ApiRequestEvent('test-model', 'This is a test request'); + const event = new ApiRequestEvent( + 'test-model', + 'prompt-id-7', + 'This is a test request', + ); logApiRequest(mockConfig, event); @@ -308,12 +315,13 @@ describe('loggers', () => { 'event.timestamp': '2025-01-01T00:00:00.000Z', model: 'test-model', request_text: 'This is a test request', + prompt_id: 'prompt-id-7', }, }); }); it('should log an API request without request_text', () => { - const event = new ApiRequestEvent('test-model'); + const event = new ApiRequestEvent('test-model', 'prompt-id-6'); logApiRequest(mockConfig, event); @@ -324,6 +332,7 @@ describe('loggers', () => { 'event.name': EVENT_API_REQUEST, 'event.timestamp': '2025-01-01T00:00:00.000Z', model: 'test-model', + prompt_id: 'prompt-id-6', }, }); }); @@ -394,6 +403,7 @@ describe('loggers', () => { }, callId: 'test-call-id', isClientInitiated: true, + prompt_id: 'prompt-id-1', }, response: { callId: 'test-call-id', @@ -427,6 +437,7 @@ describe('loggers', () => { duration_ms: 100, success: true, decision: ToolCallDecision.ACCEPT, + prompt_id: 'prompt-id-1', }, }); @@ -455,6 +466,7 @@ describe('loggers', () => { }, callId: 'test-call-id', isClientInitiated: true, + prompt_id: 'prompt-id-2', }, response: { callId: 'test-call-id', @@ -487,6 +499,7 @@ describe('loggers', () => { duration_ms: 100, success: false, decision: ToolCallDecision.REJECT, + prompt_id: 'prompt-id-2', }, }); @@ -516,6 +529,7 @@ describe('loggers', () => { }, callId: 'test-call-id', isClientInitiated: true, + prompt_id: 'prompt-id-3', }, response: { callId: 'test-call-id', @@ -549,6 +563,7 @@ describe('loggers', () => { duration_ms: 100, success: true, decision: ToolCallDecision.MODIFY, + prompt_id: 'prompt-id-3', }, }); @@ -578,6 +593,7 @@ describe('loggers', () => { }, callId: 'test-call-id', isClientInitiated: true, + prompt_id: 'prompt-id-4', }, response: { callId: 'test-call-id', @@ -609,6 +625,7 @@ describe('loggers', () => { ), duration_ms: 100, success: true, + prompt_id: 'prompt-id-4', }, }); @@ -638,6 +655,7 @@ describe('loggers', () => { }, callId: 'test-call-id', isClientInitiated: true, + prompt_id: 'prompt-id-5', }, response: { callId: 'test-call-id', @@ -675,6 +693,7 @@ describe('loggers', () => { 'error.message': 'test-error', error_type: 'test-error-type', 'error.type': 'test-error-type', + prompt_id: 'prompt-id-5', }, }); diff --git a/packages/core/src/telemetry/types.ts b/packages/core/src/telemetry/types.ts index 9883111a..46f86b89 100644 --- a/packages/core/src/telemetry/types.ts +++ b/packages/core/src/telemetry/types.ts @@ -95,12 +95,14 @@ export class UserPromptEvent { 'event.name': 'user_prompt'; 'event.timestamp': string; // ISO 8601 prompt_length: number; + prompt_id: string; prompt?: string; - constructor(prompt_length: number, prompt?: string) { + constructor(prompt_length: number, prompt_Id: string, prompt?: string) { this['event.name'] = 'user_prompt'; this['event.timestamp'] = new Date().toISOString(); this.prompt_length = prompt_length; + this.prompt_id = prompt_Id; this.prompt = prompt; } } @@ -115,6 +117,7 @@ export class ToolCallEvent { decision?: ToolCallDecision; error?: string; error_type?: string; + prompt_id: string; constructor(call: CompletedToolCall) { this['event.name'] = 'tool_call'; @@ -128,6 +131,7 @@ export class ToolCallEvent { : undefined; this.error = call.response.error?.message; this.error_type = call.response.error?.name; + this.prompt_id = call.request.prompt_id; } } @@ -135,12 +139,14 @@ export class ApiRequestEvent { 'event.name': 'api_request'; 'event.timestamp': string; // ISO 8601 model: string; + prompt_id: string; request_text?: string; - constructor(model: string, request_text?: string) { + constructor(model: string, prompt_id: string, request_text?: string) { this['event.name'] = 'api_request'; this['event.timestamp'] = new Date().toISOString(); this.model = model; + this.prompt_id = prompt_id; this.request_text = request_text; } } @@ -153,11 +159,13 @@ export class ApiErrorEvent { error_type?: string; status_code?: number | string; duration_ms: number; + prompt_id: string; constructor( model: string, error: string, duration_ms: number, + prompt_id: string, error_type?: string, status_code?: number | string, ) { @@ -168,6 +176,7 @@ export class ApiErrorEvent { this.error_type = error_type; this.status_code = status_code; this.duration_ms = duration_ms; + this.prompt_id = prompt_id; } } @@ -185,10 +194,12 @@ export class ApiResponseEvent { tool_token_count: number; total_token_count: number; response_text?: string; + prompt_id: string; constructor( model: string, duration_ms: number, + prompt_id: string, usage_data?: GenerateContentResponseUsageMetadata, response_text?: string, error?: string, @@ -206,6 +217,7 @@ export class ApiResponseEvent { this.total_token_count = usage_data?.totalTokenCount ?? 0; this.response_text = response_text; this.error = error; + this.prompt_id = prompt_id; } } diff --git a/packages/core/src/telemetry/uiTelemetry.test.ts b/packages/core/src/telemetry/uiTelemetry.test.ts index 9643ed97..34a2fe22 100644 --- a/packages/core/src/telemetry/uiTelemetry.test.ts +++ b/packages/core/src/telemetry/uiTelemetry.test.ts @@ -36,6 +36,7 @@ const createFakeCompletedToolCall = ( name, args: { foo: 'bar' }, isClientInitiated: false, + prompt_id: 'prompt-id-1', }; if (success) { |
