summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerop Kipruto <[email protected]>2025-06-11 21:43:00 -0400
committerGitHub <[email protected]>2025-06-11 21:43:00 -0400
commit89f682f081bbefcbf750697436ab09e8f1a2e17f (patch)
tree698a51e9aafa26ab4522d9ae247324f67d65282e
parent1ef68e061213b6b170bd979d31d4805da2357272 (diff)
Telemetry: Improve clarity of user prompt event (#967)
-rw-r--r--docs/core/telemetry.md2
-rw-r--r--packages/cli/src/ui/hooks/useGeminiStream.ts2
-rw-r--r--packages/core/src/telemetry/loggers.test.ts58
-rw-r--r--packages/core/src/telemetry/loggers.ts10
-rw-r--r--packages/core/src/telemetry/types.ts2
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;
}