From 627283d357b8c1927719f7caceaccb51382fbca7 Mon Sep 17 00:00:00 2001 From: tanzhenxin Date: Fri, 21 Nov 2025 15:17:34 +0800 Subject: [PATCH] feat: enhance usage statistics in qwen logger --- .../telemetry/qwen-logger/qwen-logger.test.ts | 8 +- .../src/telemetry/qwen-logger/qwen-logger.ts | 131 +++++++++--------- 2 files changed, 68 insertions(+), 71 deletions(-) diff --git a/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts b/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts index 9dbaa4f9..2150ad95 100644 --- a/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts +++ b/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts @@ -286,9 +286,9 @@ describe('QwenLogger', () => { event_type: 'action', type: 'ide', name: 'ide_connection', - snapshots: JSON.stringify({ + properties: { connection_type: IdeConnectionType.SESSION, - }), + }, }), ); }); @@ -307,8 +307,10 @@ describe('QwenLogger', () => { type: 'overflow', name: 'kitty_sequence_overflow', subtype: 'kitty_sequence_overflow', - snapshots: JSON.stringify({ + properties: { sequence_length: 1024, + }, + snapshots: JSON.stringify({ truncated_sequence: 'truncated...', }), }), diff --git a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts index a56723a7..3d286b02 100644 --- a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts +++ b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts @@ -259,7 +259,7 @@ export class QwenLogger { : '', }, _v: `qwen-code@${version}`, - }; + } as RumPayload; } flushIfNeeded(): void { @@ -368,12 +368,10 @@ export class QwenLogger { const applicationEvent = this.createViewEvent('session', 'session_start', { properties: { model: event.model, - }, - snapshots: JSON.stringify({ + approval_mode: event.approval_mode, embedding_model: event.embedding_model, sandbox_enabled: event.sandbox_enabled, core_tools_enabled: event.core_tools_enabled, - approval_mode: event.approval_mode, api_key_enabled: event.api_key_enabled, vertex_ai_enabled: event.vertex_ai_enabled, debug_enabled: event.debug_enabled, @@ -381,7 +379,7 @@ export class QwenLogger { telemetry_enabled: event.telemetry_enabled, telemetry_log_user_prompts_enabled: event.telemetry_log_user_prompts_enabled, - }), + }, }); // Flush start event immediately @@ -410,10 +408,10 @@ export class QwenLogger { 'conversation', 'conversation_finished', { - snapshots: JSON.stringify({ + properties: { approval_mode: event.approvalMode, turn_count: event.turnCount, - }), + }, }, ); @@ -427,10 +425,8 @@ export class QwenLogger { properties: { auth_type: event.auth_type, prompt_id: event.prompt_id, - }, - snapshots: JSON.stringify({ prompt_length: event.prompt_length, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -439,10 +435,10 @@ export class QwenLogger { logSlashCommandEvent(event: SlashCommandEvent): void { const rumEvent = this.createActionEvent('user', 'slash_command', { - snapshots: JSON.stringify({ + properties: { command: event.command, subcommand: event.subcommand, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -451,9 +447,9 @@ export class QwenLogger { logModelSlashCommandEvent(event: ModelSlashCommandEvent): void { const rumEvent = this.createActionEvent('user', 'model_slash_command', { - snapshots: JSON.stringify({ - model_name: event.model_name, - }), + properties: { + model: event.model_name, + }, }); this.enqueueLogEvent(rumEvent); @@ -469,15 +465,13 @@ export class QwenLogger { properties: { prompt_id: event.prompt_id, response_id: event.response_id, - }, - snapshots: JSON.stringify({ - function_name: event.function_name, - decision: event.decision, - success: event.success, + tool_name: event.function_name, + permission: event.decision, + success: event.success ? 1 : 0, duration_ms: event.duration_ms, - error: event.error, error_type: event.error_type, - }), + error_message: event.error, + }, }, ); @@ -490,14 +484,14 @@ export class QwenLogger { 'tool', `file_operation#${event.tool_name}`, { - snapshots: JSON.stringify({ + properties: { tool_name: event.tool_name, operation: event.operation, lines: event.lines, mimetype: event.mimetype, extension: event.extension, programming_language: event.programming_language, - }), + }, }, ); @@ -507,11 +501,15 @@ export class QwenLogger { logSubagentExecutionEvent(event: SubagentExecutionEvent): void { const rumEvent = this.createActionEvent('tool', 'subagent_execution', { - snapshots: JSON.stringify({ + properties: { subagent_name: event.subagent_name, status: event.status, terminate_reason: event.terminate_reason, - execution_summary: event.execution_summary, + }, + snapshots: JSON.stringify({ + ...(event.execution_summary + ? { execution_summary: event.execution_summary } + : {}), }), }); @@ -521,8 +519,10 @@ export class QwenLogger { logToolOutputTruncatedEvent(event: ToolOutputTruncatedEvent): void { const rumEvent = this.createActionEvent('tool', 'tool_output_truncated', { - snapshots: JSON.stringify({ + properties: { tool_name: event.tool_name, + }, + snapshots: JSON.stringify({ original_content_length: event.original_content_length, truncated_content_length: event.truncated_content_length, threshold: event.threshold, @@ -595,10 +595,8 @@ export class QwenLogger { auth_type: event.auth_type, model: event.model, prompt_id: event.prompt_id, - }, - snapshots: JSON.stringify({ error_type: event.error_type, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -623,11 +621,11 @@ export class QwenLogger { { subtype: 'content_retry_failure', message: `Content retry failed after ${event.total_attempts} attempts`, - snapshots: JSON.stringify({ + properties: { + error_type: event.final_error_type, total_attempts: event.total_attempts, - final_error_type: event.final_error_type, total_duration_ms: event.total_duration_ms, - }), + }, }, ); @@ -656,10 +654,8 @@ export class QwenLogger { subtype: 'loop_detected', properties: { prompt_id: event.prompt_id, + error_type: event.loop_type, }, - snapshots: JSON.stringify({ - loop_type: event.loop_type, - }), }); this.enqueueLogEvent(rumEvent); @@ -672,8 +668,10 @@ export class QwenLogger { 'kitty_sequence_overflow', { subtype: 'kitty_sequence_overflow', - snapshots: JSON.stringify({ + properties: { sequence_length: event.sequence_length, + }, + snapshots: JSON.stringify({ truncated_sequence: event.truncated_sequence, }), }, @@ -686,7 +684,9 @@ export class QwenLogger { // ide events logIdeConnectionEvent(event: IdeConnectionEvent): void { const rumEvent = this.createActionEvent('ide', 'ide_connection', { - snapshots: JSON.stringify({ connection_type: event.connection_type }), + properties: { + connection_type: event.connection_type, + }, }); this.enqueueLogEvent(rumEvent); @@ -696,12 +696,12 @@ export class QwenLogger { // extension events logExtensionInstallEvent(event: ExtensionInstallEvent): void { const rumEvent = this.createActionEvent('extension', 'extension_install', { - snapshots: JSON.stringify({ + properties: { extension_name: event.extension_name, extension_version: event.extension_version, extension_source: event.extension_source, status: event.status, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -713,10 +713,10 @@ export class QwenLogger { 'extension', 'extension_uninstall', { - snapshots: JSON.stringify({ + properties: { extension_name: event.extension_name, status: event.status, - }), + }, }, ); @@ -726,10 +726,10 @@ export class QwenLogger { logExtensionEnableEvent(event: ExtensionEnableEvent): void { const rumEvent = this.createActionEvent('extension', 'extension_enable', { - snapshots: JSON.stringify({ + properties: { extension_name: event.extension_name, setting_scope: event.setting_scope, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -738,10 +738,10 @@ export class QwenLogger { logExtensionDisableEvent(event: ExtensionDisableEvent): void { const rumEvent = this.createActionEvent('extension', 'extension_disable', { - snapshots: JSON.stringify({ + properties: { extension_name: event.extension_name, setting_scope: event.setting_scope, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -749,18 +749,15 @@ export class QwenLogger { } logAuthEvent(event: AuthEvent): void { - const snapshots: Record = { - auth_type: event.auth_type, - action_type: event.action_type, - status: event.status, - }; - - if (event.error_message) { - snapshots['error_message'] = event.error_message; - } - const rumEvent = this.createActionEvent('auth', 'auth', { - snapshots: JSON.stringify(snapshots), + properties: { + auth_type: event.auth_type, + action_type: event.action_type, + success: event.status === 'success' ? 1 : 0, + error_type: event.status !== 'success' ? event.status : undefined, + error_message: + event.status === 'error' ? event.error_message : undefined, + }, }); this.enqueueLogEvent(rumEvent); @@ -781,13 +778,13 @@ export class QwenLogger { logRipgrepFallbackEvent(event: RipgrepFallbackEvent): void { const rumEvent = this.createActionEvent('misc', 'ripgrep_fallback', { - snapshots: JSON.stringify({ + properties: { platform: process.platform, arch: process.arch, use_ripgrep: event.use_ripgrep, use_builtin_ripgrep: event.use_builtin_ripgrep, - error: event.error ?? undefined, - }), + error_message: event.error, + }, }); this.enqueueLogEvent(rumEvent); @@ -809,11 +806,9 @@ export class QwenLogger { const rumEvent = this.createActionEvent('misc', 'next_speaker_check', { properties: { prompt_id: event.prompt_id, - }, - snapshots: JSON.stringify({ finish_reason: event.finish_reason, result: event.result, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -822,10 +817,10 @@ export class QwenLogger { logChatCompressionEvent(event: ChatCompressionEvent): void { const rumEvent = this.createActionEvent('misc', 'chat_compression', { - snapshots: JSON.stringify({ + properties: { tokens_before: event.tokens_before, tokens_after: event.tokens_after, - }), + }, }); this.enqueueLogEvent(rumEvent); @@ -834,11 +829,11 @@ export class QwenLogger { logContentRetryEvent(event: ContentRetryEvent): void { const rumEvent = this.createActionEvent('misc', 'content_retry', { - snapshots: JSON.stringify({ - attempt_number: event.attempt_number, + properties: { error_type: event.error_type, + attempt_number: event.attempt_number, retry_delay_ms: event.retry_delay_ms, - }), + }, }); this.enqueueLogEvent(rumEvent);