所属专题簇:控制、扩展与灰度治理
Claude Code 具体会上报什么、发给谁、按什么规则裁剪,哪些属于自动 telemetry,哪些又只是用户显式提交的反馈?
当前源码里的上报体系主要分成三类:自动 telemetry、实验/灰度属性上报、用户显式反馈。自动 telemetry 有明显的字段裁剪、事件白名单、provider 分流和 PII 隔离设计;我没有看到直接面向“封号处罚”的本地上报接口。
这一章不讨论“上不上报”这种抽象问题,而是具体列出源码里的 reporting rules:
- 哪些事件会进 telemetry sink
- 哪些字段会被保留、裁剪或重命名
- 哪些事件只发给 first-party
- GrowthBook 会带哪些用户属性
- 哪些属于用户主动提交,而不是静默上报
- Claude Code 确实有完整的 telemetry 体系,但默认就在尽量避免把原始代码和路径直接送进通用 analytics。
- 上报是分流的:Datadog、1P event logging、GrowthBook 的规则并不一样。
- 3P provider 在上报层反而经常被少记,而不是多记。
- analytics 公共入口:src/services/analytics/index.ts
- sink 路由:src/services/analytics/sink.ts
- Datadog 规则:src/services/analytics/datadog.ts
- 1P event logging:src/services/analytics/firstPartyEventLogger.ts
- metadata 裁剪规则:src/services/analytics/metadata.ts
- GrowthBook 用户属性:src/services/analytics/growthbook.ts
- API query/error 上报:src/services/api/logging.ts
- 用户显式反馈:src/components/Feedback.tsx
flowchart TD
A["运行时事件"] --> B["analytics/index.ts"]
B --> C["sink.ts"]
C --> D["Datadog\n白名单事件 + firstParty only"]
C --> E["1P event logging\n更完整元数据"]
A --> F["GrowthBook\n实验与 targeting 属性"]
G["用户主动反馈"] --> H["Feedback.tsx\n显式提交 bug report"]
src/services/analytics/index.ts 有一条非常明确的设计约束:
logEvent()的 metadata 默认只接受boolean | number | undefined- 如果要传字符串,必须显式标注“已验证不是代码或文件路径”
这说明系统的默认倾向不是“原样把用户内容塞进埋点”,而是先做类型级约束。
src/services/analytics/datadog.ts 里有两条硬规则:
- 只记录
DATADOG_ALLOWED_EVENTS白名单中的事件 - 如果当前 provider 不是
firstParty,直接不发 Datadog
所以 Datadog 不是“什么都发”的总线,而是一个 first-party 场景下的有限事件后端。
src/services/analytics/firstPartyEventLogger.ts 会为事件补充:
core_metadatauser_metadataevent_metadatauser_id
并把事件发到 1P event logging batch endpoint。
这意味着 Anthropic 自家后端看到的 telemetry 会比 Datadog 更丰富,但源码里仍然没有出现“命中某条件就处罚账号”的本地逻辑。
src/services/analytics/index.ts 与 src/services/analytics/sink.ts 有一套清晰规则:
_PROTO_*字段允许进入 1P privileged 通道- 发往 Datadog 之前统一
stripProtoFields()
这说明系统刻意把“通用可见 telemetry”和“受限访问字段”分开,而不是无差别扔给所有上报后端。
src/services/analytics/metadata.ts 里有几条非常具体的上报规则:
- MCP 工具名默认被归一成
mcp_tool - 只有官方 registry、built-in MCP 或某些受控场景才会记录更细 server/tool 名
- tool input 会被截断、限制深度、限制集合大小
这说明 telemetry 不只是“记没记”,还在做结构化降敏。
src/services/analytics/growthbook.ts 里的 GrowthBookUserAttributes 明确包括:
idsessionIddeviceIDplatformapiBaseUrlHostorganizationUUIDaccountUUIDuserTypesubscriptionTyperateLimitTieremailappVersion
这说明 GrowthBook 不只是 feature 开关读取器,它还是按用户与组织属性做 targeting 的实验控制面。
src/services/api/logging.ts 里的 logAPIQuery() 和 logAPIError() 关注的是:
- model
- provider
- messagesLength
- betas
- permissionMode
- querySource
- requestId / previousRequestId
- base URL / env model 等环境元数据
我没有在这层看到“默认原样上报完整 prompt 文本”的直接实现。
src/components/Feedback.tsx 说明:
- 用户可以显式提交 feedback / bug report
- 这是交互式、可见的提交行为
- 不能把它和静默 telemetry 混为一谈
这一点很重要,因为“存在 bug report 功能”不等于“系统自动举报用户”。
-
GrowthBook带组织和账户属性
这说明它能做定向实验,不直接说明它在做处罚。 -
1P event logging元数据更丰富
这说明 Anthropic 自家可观测性更强,不直接说明有封号接口。 -
Datadog不记录 3P provider
这恰恰更像“3P 少上报”,而不是“3P 被重点执法”。
如果把源码里的 reporting rules 做审计式归类,可以归成这样:
已证实:存在完整 telemetry 与 experiment 系统已证实:默认做类型限制、字段白名单、PII 分流和工具输入裁剪已证实:Datadog 对 3P provider 有少记策略未证实:存在直接把 telemetry 用作本地封号处罚的代码路径
- Claude Code 会上报,但上报并不是“什么都裸传”。
- 它的 telemetry 规则是分层的:Datadog、1P、GrowthBook 各有不同边界。
- 目前能从源码确认的是“观测、实验、产品治理”,不能直接推出“客户端有封号上报接口”。