# 遥测与用量 · 收什么、不收什么、怎么关

> 一个开源 agent 收哪些数据、怎么保护隐私、企业怎么接自己的 collector？这一章看 grok 的三档遥测模式、内外两套 OTel 管道、外部遥测那三层 fail-closed 隐私防护，以及 /usage 用量视图。

- 作者：David（道雾轩）
- 专栏：Grok Build 源码解读（https://daiw.org/manual/grok-build.md）
- 最后更新：2026-09-15
- 原文：https://daiw.org/manual/grok-build/telemetry-usage
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 遥测与用量 · 收什么、不收什么、怎么关

一个会读你代码的 agent，收哪些遥测、怎么防泄漏，是信任问题。grok 的遥测(`xai-grok-telemetry`)在这上面做得相当克制，值得看。

## 三档模式

`TelemetryMode`:`Disabled`(啥都不发，企业默认)、`SessionMetrics`(只发生命周期元数据、不发内容)、`Enabled`(完整)。关掉的开关是 **`DISABLE_TELEMETRY`**——对标 Claude Code 的 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`。解析优先级(`resolve_telemetry_mode`)：requirement pin > 环境变量(先看 `DISABLE_TELEMETRY`，再看 `GROK_TELEMETRY_ENABLED`)> 配置 > 远程设置 > 默认 Disabled。

产品分析双写：自家 events 端点 + Mixpanel。Mixpanel 这一路在 `xai-mixpanel` 里**先脱敏再注入 token**：`prepare_properties` 先对每个属性值跑 `redact_json_string_values`(用户那些 Bearer 形状的值被抹掉)，再塞入项目 token(token 本身不抹)。

## 内外两套 OTel

- **内部 spans**:OTLP 导出到 cli-chat-proxy(默认 `<proxy_url>/traces`)。这条管道如今拆进了新 crate `xai-grok-otel`，其中的 `RefreshableSpanExporter` **每次 export 都重新取一次 `credentials.snapshot()`**，用新 bearer 在预建的阻塞 client(`BlockingOtlpClient`)上建一次性 exporter。
- **外部 OTEL**(企业接自己的 collector)：完全独立，**从不注册进 `opentelemetry::global`**，导出头**只带** `OTEL_EXPORTER_OTLP_HEADERS`(这个模块根本不依赖 `AuthCredentialProvider`，绝无 xAI 凭据)，只导出 logs 和 metrics。写作之后还补上了私有 CA 与 mTLS(配置里只写 PEM 路径)。

## 外部遥测的三层 fail-closed

企业外部遥测的隐私设计是这章的重点——**三层 fail-closed**:

1. **类型化封闭 schema**：能发什么由封闭枚举定死；
2. **发射期脱敏**：秘密 + home 目录路径 scrub、超长截断；
3. **导出期校验**：`RedactingLogExporter` / `ValidatingMetricExporter` **丢弃**任何不在 schema 里、或形似秘密的键。

还是**双 opt-in**(`GROK_EXTERNAL_OTEL=1` **且**配了 exporter)，否则零分配、零线程、零 socket。默认内容无关，只有少量计数器和日志事件(比如 `grok_code.token.usage`，分 input/output/reasoning/cache_read 等)。这里有一处**代码跑在了文档前面**：user-guide 仍写着「没有 `cost.usage` 指标，成本自己拿 token 数乘价目表」，而 `external/schema.rs` 已经加了 `grok_code.cost.usage`——服务端回报了成本时，按模型累加美元数。

内容门从写作时的两道变成四道(`OTEL_LOG_USER_PROMPTS`、`OTEL_LOG_ASSISTANT_RESPONSES`、`OTEL_LOG_TOOL_DETAILS`、`OTEL_LOG_TOOL_CONTENT`)，默认都关；打开 `OTEL_LOG_TOOL_CONTENT` 后，工具输入输出和 bash 命令原文(`full_command`)也会脱敏、截断后导出——写作时「bash 文本永不导出」的说法已不成立。xAI 下发的 fleet 策略对这条流**只能收紧、不能放开**，所以启动时会先憋住不发，等策略拉到再说(最多等 30 秒)。

<Callout type="info">
  「默认最小、层层 fail-closed、内容门逐项显式打开」——这套设计透着对隐私的认真：哪怕企业管理员配错了，三层里任一层也会把不该出去的东西拦下。**读一个系统怎么处理遥测，能看出它对用户数据的态度。**
</Callout>

## /usage 用量视图

`/usage`(别名 `/cost`)看用量。信用条(`credit_bar`)的数据来自 `x.ai/billing` 扩展(proto 支撑)：用量百分比、周期、PAYG 上限……阈值告警(低于 \$10 / PAYG 危急 \$5)。注意：**token 计数**(来自[采样器](https://daiw.org/manual/grok-build/streaming-events))和**信用百分比**(服务端计费)是**分开**显示的——一个是你用了多少 token，一个是服务端算的钱。脚本里要数字，可以用写作之后新增的 `grok usage <会话 id> [轮次]`，把会话落盘的 token 与成本按 JSON 打出来。

## 和《从 LLM 到 Coding Agent》对照

教学最小实现不碰遥测。grok 的增量是一整套**克制且分层**的遥测：三档模式、内外双管道、外部遥测三层 fail-closed、内容门逐项开关。对照 [Claude Code 的用量监控](https://daiw.org/manual/claude-code/commands-model-permissions)，你会看到同一种「让用户和企业能看清、也能关掉」的取向。下一章是 Part 6 收官：撑起这一切的 Rust 工程底座。

---

上一篇：[认证](https://daiw.org/manual/grok-build/auth-config) · 下一篇：[Rust 工程底座](https://daiw.org/manual/grok-build/rust-engineering)
