claude-code/docs/telemetry-remote-config-audit.md
2026-04-03 09:49:59 +08:00

156 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 遥测与远程配置下发系统审计(除 Sentry 外)
## 1. Datadog 日志
**文件**: `src/services/analytics/datadog.ts`
- **端点**: 通过环境变量 `DATADOG_LOGS_ENDPOINT` 配置(默认为空,即禁用)
- **客户端 token**: 通过环境变量 `DATADOG_API_KEY` 配置(默认为空,即禁用)
- **行为**: 批量发送日志15s flush 间隔100 条上限),仅限 1P直连 Anthropic API用户
- **事件白名单**: `tengu_*` 系列事件启动、错误、OAuth、工具调用等 ~35 种)
- **基线数据**: 收集 model、platform、arch、version、userBucket用户 hash 到 30 个桶)等
- **仅限**: `NODE_ENV === 'production'`
- **配置示例**: `DATADOG_LOGS_ENDPOINT=https://http-intake.logs.datadoghq.com/api/v2/logs DATADOG_API_KEY=xxx bun run dev`
## 2. 1P 事件日志BigQuery
**文件**: `src/services/analytics/firstPartyEventLogger.ts` + `firstPartyEventLoggingExporter.ts`
- **端点**: `https://api.anthropic.com/api/event_logging/batch`staging 可切换)
- **行为**: 使用 OpenTelemetry SDK 的 `BatchLogRecordProcessor`,批量导出到 Anthropic 自有的 BQ 管道
- **数据**: 完整事件 metadatasession、model、env context、用户数据、subscription type 等)
- **弹性**: 本地磁盘持久化失败事件JSONL二次退避重试最多 8 次尝试
- **Proto schema**: 事件序列化为 `ClaudeCodeInternalEvent` / `GrowthbookExperimentEvent` protobuf 格式
- **Auth fallback**: 401 时自动去掉 auth header 重试
## 3. GrowthBook 远程 Feature Flags / 动态配置
**文件**: `src/services/analytics/growthbook.ts`
- **服务端**: `https://api.anthropic.com/`remote eval 模式)
- **行为**: 启动时拉取全量 feature flags每 6h外部用户/ 20minant定时刷新
- **磁盘缓存**: feature values 写入 `~/.claude.json``cachedGrowthBookFeatures`
- **用途**:
- 控制 Datadog 开关(`tengu_log_datadog_events`
- 控制事件采样率(`tengu_event_sampling_config`
- 控制 sink killswitch`tengu_frond_boric`
- 控制 BQ batch 配置(`tengu_1p_event_batch_config`
- 控制版本上限/自动更新 kill switch
- 控制远程管理设置的安全检查 gate
- **用户属性**: 发送 deviceId, sessionId, organizationUUID, accountUUID, email, subscriptionType 等
## 4. Remote Managed Settings企业远程配置下发
**文件**: `src/services/remoteManagedSettings/index.ts`
- **端点**: `{BASE_API_URL}/api/claude_code/settings`
- **行为**: 企业用户配置下发,支持 ETag/304 缓存,每小时后台轮询
- **安全**: 变更包含"危险设置"时弹窗让用户确认
- **适用**: API key 用户全部可拉取OAuth 用户仅 Enterprise/C4E/Team
- **Fail-open**: 请求失败时使用本地缓存,无缓存则跳过
## 5. Settings Sync设置同步
**文件**: `src/services/settingsSync/index.ts`
- **端点**: `{BASE_API_URL}/api/claude_code/user_settings`
- **行为**: CLI 上传本地设置/memory 到远程CCR 模式从远程下载
- **同步内容**: userSettings、userMemory、projectSettings、projectMemory
- **Feature gate**: `UPLOAD_USER_SETTINGS` / `DOWNLOAD_USER_SETTINGS`
- **文件大小限制**: 500KB/文件
## 6. OpenTelemetry 三方遥测
**文件**: `src/utils/telemetry/instrumentation.ts`
- **行为**: 完整的 OTEL SDK 初始化,支持 metrics / logs / traces 三种信号
- **协议**: gRPC / http-json / http-protobuf通过 `OTEL_EXPORTER_OTLP_PROTOCOL` 选择)
- **exporter**: console / otlp / prometheus
- **触发**: `CLAUDE_CODE_ENABLE_TELEMETRY=1` 环境变量
- **增强 trace**: `feature('ENHANCED_TELEMETRY_BETA')` + GrowthBook gate `enhanced_telemetry_beta`
## 7. BigQuery Metrics Exporter内部指标
**文件**: `src/utils/telemetry/bigqueryExporter.ts`
- **端点**: `https://api.anthropic.com/api/claude_code/metrics`
- **行为**: 定期5min 间隔)导出 OTel metrics 到内部 BQ
- **适用**: API 客户、C4E/Team 订阅者
- **组织级 opt-out**: 通过 `checkMetricsEnabled()` API 查询(见下方第 8 项)
## 8. 组织级 Metrics Opt-out 查询
**文件**: `src/services/api/metricsOptOut.ts`
- **端点**: `https://api.anthropic.com/api/claude_code/organizations/metrics_enabled`
- **行为**: 查询组织是否启用了 metrics二级缓存内存 1h + 磁盘 24h
- **作用**: 控制 BigQuery metrics exporter 是否导出
## 9. Startup Profiling
**文件**: `src/utils/startupProfiler.ts`
- **行为**: 采样启动性能数据100% ant / 0.5% 外部),通过 `logEvent('tengu_startup_perf')` 上报
- **详细模式**: `CLAUDE_CODE_PROFILE_STARTUP=1` 输出完整性能报告到文件
## 10. Beta Session Tracing
**文件**: `src/utils/telemetry/betaSessionTracing.ts`
- **行为**: 详细调试 trace发送 system prompt、model output、tool schema 等
- **触发**: `ENABLE_BETA_TRACING_DETAILED=1` + `BETA_TRACING_ENDPOINT`
- **外部用户**: SDK/headless 模式自动启用,交互模式需要 GrowthBook gate `tengu_trace_lantern`
## 11. Bridge Poll Config远程轮询间隔配置
**文件**: `src/bridge/pollConfig.ts`
- **行为**: 从 GrowthBook 拉取 bridge 轮询间隔配置(`tengu_bridge_poll_interval_config`
- **控制**: 单会话和多会话的各种 poll interval
## 12. Plugin/MCP 遥测
**文件**: `src/utils/plugins/fetchTelemetry.ts`
- **行为**: 记录 plugin/marketplace 的网络请求安装计数、marketplace clone/pull 等)
- **事件**: `tengu_plugin_remote_fetch`,包含 host已脱敏、outcome、duration
---
## 全局禁用方式
```bash
# 禁用所有遥测Datadog + 1P + 调查问卷)
DISABLE_TELEMETRY=1
# 更激进禁用所有非必要网络包括自动更新、grove、release notes 等)
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
# 3P 提供商自动禁用
CLAUDE_CODE_USE_BEDROCK=1 # 或 VERTEX/FOUNDRY
```
`src/utils/privacyLevel.ts` 是集中控制点,三个级别:`default < no-telemetry < essential-traffic`
---
## 数据流架构
```
用户操作 → logEvent()
sink.ts (路由层)
↙ ↘
trackDatadogEvent() logEventTo1P()
↓ ↓
Datadog HTTP API OTel BatchLogRecordProcessor
(us5.datadoghq.com) ↓
FirstPartyEventLoggingExporter
api.anthropic.com/api/event_logging/batch
BigQuery (ClaudeCodeInternalEvent proto)
```
GrowthBook 作为独立通道,同时驱动上述两个 sink 的开关和配置。