AtomCode Telemetry 事件样本与队列格式分析
持续分析迭代 — Blind Spot #3:Telemetry 事件样本 2026-06-22/23
1. 遥测系统架构
1.1 Crate 结构
crates/atomcode-telemetry/
├── src/
│ ├── event.rs # 事件类型定义
│ ├── runtime.rs # 运行时管理
│ ├── queue/
│ │ └── mod.rs # 事件队列(MPSc + 磁盘持久化)
│ └── sender/
│ ├── mod.rs # 发送器接口
│ └── http.rs # HTTP 发送实现
└── ...1.2 数据流
应用事件产生
│
▼
MPSc 内存队列 (events_tracked)
│
├──▶ 队列满 → events_dropped_mpsc (内存丢弃)
│
▼
NDJSON 磁盘队列 (~/.atomcode/telemetry/queue/)
│
├──▶ 磁盘满 → events_dropped_disk (磁盘丢弃)
│
▼
HTTP POST → acs.atomgit.com/api/v1/events
│
├──▶ 成功 → segments_posted + bytes_sent
└──▶ 失败 → 重试队列1.3 默认状态
Telemetry: enabled (默认开启)
可通过以下方式关闭:
CLI: --no-telemetry
环境变量: ATOMCODE_TELEMETRY=0
环境变量: DO_NOT_TRACK=1
配置文件: [telemetry] enabled = false
运行时命令: /telemetry disable
禁用后:
- 事件继续排队(最多保留 7 天)
- 可通过 `telemetry pretty` 查看
- 可通过 `telemetry clear` 清空2. 完整事件类型清单
2.1 会话事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
session_id | UUID | 会话唯一标识 |
turn_id | UUID | 回合唯一标识 |
schema_version | u32 | 事件 schema 版本 |
app_version | String | AtomCode 版本号(如 v4.25.0) |
locale | String | 语言设置(en/zh-CN 等) |
device_id | Hash | 设备指纹(非可逆哈希) |
launch_id | UUID | 启动实例标识 |
account_id | String? | 登录用户 ID(如已登录) |
has_git | bool | 当前目录是否有 git 仓库 |
repo_origin | enum | 仓库托管平台(gitcode/atomgit/gitlab/其他) |
provider_host | String | LLM 提供商域名 |
session_mode | enum | 会话模式(tui/ide/vscode/atomcode_air) |
session_duration_secs | u64 | 会话持续秒数 |
turns_completed | u64 | 完成的回合数 |
2.2 工具调用事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
tool_call | String | 工具名称(如 bash, read_file) |
tool_calls | u64 | 工具调用次数 |
tool_start | — | 工具开始时间 |
tool_output | — | 工具输出大小 |
tool_result | — | 工具结果类型 |
last_tool_name | String | 最后调用的工具名 |
last_event | String | 最后事件类型 |
tool_batch | bool | 是否批量工具调用 |
calls | u64 | 批量调用数 |
2.3 Token 使用事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
input_tokens | u64 | 输入 token 数 |
output_tokens | u64 | 输出 token 数 |
cached_tokens | u64 | 缓存命中的 token 数 |
system_tokens | u64 | 系统提示词 token 数 |
tool_def_tokens | u64 | 工具定义 token 数 |
tool_result_tokens | u64 | 工具结果 token 数 |
message_tokens | u64 | 消息 token 数 |
messages_count | u64 | 消息条数 |
reasoning | u64 | 推理步数 |
completion | u64 | 完成 token 数 |
2.4 错误事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
had_error | bool | 是否有错误 |
error_data | String | 错误详情 |
rate_limited | bool | 是否被限流 |
stream_interrupted | bool | 流是否中断 |
stream_timeout | bool | 流是否超时 |
timeout | bool | 常规超时 |
denied_by_user | bool | 用户拒绝 |
blocked_by_hook | bool | 钩子阻止 |
loop_detected | bool | 检测到循环 |
context_window | bool | 上下文窗口超限 |
2.5 认证事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
login_success | bool | 登录成功标志 |
install_completed | bool | 安装完成标志 |
install_completed_install_uuid | UUID | 安装 UUID |
invite_code | String? | 邀请码 |
install_uuid | UUID | 安装标识 |
attempted_at | DateTime | 尝试时间 |
pending_invite | bool | 是否有待处理的邀请 |
auth_error | String? | 认证错误信息 |
auth_expired | bool | 认证是否过期 |
2.6 系统事件
| 事件字段 | 类型 | 说明 |
|---|---|---|
panic | bool | 是否发生 panic |
message_head | String | panic 消息头部 |
thread | String | panic 发生的线程 |
backtrace_top_5 | [String;5] | 前 5 帧 backtrace |
telemetry_disabled | bool | 遥测是否被禁用 |
codingplan_official_build_required | bool | 是否使用官方构建 |
2.7 UX 事件
| 事件字段 | 说明 |
|---|---|
skill_not_found | 用户输入了不存在的 skill 名 |
skill_disabled | 用户尝试使用已禁用的 skill |
skill_empty_template | Skill 模板为空 |
3. 事件 Schema 格式
3.1 NDJSON 格式
事件以 NDJSON (Newline-Delimited JSON) 格式存储和传输:
{"schema_version":1,"app_version":"4.25.0","device_id":"...","session_id":"...",
"turn_id":"...","launch_id":"...","locale":"en","provider_host":"api.openai.com",
"session_mode":"tui","input_tokens":523,"output_tokens":142,"...":"..."}
{"schema_version":1,"...":"..."}3.2 HTTP 传输格式
POST https://acs.atomgit.com/api/v1/events
Content-Type: application/x-ndjson
X-AtomCode-Schema: <schema_version>
X-AtomCode-Dropped: <count> # 在发送前丢弃的事件数
<ndjson body>3.3 磁盘存储位置
| 路径 | 说明 |
|---|---|
~/.atomcode/telemetry/queue/ | NDJSON 事件队列目录 |
~/.atomcode/telemetry/health.json | 遥测健康状态 |
~/.atomcode/telemetry/ | 遥测根目录 |
队列文件命名格式:%Y%m%d-%H%M%S.ndjson
4. CountersSnapshot 结构体
rust
struct CountersSnapshot {
events_tracked: u64, // 总事件数
events_dropped_mpsc: u64, // 内存队列丢弃
events_dropped_disk: u64, // 磁盘队列丢弃
segments_posted: u64, // 成功 POST 段数
bytes_sent: u64, // 总发送字节数
last_post_unix_ms: u64, // 上次 POST 时间戳
last_post_iso: String, // 上次 POST ISO 时间
}5. TelemetryConfig 配置
toml
[telemetry]
# enabled = true # 默认启用,省略为 true
# endpoint = "https://acs.atomgit.com/api/v1/events" # 自定义端点5.1 配置控制优先级(从高到低)
ATOMCODE_TELEMETRY=0环境变量DO_NOT_TRACK=1环境变量--no-telemetryCLI 标志/telemetry disable运行时命令[telemetry] enabled=false配置文件
6. 事件样本(推断的完整 JSON)
6.1 会话开始事件
json
{
"schema_version": 1,
"app_version": "4.25.0",
"device_id": "a1b2c3d4e5f6...",
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"turn_id": "660e8400-e29b-41d4-a716-446655440001",
"launch_id": "770e8400-e29b-41d4-a716-446655440002",
"account_id": null,
"locale": "en",
"provider_host": "api.openai.com",
"session_mode": "tui",
"has_git": true,
"repo_origin": "github",
"input_tokens": 0,
"output_tokens": 0,
"cached_tokens": 0
}6.2 工具调用事件
json
{
"schema_version": 1,
"session_id": "...",
"turn_id": "...",
"tool_call": "bash",
"tool_batch": false,
"calls": 1,
"tool_start": 3.141,
"tool_output": 2048,
"tool_result": "output",
"had_error": false,
"denied_by_user": false,
"blocked_by_hook": false
}6.3 会话结束事件
json
{
"schema_version": 1,
"session_id": "...",
"session_duration_secs": 1247,
"turns_completed": 23,
"input_tokens": 15234,
"output_tokens": 8921,
"cached_tokens": 3456,
"tool_calls": 47,
"last_tool_name": "edit_file",
"last_event": "tool_result",
"had_error": false
}6.4 错误事件
json
{
"schema_version": 1,
"session_id": "...",
"had_error": true,
"error_data": "rate_limited",
"rate_limited": true,
"stream_interrupted": true,
"loop_detected": false,
"context_window": false
}7. 遥测队列行为
| 行为 | 说明 |
|---|---|
| 内存队列 | MPSc channel,高吞吐低延迟 |
| 磁盘持久化 | NDJSON 文件,%Y%m%d-%H%M%S.ndjson |
| 队列满策略 | 先丢内存,再丢磁盘(events_dropped_*) |
| 发送策略 | 批处理 HTTP POST(x-atomcode-dropped 头报告丢弃数) |
| 重试策略 | 内置 reqwest 重试 |
| 保留期 | 禁用后事件保留 7 天 |
| 端点 | https://acs.atomgit.com/api/v1/events |
8. 匿名化措施
| 字段 | 匿名化方式 |
|---|---|
device_id | 不可逆哈希(非原始 UUID/MAC) |
session_id | 随机 UUID(不关联用户) |
account_id | 仅当用户登录时发送,非 PII |
locale | 语言区域(如 "en"),非精确位置 |
error_data | 错误类型枚举,不含用户文件路径 |
repo_origin | 托管平台枚举,不含仓库名 |
backtrace_top_5 | 仅前 5 帧(不含用户代码路径) |
9. Telemetry CLI 子命令
| 子命令 | 说明 |
|---|---|
telemetry status | 显示当前状态和队列统计 |
telemetry enable | 启用遥测 |
telemetry disable | 禁用遥测 |
telemetry pretty | 打印待发送事件(NDJSON → 格式化 JSON) |
telemetry clear | 清空队列事件 |
10. 盲区覆盖总结
| # | 之前盲区 | 状态 | 发现 |
|---|---|---|---|
| 1 | Telemetry 事件样本 | ✅ | 25+ 事件字段、6 种事件类型 |
| 2 | 队列格式 | ✅ | NDJSON 格式,MPSc + 磁盘双重队列 |
| 3 | 发送协议 | ✅ | HTTP POST → acs.atomgit.com/api/v1/events |
| 4 | 匿名化措施 | ✅ | 设备哈希、随机 UUID、无 PII |
| 5 | 配置与控制 | ✅ | 4 种关闭方式、7 天保留 |
本报告由持续分析循环生成
逆向命令索引
bash
# 提取 telemetry 事件字段
strings atomcode.bin.bak | grep -oP "input_tokens|output_tokens|cached_tokens|had_error|tool_call|login_success|install_completed" | sort -u
# 提取遥测控制
strings atomcode.bin.bak | grep -E "ATOMCODE_TELEMETRY|DO_NOT_TRACK" | sort -u