refactor(telemetry): update session event fields to match current config

- Remove deprecated fields: embedding_model, api_key_enabled, vertex_ai_enabled, log_prompts_enabled
- Add new fields: truncate_tool_output_threshold, truncate_tool_output_lines, hooks, ide_enabled, interactive_shell_enabled

This aligns telemetry data with the current CLI configuration options.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
tanzhenxin 2026-03-15 12:06:01 +08:00
parent fed08cb1dd
commit 6e0cf6541d
5 changed files with 53 additions and 47 deletions

View file

@ -139,16 +139,16 @@ Logs are timestamped records of specific events. The following events are logged
- `qwen-code.config`: This event occurs once at startup with the CLI's configuration.
- **Attributes**:
- `model` (string)
- `embedding_model` (string)
- `sandbox_enabled` (boolean)
- `core_tools_enabled` (string)
- `approval_mode` (string)
- `api_key_enabled` (boolean)
- `vertex_ai_enabled` (boolean)
- `code_assist_enabled` (boolean)
- `log_prompts_enabled` (boolean)
- `file_filtering_respect_git_ignore` (boolean)
- `debug_mode` (boolean)
- `truncate_tool_output_threshold` (number)
- `truncate_tool_output_lines` (number)
- `hooks` (string, comma-separated hook event types, omitted if hooks disabled)
- `ide_enabled` (boolean)
- `interactive_shell_enabled` (boolean)
- `mcp_servers` (string)
- `output_format` (string: "text" or "json")

View file

@ -148,15 +148,11 @@ describe('loggers', () => {
const mockConfig = {
getSessionId: () => 'test-session-id',
getModel: () => 'test-model',
getEmbeddingModel: () => 'test-embedding-model',
getSandbox: () => true,
getCoreTools: () => ['ls', 'read-file'],
getApprovalMode: () => 'default',
getContentGeneratorConfig: () => ({
model: 'test-model',
apiKey: 'test-api-key',
authType: AuthType.USE_VERTEX_AI,
}),
getTruncateToolOutputThreshold: () => 25000,
getTruncateToolOutputLines: () => 1000,
getTelemetryEnabled: () => true,
getUsageStatisticsEnabled: () => true,
getTelemetryLogPromptsEnabled: () => true,
@ -174,6 +170,9 @@ describe('loggers', () => {
getOutputFormat: () => OutputFormat.JSON,
getToolRegistry: () => undefined,
getChatRecordingService: () => undefined,
getHookSystem: () => undefined,
getIdeMode: () => false,
getShouldUseNodePtyShell: () => true,
} as unknown as Config;
const startSessionEvent = new StartSessionEvent(mockConfig);
@ -186,19 +185,20 @@ describe('loggers', () => {
'event.name': EVENT_CLI_CONFIG,
'event.timestamp': '2025-01-01T00:00:00.000Z',
model: 'test-model',
embedding_model: 'test-embedding-model',
sandbox_enabled: true,
core_tools_enabled: 'ls,read-file',
approval_mode: 'default',
api_key_enabled: true,
vertex_ai_enabled: true,
log_user_prompts_enabled: true,
truncate_tool_output_threshold: 25000,
truncate_tool_output_lines: 1000,
file_filtering_respect_git_ignore: true,
debug_mode: true,
mcp_servers: 'test-server',
mcp_servers_count: 1,
mcp_tools: undefined,
mcp_tools_count: undefined,
hooks: undefined,
ide_enabled: false,
interactive_shell_enabled: true,
output_format: 'json',
skills: undefined,
subagents: undefined,

View file

@ -115,19 +115,20 @@ export function logStartSession(
'event.name': EVENT_CLI_CONFIG,
'event.timestamp': new Date().toISOString(),
model: event.model,
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,
log_user_prompts_enabled: event.telemetry_log_user_prompts_enabled,
file_filtering_respect_git_ignore: event.file_filtering_respect_git_ignore,
debug_mode: event.debug_enabled,
truncate_tool_output_threshold: event.truncate_tool_output_threshold,
truncate_tool_output_lines: event.truncate_tool_output_lines,
mcp_servers: event.mcp_servers,
mcp_servers_count: event.mcp_servers_count,
mcp_tools: event.mcp_tools,
mcp_tools_count: event.mcp_tools_count,
hooks: event.hooks,
ide_enabled: event.ide_enabled,
interactive_shell_enabled: event.interactive_shell_enabled,
output_format: event.output_format,
skills: event.skills,
subagents: event.subagents,

View file

@ -415,20 +415,20 @@ export class QwenLogger {
const applicationEvent = this.createViewEvent('session', 'session_start', {
properties: {
model: event.model,
approval_mode: event.approval_mode,
embedding_model: event.embedding_model,
sandbox_enabled: event.sandbox_enabled,
core_tools_enabled: event.core_tools_enabled,
api_key_enabled: event.api_key_enabled,
vertex_ai_enabled: event.vertex_ai_enabled,
debug_enabled: event.debug_enabled,
hooks: event.hooks,
ide_enabled: event.ide_enabled,
interactive_shell_enabled: event.interactive_shell_enabled,
mcp_servers: event.mcp_servers,
telemetry_enabled: event.telemetry_enabled,
telemetry_log_user_prompts_enabled:
event.telemetry_log_user_prompts_enabled,
model: event.model,
sandbox_enabled: event.sandbox_enabled,
skills: event.skills,
subagents: event.subagents,
telemetry_enabled: event.telemetry_enabled,
truncate_tool_output_lines: event.truncate_tool_output_lines,
truncate_tool_output_threshold: event.truncate_tool_output_threshold,
},
});

View file

@ -10,7 +10,7 @@ import type { ApprovalMode } from '../config/config.js';
import type { CompletedToolCall } from '../core/coreToolScheduler.js';
import { DiscoveredMCPTool } from '../tools/mcp-tool.js';
import type { FileDiff } from '../tools/tools.js';
import { AuthType } from '../core/contentGenerator.js';
import type { AuthType } from '../core/contentGenerator.js';
import {
getDecisionFromOutcome,
ToolCallDecision,
@ -35,55 +35,60 @@ export class StartSessionEvent implements BaseTelemetryEvent {
'event.timestamp': string;
session_id: string;
model: string;
embedding_model: string;
sandbox_enabled: boolean;
core_tools_enabled: string;
core_tools_enabled?: string;
approval_mode: string;
api_key_enabled: boolean;
vertex_ai_enabled: boolean;
debug_enabled: boolean;
truncate_tool_output_threshold: number;
truncate_tool_output_lines: number;
mcp_servers: string;
telemetry_enabled: boolean;
telemetry_log_user_prompts_enabled: boolean;
file_filtering_respect_git_ignore: boolean;
mcp_servers_count: number;
mcp_tools_count?: number;
mcp_tools?: string;
output_format: OutputFormat;
hooks?: string;
ide_enabled: boolean;
interactive_shell_enabled: boolean;
skills?: string;
subagents?: string;
constructor(config: Config) {
const generatorConfig = config.getContentGeneratorConfig();
const mcpServers = config.getMcpServers();
const toolRegistry = config.getToolRegistry();
let useGemini = false;
let useVertex = false;
if (generatorConfig && generatorConfig.authType) {
useGemini = generatorConfig.authType === AuthType.USE_GEMINI;
useVertex = generatorConfig.authType === AuthType.USE_VERTEX_AI;
}
this['event.name'] = 'cli_config';
this.session_id = config.getSessionId();
this.model = config.getModel();
this.embedding_model = config.getEmbeddingModel();
this.sandbox_enabled =
typeof config.getSandbox() === 'string' || !!config.getSandbox();
this.core_tools_enabled = (config.getCoreTools() ?? []).join(',');
const coreTools = (config.getCoreTools() ?? []).join(',');
if (coreTools) {
this.core_tools_enabled = coreTools;
}
this.approval_mode = config.getApprovalMode();
this.api_key_enabled = useGemini || useVertex;
this.vertex_ai_enabled = useVertex;
this.debug_enabled = config.getDebugMode();
this.truncate_tool_output_threshold =
config.getTruncateToolOutputThreshold();
this.truncate_tool_output_lines = config.getTruncateToolOutputLines();
this.mcp_servers = mcpServers ? Object.keys(mcpServers).join(',') : '';
this.telemetry_enabled = config.getTelemetryEnabled();
this.telemetry_log_user_prompts_enabled =
config.getTelemetryLogPromptsEnabled();
this.file_filtering_respect_git_ignore =
config.getFileFilteringRespectGitIgnore();
this.mcp_servers_count = mcpServers ? Object.keys(mcpServers).length : 0;
this.output_format = config.getOutputFormat();
this.ide_enabled = config.getIdeMode();
this.interactive_shell_enabled = config.getShouldUseNodePtyShell();
const hookSystem = config.getHookSystem();
if (hookSystem) {
const allHooks = hookSystem.getAllHooks();
const uniqueEventNames = [...new Set(allHooks.map((h) => h.eventName))];
if (uniqueEventNames.length > 0) {
this.hooks = uniqueEventNames.join(',');
}
}
if (toolRegistry) {
const mcpTools = toolRegistry