feat: enhance usage statistics in qwen logger

This commit is contained in:
tanzhenxin
2025-11-21 15:17:34 +08:00
parent 640f30655d
commit 627283d357
2 changed files with 68 additions and 71 deletions

View File

@@ -286,9 +286,9 @@ describe('QwenLogger', () => {
event_type: 'action', event_type: 'action',
type: 'ide', type: 'ide',
name: 'ide_connection', name: 'ide_connection',
snapshots: JSON.stringify({ properties: {
connection_type: IdeConnectionType.SESSION, connection_type: IdeConnectionType.SESSION,
}), },
}), }),
); );
}); });
@@ -307,8 +307,10 @@ describe('QwenLogger', () => {
type: 'overflow', type: 'overflow',
name: 'kitty_sequence_overflow', name: 'kitty_sequence_overflow',
subtype: 'kitty_sequence_overflow', subtype: 'kitty_sequence_overflow',
snapshots: JSON.stringify({ properties: {
sequence_length: 1024, sequence_length: 1024,
},
snapshots: JSON.stringify({
truncated_sequence: 'truncated...', truncated_sequence: 'truncated...',
}), }),
}), }),

View File

@@ -259,7 +259,7 @@ export class QwenLogger {
: '', : '',
}, },
_v: `qwen-code@${version}`, _v: `qwen-code@${version}`,
}; } as RumPayload;
} }
flushIfNeeded(): void { flushIfNeeded(): void {
@@ -368,12 +368,10 @@ export class QwenLogger {
const applicationEvent = this.createViewEvent('session', 'session_start', { const applicationEvent = this.createViewEvent('session', 'session_start', {
properties: { properties: {
model: event.model, model: event.model,
}, approval_mode: event.approval_mode,
snapshots: JSON.stringify({
embedding_model: event.embedding_model, embedding_model: event.embedding_model,
sandbox_enabled: event.sandbox_enabled, sandbox_enabled: event.sandbox_enabled,
core_tools_enabled: event.core_tools_enabled, core_tools_enabled: event.core_tools_enabled,
approval_mode: event.approval_mode,
api_key_enabled: event.api_key_enabled, api_key_enabled: event.api_key_enabled,
vertex_ai_enabled: event.vertex_ai_enabled, vertex_ai_enabled: event.vertex_ai_enabled,
debug_enabled: event.debug_enabled, debug_enabled: event.debug_enabled,
@@ -381,7 +379,7 @@ export class QwenLogger {
telemetry_enabled: event.telemetry_enabled, telemetry_enabled: event.telemetry_enabled,
telemetry_log_user_prompts_enabled: telemetry_log_user_prompts_enabled:
event.telemetry_log_user_prompts_enabled, event.telemetry_log_user_prompts_enabled,
}), },
}); });
// Flush start event immediately // Flush start event immediately
@@ -410,10 +408,10 @@ export class QwenLogger {
'conversation', 'conversation',
'conversation_finished', 'conversation_finished',
{ {
snapshots: JSON.stringify({ properties: {
approval_mode: event.approvalMode, approval_mode: event.approvalMode,
turn_count: event.turnCount, turn_count: event.turnCount,
}), },
}, },
); );
@@ -427,10 +425,8 @@ export class QwenLogger {
properties: { properties: {
auth_type: event.auth_type, auth_type: event.auth_type,
prompt_id: event.prompt_id, prompt_id: event.prompt_id,
},
snapshots: JSON.stringify({
prompt_length: event.prompt_length, prompt_length: event.prompt_length,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -439,10 +435,10 @@ export class QwenLogger {
logSlashCommandEvent(event: SlashCommandEvent): void { logSlashCommandEvent(event: SlashCommandEvent): void {
const rumEvent = this.createActionEvent('user', 'slash_command', { const rumEvent = this.createActionEvent('user', 'slash_command', {
snapshots: JSON.stringify({ properties: {
command: event.command, command: event.command,
subcommand: event.subcommand, subcommand: event.subcommand,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -451,9 +447,9 @@ export class QwenLogger {
logModelSlashCommandEvent(event: ModelSlashCommandEvent): void { logModelSlashCommandEvent(event: ModelSlashCommandEvent): void {
const rumEvent = this.createActionEvent('user', 'model_slash_command', { const rumEvent = this.createActionEvent('user', 'model_slash_command', {
snapshots: JSON.stringify({ properties: {
model_name: event.model_name, model: event.model_name,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -469,15 +465,13 @@ export class QwenLogger {
properties: { properties: {
prompt_id: event.prompt_id, prompt_id: event.prompt_id,
response_id: event.response_id, response_id: event.response_id,
}, tool_name: event.function_name,
snapshots: JSON.stringify({ permission: event.decision,
function_name: event.function_name, success: event.success ? 1 : 0,
decision: event.decision,
success: event.success,
duration_ms: event.duration_ms, duration_ms: event.duration_ms,
error: event.error,
error_type: event.error_type, error_type: event.error_type,
}), error_message: event.error,
},
}, },
); );
@@ -490,14 +484,14 @@ export class QwenLogger {
'tool', 'tool',
`file_operation#${event.tool_name}`, `file_operation#${event.tool_name}`,
{ {
snapshots: JSON.stringify({ properties: {
tool_name: event.tool_name, tool_name: event.tool_name,
operation: event.operation, operation: event.operation,
lines: event.lines, lines: event.lines,
mimetype: event.mimetype, mimetype: event.mimetype,
extension: event.extension, extension: event.extension,
programming_language: event.programming_language, programming_language: event.programming_language,
}), },
}, },
); );
@@ -507,11 +501,15 @@ export class QwenLogger {
logSubagentExecutionEvent(event: SubagentExecutionEvent): void { logSubagentExecutionEvent(event: SubagentExecutionEvent): void {
const rumEvent = this.createActionEvent('tool', 'subagent_execution', { const rumEvent = this.createActionEvent('tool', 'subagent_execution', {
snapshots: JSON.stringify({ properties: {
subagent_name: event.subagent_name, subagent_name: event.subagent_name,
status: event.status, status: event.status,
terminate_reason: event.terminate_reason, 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 { logToolOutputTruncatedEvent(event: ToolOutputTruncatedEvent): void {
const rumEvent = this.createActionEvent('tool', 'tool_output_truncated', { const rumEvent = this.createActionEvent('tool', 'tool_output_truncated', {
snapshots: JSON.stringify({ properties: {
tool_name: event.tool_name, tool_name: event.tool_name,
},
snapshots: JSON.stringify({
original_content_length: event.original_content_length, original_content_length: event.original_content_length,
truncated_content_length: event.truncated_content_length, truncated_content_length: event.truncated_content_length,
threshold: event.threshold, threshold: event.threshold,
@@ -595,10 +595,8 @@ export class QwenLogger {
auth_type: event.auth_type, auth_type: event.auth_type,
model: event.model, model: event.model,
prompt_id: event.prompt_id, prompt_id: event.prompt_id,
},
snapshots: JSON.stringify({
error_type: event.error_type, error_type: event.error_type,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -623,11 +621,11 @@ export class QwenLogger {
{ {
subtype: 'content_retry_failure', subtype: 'content_retry_failure',
message: `Content retry failed after ${event.total_attempts} attempts`, message: `Content retry failed after ${event.total_attempts} attempts`,
snapshots: JSON.stringify({ properties: {
error_type: event.final_error_type,
total_attempts: event.total_attempts, total_attempts: event.total_attempts,
final_error_type: event.final_error_type,
total_duration_ms: event.total_duration_ms, total_duration_ms: event.total_duration_ms,
}), },
}, },
); );
@@ -656,10 +654,8 @@ export class QwenLogger {
subtype: 'loop_detected', subtype: 'loop_detected',
properties: { properties: {
prompt_id: event.prompt_id, prompt_id: event.prompt_id,
error_type: event.loop_type,
}, },
snapshots: JSON.stringify({
loop_type: event.loop_type,
}),
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -672,8 +668,10 @@ export class QwenLogger {
'kitty_sequence_overflow', 'kitty_sequence_overflow',
{ {
subtype: 'kitty_sequence_overflow', subtype: 'kitty_sequence_overflow',
snapshots: JSON.stringify({ properties: {
sequence_length: event.sequence_length, sequence_length: event.sequence_length,
},
snapshots: JSON.stringify({
truncated_sequence: event.truncated_sequence, truncated_sequence: event.truncated_sequence,
}), }),
}, },
@@ -686,7 +684,9 @@ export class QwenLogger {
// ide events // ide events
logIdeConnectionEvent(event: IdeConnectionEvent): void { logIdeConnectionEvent(event: IdeConnectionEvent): void {
const rumEvent = this.createActionEvent('ide', 'ide_connection', { const rumEvent = this.createActionEvent('ide', 'ide_connection', {
snapshots: JSON.stringify({ connection_type: event.connection_type }), properties: {
connection_type: event.connection_type,
},
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -696,12 +696,12 @@ export class QwenLogger {
// extension events // extension events
logExtensionInstallEvent(event: ExtensionInstallEvent): void { logExtensionInstallEvent(event: ExtensionInstallEvent): void {
const rumEvent = this.createActionEvent('extension', 'extension_install', { const rumEvent = this.createActionEvent('extension', 'extension_install', {
snapshots: JSON.stringify({ properties: {
extension_name: event.extension_name, extension_name: event.extension_name,
extension_version: event.extension_version, extension_version: event.extension_version,
extension_source: event.extension_source, extension_source: event.extension_source,
status: event.status, status: event.status,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -713,10 +713,10 @@ export class QwenLogger {
'extension', 'extension',
'extension_uninstall', 'extension_uninstall',
{ {
snapshots: JSON.stringify({ properties: {
extension_name: event.extension_name, extension_name: event.extension_name,
status: event.status, status: event.status,
}), },
}, },
); );
@@ -726,10 +726,10 @@ export class QwenLogger {
logExtensionEnableEvent(event: ExtensionEnableEvent): void { logExtensionEnableEvent(event: ExtensionEnableEvent): void {
const rumEvent = this.createActionEvent('extension', 'extension_enable', { const rumEvent = this.createActionEvent('extension', 'extension_enable', {
snapshots: JSON.stringify({ properties: {
extension_name: event.extension_name, extension_name: event.extension_name,
setting_scope: event.setting_scope, setting_scope: event.setting_scope,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -738,10 +738,10 @@ export class QwenLogger {
logExtensionDisableEvent(event: ExtensionDisableEvent): void { logExtensionDisableEvent(event: ExtensionDisableEvent): void {
const rumEvent = this.createActionEvent('extension', 'extension_disable', { const rumEvent = this.createActionEvent('extension', 'extension_disable', {
snapshots: JSON.stringify({ properties: {
extension_name: event.extension_name, extension_name: event.extension_name,
setting_scope: event.setting_scope, setting_scope: event.setting_scope,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -749,18 +749,15 @@ export class QwenLogger {
} }
logAuthEvent(event: AuthEvent): void { logAuthEvent(event: AuthEvent): void {
const snapshots: Record<string, unknown> = {
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', { 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); this.enqueueLogEvent(rumEvent);
@@ -781,13 +778,13 @@ export class QwenLogger {
logRipgrepFallbackEvent(event: RipgrepFallbackEvent): void { logRipgrepFallbackEvent(event: RipgrepFallbackEvent): void {
const rumEvent = this.createActionEvent('misc', 'ripgrep_fallback', { const rumEvent = this.createActionEvent('misc', 'ripgrep_fallback', {
snapshots: JSON.stringify({ properties: {
platform: process.platform, platform: process.platform,
arch: process.arch, arch: process.arch,
use_ripgrep: event.use_ripgrep, use_ripgrep: event.use_ripgrep,
use_builtin_ripgrep: event.use_builtin_ripgrep, use_builtin_ripgrep: event.use_builtin_ripgrep,
error: event.error ?? undefined, error_message: event.error,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -809,11 +806,9 @@ export class QwenLogger {
const rumEvent = this.createActionEvent('misc', 'next_speaker_check', { const rumEvent = this.createActionEvent('misc', 'next_speaker_check', {
properties: { properties: {
prompt_id: event.prompt_id, prompt_id: event.prompt_id,
},
snapshots: JSON.stringify({
finish_reason: event.finish_reason, finish_reason: event.finish_reason,
result: event.result, result: event.result,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -822,10 +817,10 @@ export class QwenLogger {
logChatCompressionEvent(event: ChatCompressionEvent): void { logChatCompressionEvent(event: ChatCompressionEvent): void {
const rumEvent = this.createActionEvent('misc', 'chat_compression', { const rumEvent = this.createActionEvent('misc', 'chat_compression', {
snapshots: JSON.stringify({ properties: {
tokens_before: event.tokens_before, tokens_before: event.tokens_before,
tokens_after: event.tokens_after, tokens_after: event.tokens_after,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);
@@ -834,11 +829,11 @@ export class QwenLogger {
logContentRetryEvent(event: ContentRetryEvent): void { logContentRetryEvent(event: ContentRetryEvent): void {
const rumEvent = this.createActionEvent('misc', 'content_retry', { const rumEvent = this.createActionEvent('misc', 'content_retry', {
snapshots: JSON.stringify({ properties: {
attempt_number: event.attempt_number,
error_type: event.error_type, error_type: event.error_type,
attempt_number: event.attempt_number,
retry_delay_ms: event.retry_delay_ms, retry_delay_ms: event.retry_delay_ms,
}), },
}); });
this.enqueueLogEvent(rumEvent); this.enqueueLogEvent(rumEvent);