遥测分析系统
Claude Code 的分析系统采用 双 Sink 管道 架构,同时向 Datadog 和 1P (First-Party) 后端发送事件。
架构
事件产生
│
├── 事件采样 (per-event-name sampling config)
│
├── Sink 1: Datadog
│ ├── 白名单过滤(仅允许的事件类型)
│ └── Datadog API → 异步批量发送
│
└── Sink 2: 1P (First-Party)
├── OpenTelemetry BatchLogRecordProcessor
└── 自定义后端 → 异步批量发送核心 API
typescript
// 记录事件
function logEvent(
eventName: string,
properties?: AnalyticsProperties,
metadata?: AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS
): void
// 安全标记类型 — 防止意外泄露代码或文件路径
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS = {
[key: string]: string | number | boolean | null
}Datadog Sink
typescript
// 允许事件白名单(部分)— 实际是 Set 类型
const DATADOG_ALLOWED_EVENTS = new Set([
'session_start',
'session_end',
'query_start',
'query_end',
'tool_use',
'error',
'compact',
'permission_check',
// ...约 50 个事件类型
])
// 事件不在白名单中 → 静默丢弃1P Sink
typescript
// 基于 OpenTelemetry
import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs'
// 批量处理
const processor = new BatchLogRecordProcessor(exporter, {
maxExportBatchSize: 100,
scheduledDelayMillis: 5000, // 5 秒批次
exportTimeoutMillis: 30000,
})事件采样
typescript
// 事件采样:通过远程配置(EVENT_SAMPLING_CONFIG_NAME = 'tengu_event_sampling_config')
// 控制每个事件的采样率,非本地硬编码常量
// 示例配置格式:
// {
// 'keystroke': 0.01, // 1% 采样
// 'render_frame': 0.001, // 0.1% 采样
// 'query_start': 1.0, // 100% 采样
// 'error': 1.0, // 100% 采样
// }GrowthBook 特性门控
GrowthBook 集成用于运行时特性门控(src/services/analytics/growthbook.ts)。通过 getGrowthBookConfigOverrides 等函数配置,属性包括 userId、platform、version、build 等。
缓存策略:
- 本地缓存 stale 值
- 后台异步刷新
- 失败时降级到缓存
获取特性值通过 getFeatureValue_CACHED_MAY_BE_STALE 函数(命名强调返回值可能是 stale 的)。
Sink Killswitch
通过 GrowthBook 远程控制 Sink 开关。紧急情况可远程关闭任一 Sink,通过特性门控判断是否启用。
退出时 Flush
进程退出前会确保所有未发送的事件输出,通过 process.on('exit') 和 SIGINT 处理器注册。各 Sink 分别 flush 待发送事件。