summaryrefslogtreecommitdiff
path: root/packages/core/src/telemetry
diff options
context:
space:
mode:
authoruttamkanodia14 <[email protected]>2025-07-10 00:19:30 +0530
committerGitHub <[email protected]>2025-07-09 18:49:30 +0000
commit063481faa4b1c86868689580ff0fbd8cb04141e3 (patch)
treef7b38f46a95cd22bbf15a7454963ba834e15d134 /packages/core/src/telemetry
parent6c12f9e0d902c60fa5e01422018ce773c405da8d (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')
-rw-r--r--packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts20
-rw-r--r--packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts7
-rw-r--r--packages/core/src/telemetry/loggers.test.ts25
-rw-r--r--packages/core/src/telemetry/types.ts16
-rw-r--r--packages/core/src/telemetry/uiTelemetry.test.ts1
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) {