From 5bc309b3dc237e6a279037531a9889bd0ff84a53 Mon Sep 17 00:00:00 2001 From: tanzhenxin Date: Tue, 18 Nov 2025 13:43:17 +0800 Subject: [PATCH] feat: add os platform and version in log report (#1053) --- .../src/telemetry/qwen-logger/event-types.ts | 17 ++++++++++++++ .../telemetry/qwen-logger/qwen-logger.test.ts | 23 ++++++++++++++++++- .../src/telemetry/qwen-logger/qwen-logger.ts | 11 +++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/core/src/telemetry/qwen-logger/event-types.ts b/packages/core/src/telemetry/qwen-logger/event-types.ts index f81fb712..ed84ba78 100644 --- a/packages/core/src/telemetry/qwen-logger/event-types.ts +++ b/packages/core/src/telemetry/qwen-logger/event-types.ts @@ -19,6 +19,21 @@ export interface RumView { name: string; } +export interface RumOS { + type?: string; + version?: string; + container?: string; + container_version?: string; +} + +export interface RumDevice { + id?: string; + name?: string; + type?: string; + brand?: string; + model?: string; +} + export interface RumEvent { timestamp?: number; event_type?: 'view' | 'action' | 'exception' | 'resource'; @@ -78,6 +93,8 @@ export interface RumPayload { user: RumUser; session: RumSession; view: RumView; + os?: RumOS; + device?: RumDevice; events: RumEvent[]; properties?: Record; _v: string; 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 8efb2e4e..9dbaa4f9 100644 --- a/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts +++ b/packages/core/src/telemetry/qwen-logger/qwen-logger.test.ts @@ -13,8 +13,10 @@ import { afterEach, afterAll, } from 'vitest'; +import * as os from 'node:os'; import { QwenLogger, TEST_ONLY } from './qwen-logger.js'; import type { Config } from '../../config/config.js'; +import { AuthType } from '../../core/contentGenerator.js'; import { StartSessionEvent, EndSessionEvent, @@ -22,7 +24,7 @@ import { KittySequenceOverflowEvent, IdeConnectionType, } from '../types.js'; -import type { RumEvent } from './event-types.js'; +import type { RumEvent, RumPayload } from './event-types.js'; // Mock dependencies vi.mock('../../utils/user_id.js', () => ({ @@ -46,6 +48,7 @@ const makeFakeConfig = (overrides: Partial = {}): Config => { getCliVersion: () => '1.0.0', getProxy: () => undefined, getContentGeneratorConfig: () => ({ authType: 'test-auth' }), + getAuthType: () => AuthType.QWEN_OAUTH, getMcpServers: () => ({}), getModel: () => 'test-model', getEmbeddingModel: () => 'test-embedding', @@ -102,6 +105,24 @@ describe('QwenLogger', () => { }); }); + describe('createRumPayload', () => { + it('includes os metadata in payload', async () => { + const logger = QwenLogger.getInstance(mockConfig)!; + const payload = await ( + logger as unknown as { + createRumPayload(): Promise; + } + ).createRumPayload(); + + expect(payload.os).toEqual( + expect.objectContaining({ + type: os.platform(), + version: os.release(), + }), + ); + }); + }); + describe('event queue management', () => { it('should handle event overflow gracefully', () => { const debugConfig = makeFakeConfig({ getDebugMode: () => true }); diff --git a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts index 96f796e4..5f9a2a51 100644 --- a/packages/core/src/telemetry/qwen-logger/qwen-logger.ts +++ b/packages/core/src/telemetry/qwen-logger/qwen-logger.ts @@ -6,6 +6,7 @@ import { Buffer } from 'buffer'; import * as https from 'https'; +import * as os from 'node:os'; import { HttpsProxyAgent } from 'https-proxy-agent'; import type { @@ -45,6 +46,7 @@ import type { RumResourceEvent, RumExceptionEvent, RumPayload, + RumOS, } from './event-types.js'; import type { Config } from '../../config/config.js'; import { safeJsonStringify } from '../../utils/safeJsonStringify.js'; @@ -214,9 +216,17 @@ export class QwenLogger { return this.createRumEvent('exception', type, name, properties); } + private getOsMetadata(): RumOS { + return { + type: os.platform(), + version: os.release(), + }; + } + async createRumPayload(): Promise { const authType = this.config?.getAuthType(); const version = this.config?.getCliVersion() || 'unknown'; + const osMetadata = this.getOsMetadata(); return { app: { @@ -235,6 +245,7 @@ export class QwenLogger { id: this.sessionId, name: 'qwen-code-cli', }, + os: osMetadata, events: this.events.toArray() as RumEvent[], properties: {