Skip to content

深度分析 #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.rs

Runtime 模块管理遥测子系统的生命周期:

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 -u
telemetry 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.rs
TelemetryHttpSender:

    ├── 目标: 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

禁用优先级(高→低):

  1. CLI --no-telemetry 标志
  2. DO_NOT_TRACK=1 环境变量
  3. ATOMCODE_TELEMETRY=0 环境变量
  4. 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 -u

8. 新增覆盖统计

组件源文件覆盖状态
遥测运行时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 二进制挖掘 + 错误消息推断

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档