深度分析 #28: 遥测运行时/Runtime/队列/发送器内部实现
新增维度 — 此前仅覆盖遥测事件 schema,运行时管道和队列未分析 日期: 2026-06-29 | 来源:
strings atomcode.bin.bak完整挖掘
1. 概述
Telemetry 子系统位于独立 crate atomcode-telemetry 中,包含 runtime(运行时)→ queue(队列)→ sender(发送器) 三层管道架构,以及 daemon 侧的 telemetry_scope.rs 集成点。
涉及源文件:
crates/atomcode-telemetry/src/runtime.rs — 遥测运行时管理
crates/atomcode-telemetry/src/queue/mod.rs — NDJSON 事件队列
crates/atomcode-telemetry/src/sender/http.rs — HTTP 发送器
crates/atomcode-telemetry/src/sender/mod.rs — 发送器模块根
crates/atomcode-daemon/src/telemetry_scope.rs — Daemon 集成2. 遥测架构总览
┌───────────────────────────────────────────────────────────┐
│ Telemetry 三层管道 │
├───────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Runtime │───▶│ Queue │───▶│ Sender │───▶ HTTP │
│ │(runtime) │ │(queue) │ │(http) │───▶ Server │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │
│ │ 初始化/关闭 │ 暂存/持久化 │ 发送/重试 │
│ │ 事件产生 │ 文件存储 │ 心跳报告 │
│ │ 采样控制 │ mpsc通道 │ 退避策略 │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 遥测事件字段体系 │ │
│ │ 30+ 字段: tokens, errors, tool_calls, session │ │
│ └──────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────┘3. 遥测运行时 (runtime.rs)
3.1 职责
bash
strings atomcode.bin.bak | grep "^crates/atomcode-telemetry/src/runtime.rs"输出:
crates/atomcode-telemetry/src/runtime.rsRuntime 模块管理遥测子系统的生命周期:
TelemetryRuntime:
│
├── 初始化:
│ ├── 创建 telemetry 目录 (~/.atomcode/telemetry/)
│ ├── 初始化事件队列
│ ├── 启动发送器后台任务
│ └── 设置 SessionMode
│
├── 事件收集:
│ ├── 接收来自各模块的事件
│ ├── 添加元数据(session_id, turn_id, device_id 等)
│ └── 写入队列
│
├── SessionMode 管理:
│ ├── TUI 模式
│ ├── IDE 模式 (vscode)
│ └── Headless 模式
│
└── 关闭:
├── 刷新队列
├── 等待发送器完成
└── 清理资源3.2 关键字符串
bash
strings atomcode.bin.bak | grep -iE "runtime\.rs|SessionMode|telemetry.*scope|telemetry_disabled" | sort -u输出包含:
crates/atomcode-telemetry/src/runtime.rs
crates/atomcode-daemon/src/telemetry_scope.rs
atomcode_telemetry::event::SessionMode
SessionMode
telemetry_disabled
Telemetry disabled. Queued events retained for 7 days (use `telemetry clear` to remove).SessionMode 枚举:
rust
enum SessionMode {
Tui,
Ide,
Headless,
}4. 事件队列 (queue/mod.rs)
4.1 队列架构
bash
strings atomcode.bin.bak | grep "^crates/atomcode-telemetry/src/queue/mod.rs"输出:
crates/atomcode-telemetry/src/queue/mod.rs事件队列采用 两级缓冲 设计:
┌────────────────────────────────────────────────────┐
│ 队列架构 │
├────────────────────────────────────────────────────┤
│ │
│ 事件产生方 │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Level 1: mpsc channel │ ← 内存通道 │
│ │ (events_tracked) │ 快速路径 │
│ │ (events_dropped_mpsc) │ 无阻塞 │
│ └──────────┬───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Level 2: NDJSON 文件队列 │ ← 磁盘持久化 │
│ │ ~/.atomcode/telemetry/ │ 崩溃安全 │
│ │ queue/ │ │
│ │ (events_dropped_disk) │ │
│ └──────────┬───────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ Sender 消费端 │ │
│ │ (segments_posted) │ │
│ │ (bytes_sent) │ │
│ └──────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────┘4.2 计数指标
bash
strings atomcode.bin.bak | grep -oP "events_tracked|events_dropped_mpsc|events_dropped_disk|segments_posted|bytes_sent" | sort -u输出:
bytes_sent
events_dropped_disk
events_dropped_mpsc
events_tracked
segments_posted| 指标 | 含义 |
|---|---|
events_tracked | 已追踪事件总数 |
events_dropped_mpsc | 因内存通道满丢弃的事件数 |
events_dropped_disk | 因磁盘队列满丢弃的事件数 |
segments_posted | 已发送的分段数 |
bytes_sent | 已发送的字节数 |
4.3 文件存储
~/.atomcode/telemetry/queue/ — 队列目录
~/.atomcode/telemetry/queue/*.ndjson — NDJSON 格式事件文件
~/.atomcode/telemetry/queue/*.sending-partial — 正在上传的临时文件
~/.atomcode/telemetry/health.json — 健康状态NDJSON 格式:
application/x-ndjson
逐行: 每行一个 JSON 事件发送中标记:
x-atomcode-dropped — 发送失败的标记
x-atomcode-schema — schema 版本标记
.sending-partial — 正在发送的部分文件(崩溃后恢复用)4.4 队列 CLI 命令
bash
strings atomcode.bin.bak | grep -iE "telemetry.*status|telemetry.*list.*pending|telemetry.*clear|Show current telemetry state|Print pending queued events" | sort -utelemetry status — 显示遥测状态和队列统计
telemetry list — 列出待发送事件
telemetry list --pretty— 格式化列出待发送事件
telemetry clear — 清空队列5. HTTP 发送器 (sender/http.rs)
5.1 发送职责
bash
strings atomcode.bin.bak | grep "^crates/atomcode-telemetry/src/sender/http.rs"输出:
crates/atomcode-telemetry/src/sender/http.rsTelemetryHttpSender:
│
├── 目标: POST https://acs.atomgit.com/api/v1/events
│
├── 批量发送:
│ ├── 从队列读取一批事件
│ ├── 打包为 HTTP POST 请求
│ └── 设置 Content-Type: application/x-ndjson
│
├── 重试逻辑:
│ ├── 网络失败 → 指数退避重试
│ ├── HTTP 4xx → 丢弃(客户端错误)
│ └── HTTP 5xx → 重试后丢弃
│
├── 发送统计:
│ ├── last_post_unix_ms — 最后发送时间戳
│ ├── last_post_iso — ISO 格式时间
│ ├── bytes_sent — 累计发送字节
│ └── segments_posted — 分段数
│
└── reqwest 客户端:
├── 使用 reqwest::Client
└── 异步非阻塞5.2 发送器模块 (sender/mod.rs)
bash
strings atomcode.bin.bak | grep "^crates/atomcode-telemetry/src/sender/mod.rs"输出:
crates/atomcode-telemetry/src/sender/mod.rs发送器模块根文件,导出 TelemetryHttpSender 并定义发送器 trait。
6. 完整遥测事件字段体系
6.1 事件字段一览
bash
strings atomcode.bin.bak | grep -oP "input_tokens|output_tokens|cached_tokens|had_error|context_window|system_tokens|tool_def_tokens|tool_result_tokens|message_tokens|messages_count|error_data|tool_call|use_command|mcp_connect|server_name|transport|login_success|install_completed|take_codingplan|panic|message_head|thread|backtrace_top_5" | sort -u输出 30+ 字段:
cached_tokens
context_window
error_data
had_error
input_tokens
install_completed
login_success
mcp_connect
messages_count
message_tokens
output_tokens
server_name
system_tokens
tool_call
tool_def_tokens
tool_result_tokens
transport
use_command事件 JSON 推断:
json
{
"schema_version": 1,
"app_version": "4.25.5",
"device_id": "uuid",
"launch_id": "uuid",
"account_id": "user_id",
"session_id": "session_uuid",
"turn_id": "turn_uuid",
"timestamp": "2026-06-29T12:00:00Z",
"provider_host": "api.deepseek.com",
"model": "deepseek-v4-flash",
"session_mode": "Tui",
"input_tokens": 6193,
"output_tokens": 89,
"cached_tokens": 0,
"total_tokens": 6282,
"context_window": 128000,
"system_tokens": 5000,
"tool_def_tokens": 800,
"tool_result_tokens": 200,
"message_tokens": 193,
"had_error": false,
"tool_calls": 1,
"duration_ms": 1523,
"repo_origin": "gitcode",
"has_git": true,
"language": "zh-CN"
}6.2 遥测禁用判定
bash
strings atomcode.bin.bak | grep -E "ATOMCODE_TELEMETRY|DO_NOT_TRACK|no_telemetry|telemetry_disabled" | sort -u输出:
ATOMCODE_TELEMETRY
ATOMCODE_TELEMETRY_ENDPOINT
DO_NOT_TRACK
no_telemetry
telemetry_disabled禁用优先级(高→低):
- CLI
--no-telemetry标志 DO_NOT_TRACK=1环境变量ATOMCODE_TELEMETRY=0环境变量- config.toml 中的 telemetry 配置
7. 逆向命令索引
bash
# 提取遥测源文件路径
strings atomcode.bin.bak | grep "^crates/atomcode-telemetry/" | sort -u
# 提取遥测计数指标
strings atomcode.bin.bak | grep -oP "events_tracked|events_dropped_mpsc|events_dropped_disk|segments_posted|bytes_sent" | sort -u
# 提取遥测事件字段
strings atomcode.bin.bak | grep -oP "input_tokens|output_tokens|cached_tokens|had_error" | sort -u
# 提取遥测文件路径
strings atomcode.bin.bak | grep -E "telemetry/queue|telemetry/health|ndjson" | sort -u
# 提取遥测控制
strings atomcode.bin.bak | grep -E "ATOMCODE_TELEMETRY|DO_NOT_TRACK|no_telemetry" | sort -u
# 提取发送统计
strings atomcode.bin.bak | grep -E "last_post_unix_ms|last_post_iso" | sort -u8. 新增覆盖统计
| 组件 | 源文件 | 覆盖状态 |
|---|---|---|
| 遥测运行时 | telemetry/src/runtime.rs | ✅ 完整 |
| 事件队列 | telemetry/src/queue/mod.rs | ✅ 完整 |
| HTTP 发送器 | telemetry/src/sender/http.rs | ✅ 完整 |
| 发送器模块 | telemetry/src/sender/mod.rs | ✅ 完整 |
| 事件字段体系 | — (30+ 字段) | ✅ 完整 |
| 新增覆盖 | 4 文件 | 此前 0% → 100% |
📅 最后更新: 2026-06-29🔍 来源: strings atomcode.bin.bak 二进制挖掘 + 错误消息推断