ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Tabby 用量收集(Usage Collection)机制详解:采集内容、上报原理与关闭方法

Tabby 用量收集(Usage Collection)机制详解:采集内容、上报原理与关闭方法 Tabby 用量收集Usage Collection机制详解采集内容、上报原理与关闭方法【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabbyTabbySelf-hosted AI coding assistant默认会收集一组经过设计的非敏感使用数据用于帮助 Tabby 团队理解部署形态并改进服务。本文将基于官方文档与仓库源码完整梳理 Tabby 服务器端用量收集所采集的字段、底层上报链路匿名 ID、心跳任务、API 端点以及通过环境变量关闭该功能的实操方法帮助自托管用户在知情的前提下部署 Tabby。Tabby 是一个可完全自托管的 AI 编程助手支持代码补全、聊天等能力。为了持续改进产品Tabby 在服务器端默认开启了一项轻量的「用量收集」Usage Collection功能。官方文档 website/docs/administration/usage-collection.md 明确指出这些数据默认会被收集且仅用于 Tabby 团队改进服务。本文以该文档为主体结合仓库内真实实现代码展开讲解「收集了什么、如何收集、如何关闭」三个核心问题。Tabby 为什么默认收集用量数据Tabby 作为开源项目需要依据真实的部署与使用情况来决定开发优先级。在 crates/tabby-common/src/usage.rs 中首次启动时终端会打印一段 TELEMETRY 说明信息原文大意如下作为开源项目Tabby 收集使用统计以辅助确定开发优先级该功能不会查看或收集开发过程中的任何代码更多信息参见官方文档的 Usage Collection 章节。也就是说用量收集的设计目标有两个前提只收集匿名、非敏感数据绝不采集开发者代码。这一点在文档与源码中是一致声明的也是评估该功能合规性的基础。收集了什么HealthState 数据模型官方文档列出的字段2024-04-18 版本官方文档给出了截至 2024 年 4 月 18 日所收集信息的 Rust 结构体定义struct HealthState { model: String, chat_model: OptionString, device: String, arch: String, cpu_info: String, cpu_count: usize, cuda_devices: VecString, version: Version, webserver: Optionbool, }这些字段全部是运行环境的元信息不包含任何代码内容字段含义model补全模型名称本地模型为model_id远程模型为model_namechat_model聊天模型名称可选device推理设备如 CPU / CUDA 等arch服务器 CPU 架构cpu_infoCPU 品牌型号信息cpu_countCPU 逻辑核心数量cuda_devicesCUDA 设备名称列表versionTabby 构建版本信息构建日期、时间戳、git SHA 等webserver是否启用了 Web 服务器企业版相关可选当前源码中的字段演进官方文档同时提示最新字段清单以 crates/tabby/src/services/health.rs 为准。对照当前仓库代码HealthState相比文档版本已有演进——新增了chat_device字段并将模型健康信息重组为models字段pub struct HealthState { model: OptionString, chat_model: OptionString, chat_device: OptionString, device: String, cuda_devices: VecString, // 模型健康状态上述字段计划在未来弃用 models: ModelsHealth, // CPU 信息 arch: String, cpu_info: String, cpu_count: usize, version: Version, webserver: Optionbool, }其中ModelsHealth对补全completion、聊天chat、嵌入embedding三类模型分别记录健康状态且区分本地与远程两种形态远程模型Remote记录kind、model_name、api_endpoint本地模型Local记录model_id、device、cuda_devices。从源码结构看这一演进说明 Tabby 正在把「单模型字段」逐步迁移到结构化的多模型健康模型ModelsHealth上旧的顶层字段被标注为「计划未来弃用」slated for future deprecation。各字段的采集实现在 crates/tabby/src/services/health.rs 中这些字段的采集逻辑非常直观arch直接取自 Rust 标准库的编译期常量ARCHcpu_info与cpu_count通过sysinfo库读取第一颗 CPU 的brand()字符串与 CPU 数量cuda_devices通过nvml_wrapperNVIDIA Management Library 的 Rust 封装枚举 GPU 名称在 macOS 或未指定--gpus的 Docker 容器中Nvml::init()会失败此时cuda_devices置为空列表表示当前运行环境不支持 CUDA 接口version中的build_date、build_timestamp、git_sha、git_describe均由vergen在编译期注入反映构建产物的精确来源。需要强调这些字段描述的是「服务器运行环境」与用户的代码、补全内容、聊天内容完全无关。数据是如何上报的上报链路解析匿名 ID 与本地存储为了在不识别具体用户的前提下做去重统计Tabby 在首次运行时生成一个随机 UUID 作为匿名 ID。相关逻辑位于 crates/tabby-common/src/usage.rsID 文件路径由 crates/tabby-common/src/path.rs 中的usage_id_file()定义为~/.tabby/usage_anonymous_id默认tabby_root即$HOME/.tabby可通过TABBY_ROOT环境变量覆盖若该文件不存在则通过Uuid::new_v4()生成新 ID 并写入文件同时打印上面提到的 TELEMETRY 欢迎信息之后每次上报都复用这个持久化的匿名 ID。上报端点与数据包格式上报的目标端点在 crates/tabby-common/src/usage.rs 中定义为static USAGE_API_ENDPOINT: str https://app.tabbyml.com/api/usage;每次上报的数据包是一个序列化结构包含distinct_id匿名 ID、event事件名与properties属性体struct Payloada, T { distinct_id: a str, event: a str, properties: T, }上报使用reqwest以 JSON 形式 POST 到上述端点且发送结果被显式忽略.ok()即上报失败不会影响 Tabby 服务本身的运行。触发时机心跳任务官方文档中提到收集的是「启动服务器所使用的serve命令」。从当前源码看这一描述对应的是 crates/tabby/src/serve.rs 中的start_heartbeat心跳任务该函数构造HealthState随后在后台tokio任务中循环执行loop { usage::capture(ServeHealth, state).await; sleep(Duration::from_secs(3000)).await; }即每隔 3000 秒50 分钟上报一次事件名为ServeHealth的用量数据。capture()内部先检查全局TRACKER是否存在只有存在时才真正发送这为「一键关闭」提供了统一的开关入口。与健康检查接口的关联值得注意的是HealthState并非只用于上报它同时也是对外暴露的 HTTP 健康检查接口的响应体。在 crates/tabby/src/routes/health.rs 中GET /v1/health与POST /v1/health会直接返回HealthState的 JSON 序列化结果。因此管理员通过curl http://localhost:8080/v1/health看到的 JSON正是上报给 Tabby 团队的同一份数据结构——这为「查看实际采集内容」提供了最直接的验证手段例如 openapi 定义见 clients/tabby-openapi/openapi.json。如何关闭用量收集官方文档给出了最简关闭方式——设置环境变量export TABBY_DISABLE_USAGE_COLLECTION1这一开关在源码层面对应 crates/tabby-common/src/usage.rs 中的初始化逻辑lazy_static! { static ref TRACKER: OptionUsageTracker { if std::env::var(TABBY_DISABLE_USAGE_COLLECTION).is_ok() { None } else { Some(UsageTracker::new()) } }; }只要环境中存在TABBY_DISABLE_USAGE_COLLECTION值非空即可1是约定写法TRACKER就初始化为None后续所有capture()调用都会直接短路返回不再创建匿名 ID、不再发送任何请求。实用建议临时关闭直接在启动 Tabby 的终端中先执行export TABBY_DISABLE_USAGE_COLLECTION1再运行tabby serve持久化关闭将该环境变量写入 shell 配置文件如~/.bashrc、~/.zshrc或在使用 systemd / Docker 等部署方式时通过对应机制注入环境变量验证是否生效确认~/.tabby/usage_anonymous_id不再被创建或观察服务日志/抓包中不再出现指向https://app.tabbyml.com/api/usage的请求。仓库内部的一些自动化场景也采用了同样的关闭方式可作为参照例如 python/tabby-loadtest/server.py 与 python/tabby-eval/modal/predict.py 都在启动测试用 Tabby 实例前设置了TABBY_DISABLE_USAGE_COLLECTION1避免压测与评估产生的流量污染统计数据。关闭服务器端 vs 关闭客户端收集需要区分的是本文讨论的是服务器端的用量收集。IDE 客户端VSCode、Vim、IntelliJ 等扩展另有独立的匿名用量收集机制其开关位于客户端配置文件 website/docs/extensions/configurations.md 中# Anonymous usage tracking [anonymousUsageTracking] disable false # set to true to disable两套机制相互独立服务器端由TABBY_DISABLE_USAGE_COLLECTION控制客户端由anonymousUsageTracking.disable控制。若希望完全关闭 Tabby 的用量上报需要同时处理这两处配置。小结Tabby 的用量收集是一项默认开启、设计克制的遥测功能采集对象服务器运行环境元信息模型、设备、CPU、CUDA、版本、Web 服务状态等以HealthState结构体为载体当前字段清单以 crates/tabby/src/services/health.rs 为准采集方式由 crates/tabby/src/serve.rs 的心跳任务每隔 3000 秒上报一次ServeHealth事件匿名 ID 持久化于~/.tabby/usage_anonymous_id端点固定为https://app.tabbyml.com/api/usage失败静默不阻塞服务关闭方式设置环境变量TABBY_DISABLE_USAGE_COLLECTION1即可在进程启动时彻底禁用上报具体实现见 crates/tabby-common/src/usage.rs。对于注重隐私的自托管用户理解这条从「数据采集 → 匿名化 → 定时上报 → 一键关闭」的完整链路能够帮助你在知情的前提下做出部署决策既可以利用该功能回馈开源项目也可以通过一个环境变量随时退出。【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表