diff options
| author | Jerop Kipruto <[email protected]> | 2025-06-11 21:43:00 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-11 21:43:00 -0400 |
| commit | 89f682f081bbefcbf750697436ab09e8f1a2e17f (patch) | |
| tree | 698a51e9aafa26ab4522d9ae247324f67d65282e | |
| parent | 1ef68e061213b6b170bd979d31d4805da2357272 (diff) | |
Telemetry: Improve clarity of user prompt event (#967)
| -rw-r--r-- | docs/core/telemetry.md | 2 | ||||
| -rw-r--r-- | packages/cli/src/ui/hooks/useGeminiStream.ts | 2 | ||||
| -rw-r--r-- | packages/core/src/telemetry/loggers.test.ts | 58 | ||||
| -rw-r--r-- | packages/core/src/telemetry/loggers.ts | 10 | ||||
| -rw-r--r-- | packages/core/src/telemetry/types.ts | 2 |
5 files changed, 65 insertions, 9 deletions
diff --git a/docs/core/telemetry.md b/docs/core/telemetry.md index 695eacaf..e6498d3b 100644 --- a/docs/core/telemetry.md +++ b/docs/core/telemetry.md @@ -278,7 +278,7 @@ These are timestamped records of specific events. - `gemini_cli.user_prompt`: Fired when a user submits a prompt. - **Attributes**: - - `prompt_char_count` + - `prompt_length` - `prompt` (except if `log_user_prompts_enabled` is false) - `gemini_cli.tool_call`: Fired for every function call. diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts index 56e87fc3..e17413ef 100644 --- a/packages/cli/src/ui/hooks/useGeminiStream.ts +++ b/packages/cli/src/ui/hooks/useGeminiStream.ts @@ -188,7 +188,7 @@ export const useGeminiStream = ( const trimmedQuery = query.trim(); logUserPrompt(config, { prompt: trimmedQuery, - prompt_char_count: trimmedQuery.length, + prompt_length: trimmedQuery.length, }); onDebugMessage(`User query: '${trimmedQuery}'`); await logger?.logMessage(MessageSenderType.USER, trimmedQuery); diff --git a/packages/core/src/telemetry/loggers.test.ts b/packages/core/src/telemetry/loggers.test.ts index 283af47a..2153ef48 100644 --- a/packages/core/src/telemetry/loggers.test.ts +++ b/packages/core/src/telemetry/loggers.test.ts @@ -7,8 +7,12 @@ import { logs } from '@opentelemetry/api-logs'; import { SemanticAttributes } from '@opentelemetry/semantic-conventions'; import { Config } from '../config/config.js'; -import { EVENT_API_RESPONSE } from './constants.js'; -import { logApiResponse, logCliConfiguration } from './loggers.js'; +import { EVENT_API_RESPONSE, EVENT_USER_PROMPT } from './constants.js'; +import { + logApiResponse, + logCliConfiguration, + logUserPrompt, +} from './loggers.js'; import * as metrics from './metrics.js'; import * as sdk from './sdk.js'; import { vi, describe, beforeEach, it, expect } from 'vitest'; @@ -86,6 +90,56 @@ describe('loggers', () => { }); }); + describe('logUserPrompt', () => { + const mockConfig = { + getSessionId: () => 'test-session-id', + getTelemetryLogUserPromptsEnabled: () => true, + } as unknown as Config; + + it('should log a user prompt', () => { + const event = { + prompt: 'test-prompt', + prompt_length: 11, + }; + + logUserPrompt(mockConfig, event); + + expect(mockLogger.emit).toHaveBeenCalledWith({ + body: 'User prompt. Length: 11', + attributes: { + 'session.id': 'test-session-id', + 'event.name': EVENT_USER_PROMPT, + 'event.timestamp': '2025-01-01T00:00:00.000Z', + prompt_length: 11, + prompt: 'test-prompt', + }, + }); + }); + + it('should not log prompt if disabled', () => { + const mockConfig = { + getSessionId: () => 'test-session-id', + getTelemetryLogUserPromptsEnabled: () => false, + } as unknown as Config; + const event = { + prompt: 'test-prompt', + prompt_length: 11, + }; + + logUserPrompt(mockConfig, event); + + expect(mockLogger.emit).toHaveBeenCalledWith({ + body: 'User prompt. Length: 11', + attributes: { + 'session.id': 'test-session-id', + 'event.name': EVENT_USER_PROMPT, + 'event.timestamp': '2025-01-01T00:00:00.000Z', + prompt_length: 11, + }, + }); + }); + }); + describe('logApiResponse', () => { const mockConfig = { getSessionId: () => 'test-session-id', diff --git a/packages/core/src/telemetry/loggers.ts b/packages/core/src/telemetry/loggers.ts index c4f773b4..49a7019a 100644 --- a/packages/core/src/telemetry/loggers.ts +++ b/packages/core/src/telemetry/loggers.ts @@ -81,19 +81,21 @@ export function logUserPrompt( }, ): void { if (!isTelemetrySdkInitialized()) return; - const { prompt, ...restOfEventArgs } = event; + const attributes: LogAttributes = { ...getCommonAttributes(config), - ...restOfEventArgs, 'event.name': EVENT_USER_PROMPT, 'event.timestamp': new Date().toISOString(), + prompt_length: event.prompt_length, }; + if (shouldLogUserPrompts(config)) { - attributes.prompt = prompt; + attributes.prompt = event.prompt; } + const logger = logs.getLogger(SERVICE_NAME); const logRecord: LogRecord = { - body: `User prompt. Length: ${event.prompt_char_count}`, + body: `User prompt. Length: ${event.prompt_length}`, attributes, }; logger.emit(logRecord); diff --git a/packages/core/src/telemetry/types.ts b/packages/core/src/telemetry/types.ts index f62bd23e..da352862 100644 --- a/packages/core/src/telemetry/types.ts +++ b/packages/core/src/telemetry/types.ts @@ -7,7 +7,7 @@ export interface UserPromptEvent { 'event.name': 'user_prompt'; 'event.timestamp': string; // ISO 8601 - prompt_char_count: number; + prompt_length: number; prompt?: string; } |
