ARTICLE DETAIL

资讯详情

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

FerretDB 遥测机制全解析:数据采集范围、telemetry.json 结构与开启/禁用实操指南

FerretDB 遥测机制全解析:数据采集范围、telemetry.json 结构与开启/禁用实操指南 后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载本指南以 website/docs/telemetry.md 为核心骨架深入讲解 FerretDB 内置的匿名遥测Telemetry报告机制它采集哪些数据、为什么这些数据对项目有价值、telemetry.json文件如何解读以及如何在命令行、环境变量、可执行文件名和运行时四个层面完整控制遥测的启用与禁用。读完本文你将能够准确判断 FerretDB 实例的上报行为、读懂本地遥测文件、按需开启或关闭遥测并知道如何帮助项目方改进 MongoDB 兼容性。FerretDB 遥测是什么FerretDB 是 MongoDB 的开源替代品为了持续改进兼容性与产品能力它在默认情况下会采集基础的匿名使用数据并发送到官方遥测服务FerretDB Beacon。这套机制同时承担两项职责帮助 FerretDB 团队理解真实使用方式从而提升兼容性、完善产品功能在有新版本可用时向运行中的实例推送版本更新通知。隐私承诺与数据边界文档明确强调遥测绝不采集任何个人身份信息PII原始遥测数据不会共享或出售给第三方团队只可能基于统计结果对外发布汇总性的发现与数据。具体来说被采集的内容仅限以下范围采集项说明随机实例 UUID每次安装生成的一次性随机标识用于区分不同实例网络位置信息从 IP 地址推导出的自治系统Autonomous System编号、云厂商区域与国家IP 地址本身不上报FerretDB 版本当前运行的 FerretDB 版本号PostgreSQL 版本后端 PostgreSQL 的版本字符串DocumentDB 版本DocumentDB 扩展的版本与 git 引用安装类型Docker、软件包、云市场镜像、自行编译等构建配置Go 版本、构建标志build flags与构建标签build tags正常运行时间Uptime进程启动至今的时长命令统计协议操作名如OP_MSG、OP_QUERY、命令名如find、aggregate、导致错误的参数如sort、$count、结果类型如NotImplemented、InternalError或ok需要注意一个关键边界文档用:::info特别标注参数值、数据字段名、成功响应内容、错误消息正文永远不会被采集。也就是说遥测只关心你用了哪个命令、哪个参数、结果是成功还是某种错误而绝不关心你的具体业务数据。构建配置与命令统计的底层实现上述字段在源码中有直接对应。遥测报告的构建信息来自build/version包而命令统计则来自中间件层的 Prometheus 计数器。在 internal/handler/middleware/metrics.go 中Metrics结构维护了两个计数器向量ferretdb_client_requests_total标签为opcode、command统计请求总数ferretdb_client_responses_total标签为opcode、command、argument、result统计响应结果。其中result标签的取值在 internal/handler/middleware/result.go 中定义ok、error网络等其他错误、panic、unknown以及 MongoDB 错误名如NotImplemented。Metrics.GetResponses()会把 Prometheus 指标聚合成opcode → command → argument → result → count的四层嵌套映射这正是遥测command_metrics字段的数据来源。遥测报告结构体report在 internal/util/telemetry/reporter.go 中定义其 JSON 字段与telemetry.json完全对应。telemetry.json每一次上报都有本地留档无论遥测是否成功发送到 Beacon 服务同一份报告内容总会写入状态目录下的telemetry.json文件方便随时检查。状态目录由--state-dir标志指定见 website/docs/configuration/flags.md默认为当前目录.Docker 容器中默认为/state。对应的环境变量是FERRETDB_STATE_DIR。文档给出了一个由 Beacon 服务自身它当然也用 FerretDB 存储数据记录的完整示例下面结合源码逐字段解读{ _comment: Sent to https://beacon.ferretdb.com/ at 2025-03-06 13:28:57Z., version: v2.0.0, commit: 2214721e51d64be04ad016f401d0abf8a335993e, branch: unknown, dirty: true, package: docker, debug: false, build_environment: { -buildmode: exe, -compiler: gc, -trimpath: true, CGO_ENABLED: 0, GOAMD64: v1, GOARCH: amd64, GOOS: linux, go.version: go1.24.1, vcs: git, vcs.modified: true, vcs.revision: 2214721e51d64be04ad016f401d0abf8a335993e, vcs.time: 2025-03-05T12:26:16Z }, os: linux, arch: amd64, postgresql_version: PostgreSQL 16.8 (Debian 16.8-1.pgdg1201) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit, documentdb_version: 0.102.0 gitref: HEAD sha:f7c318c buildId:0, uuid: redacted, uptime: 86400099948209, command_metrics: { OP_MSG: { count: { unknown: { ok: 1440 } }, find: { unknown: { ok: 1440 } }, getMore: { unknown: { ok: 4320 } }, hello: { unknown: { ok: 8639 } }, ping: { unknown: { ok: 1437 } }, update: { unknown: { ok: 1520 } } }, OP_REPLY: { unknown: { unknown: { ok: 3 } } } } }从源码角度解读这份文件_comment由Reporter.sendReport/writeReport写入标记该报告是已发送Sent to ... at ...、发送失败Failed to send ...还是未发送Created at ..., not sent because reporting is disabled时间格式定义在 internal/util/telemetry/reporter.go2006-01-02 15:04:05Z07:00version、commit、branch、dirty、package、debug、build_environment来自version.Get()的构建信息其中dirty: true表示构建树包含未提交修改debug对应是否开发构建dev buildos、arch来自 Go 运行时的runtime.GOOS与runtime.GOARCHpostgresql_version与documentdb_version来自进程状态internal/util/state/state.go在 FerretDB 尚未连接 PostgreSQL 时可能为空uuid是每次安装生成的随机实例标识见State.fill()使用uuid.NewString()生成并持久化在state.json中uptime是time.Since(s.Start)的结果即自进程启动以来的时长command_metrics的四层嵌套结构opcode → command → argument → result → count由makeReport从Metrics.GetResponses()转换而来其中unknown表示无法归因到具体参数的错误ok计数值由Total - failures计算得出。本地报告文件写入逻辑见Reporter.writeReportinternal/util/telemetry/reporter.go使用json.MarshalIndent格式化后写入filepath.Join(r.Dir, telemetry.json)权限为0666。因此即使完全断网你也能在本地看到报告内容。版本更新通知机制当有新版 FerretDB 可用时遥测服务会在响应中携带最新版本信息。Beacon 响应的结构在源码response类型中定义internal/util/telemetry/reporter.golatest_version最新版本号update_info更新说明文本update_available是否有可用更新。Reporter.sendReport在收到201 Created响应后解析这些字段若存在更新会在服务端日志中输出提示含current_version与latest_version并调用StateProvider.Update将LatestVersion、UpdateInfo、UpdateAvailable写入进程状态。这些更新信息因此可以通过getLog命令配合startupWarnings参数在客户端读取——例如使用mongosh连接时就能看到启动警告中的版本提示。文档给出的建议是即便不立即升级也应尽早更新以获得最近的 bug 修复、新功能与性能改进。遥测的三种状态enabled / disabled / undecided遥测报告器只有三种状态enabled启用、disabled禁用和undecided未决定默认值。undecided在行为上等同于enabled但有两点关键差异行为enabledundecided首次上报时机FerretDB 启动后立即发送延迟一小时发送留出禁用时间退出前上报关闭前发送最后一次报告关闭前不发送这两点差异在源码中有直接体现。Reporter.Runinternal/util/telemetry/reporter.go的逻辑是若当前状态为undecidedTelemetry nil先调用firstReportDelay等待UndecidedDelay默认一小时或状态被显式修改循环期间只要状态是undecided或enabled就发送报告然后写入本地文件退出前仅当状态为显式enabled时使用ctxutil.WithDelay继承上下文并再发送一次报告undecided状态不会触发退出前上报。firstReportDelay会输出一条日志The telemetry state is undecided; the first report will be sent in X。Read more about FerretDB telemetry and how to opt out at https://beacon.ferretdb.com并通过Provider.Subscribe()订阅状态变更——如果在延迟期间用户执行了db.disableFreeMonitoring()等操作延迟会立即结束首报取消。还有一个必须明确的要点文档用:::info标注undecided不会自动变为enabled或disabled必须由用户显式操作下文介绍的方式来改变状态。状态与锁定机制源码级initialState函数internal/util/telemetry/telemetry.go完整地体现了状态的解析优先级若DO_NOT_TRACK环境变量解析为真或可执行文件名包含donottrack则遥测被禁用并锁定若状态已因上述原因被锁定而--telemetry标志又试图显式启用会直接报错telemetry cant be enabled——这解释了文档中一旦用文件名方式禁用就必须移除donottrack字符串才能再启用的警告若命令行标志未设置则回退到上次持久化的状态prev来自state.json中的telemetry字段若标志已设置则采用标志值并锁定状态。锁定TelemetryLocked意味着运行时无法再通过命令修改。msgSetFreeMonitoring的实现internal/handler/msg_setfreemonitoring.go会在TelemetryLocked为真时返回错误ErrLocation50840Free Monitoring has been disabled via the command-line and/or config file。这正是文档中两条:::caution警告的源码依据。禁用遥测五种方式详解文档恳请用户尽量保留遥测因为它能帮助改进软件同时也理解并非所有人都愿意发送数据。需要注意的副作用是禁用遥测后自动版本检查与更新信息将不可用。以下五种方式均可禁用遥测方式 1命令行标志--telemetry给 FerretDB 可执行文件传入--telemetry取值可为0、f、false、n、no、off、disable、disabled、optout、opt-out、disallow、forbid--telemetrydisable方式 2环境变量FERRETDB_TELEMETRY与方式 1 使用相同的取值export FERRETDB_TELEMETRYdisable方式 3标准DO_NOT_TRACK环境变量取值为1、t、true、y、yes、on、enable、enabledexport DO_NOT_TRACKtrue注意取值语义的差异DO_NOT_TRACK的这些真值表示禁用遥测而同样的取值出现在--telemetry标志中则表示启用见下文。取值解析统一由parseValueinternal/util/telemetry/telemetry.go完成它把字符串小写化后映射为true/false/nilnil即undecided无法识别的取值会报错。方式 4可执行文件名包含donottrack将 FerretDB 可执行文件重命名为包含donottrack字符串如ferretdb-donottrack即可禁用。:::caution 若通过此方式禁用在从可执行文件名移除donottrack字符串之前--telemetry标志与环境变量均无法再启用遥测对应上文telemetry cant be enabled的冲突检查。 :::方式 5运行时命令db.disableFreeMonitoring()在mongosh等客户端中执行db.disableFreeMonitoring():::caution 如果遥测状态已由命令行标志、环境变量或文件名设定则无法再通过运行时命令修改其状态会收到ErrLocation50840错误。 :::启用遥测三种方式详解遥测可以被显式启用三种状态中undecided是默认值显式启用意味着立即上报并包含退出前最后一次报告。命令行标志--telemetry的启用取值为1、t、true、y、yes、on、enable、enabled、optin、opt-in、allow--telemetryenable同样可以通过环境变量export FERRETDB_TELEMETRYenable或运行时命令db.enableFreeMonitoring()从源码看运行时启用/禁用都走setFreeMonitoring命令internal/handler/msg_setfreemonitoring.go通过action字段enable或disable切换状态非法取值会返回ErrBadValue。值得注意的是disable动作还会顺带清空LatestVersion、UpdateInfo、UpdateAvailable等版本通知字段——即禁用遥测后本地缓存的更新信息会被清除。启用遥测的实际价值帮助改进兼容性一个显式启用遥测的典型场景是帮助 FerretDB 团队提升与你所用应用的兼容性。原理在于undecided状态的首报延迟是一小时——如果你的集成测试或手动测试持续不足一小时且保持undecided状态那么关于未实现命令与错误的统计数据就不会上报团队将无法获得这些宝贵数据。如果愿意协助文档给出了一个完整的工作流程以显式启用遥测的方式启动 FerretDB如--telemetryenable手动测试你的应用或运行集成测试用SIGTERM或docker stop优雅停止FerretDB不要用SIGKILL或docker kill——这保证退出前的最后一次报告能成功发送正是enabled状态独有的退出前上报行为在状态目录中找到telemetry.json文件Docker 为/state其他情况为当前目录检查内容后将其发送给 FerretDB 团队。遥测状态的文件持久化除了telemetry.json每次上报生成的报告快照遥测状态本身还持久化在状态目录下的state.json中。State结构体internal/util/state/state.go中uuid实例随机标识缺失或非法时自动生成State.filltelemetry*bool类型nil表示undecidedtrue/false对应enabled/disabledTelemetryLocked、Start、PostgreSQLVersion、DocumentDBVersion、LatestVersion、UpdateInfo、UpdateAvailable等字段不持久化json:-仅在进程内有效。状态读写由Provider完成internal/util/state/provider.goNewProviderDir将状态存到state-dir/state.jsonUpdate方法每次变更都会重新持久化并通知订阅者Subscribe。这解释了文档中如果标志未设置回退到上次持久化状态的行为——比如你之前用运行时命令禁用了遥测重启后若不传任何标志状态仍保持禁用。总结FerretDB 的遥测机制设计得透明且可控默认的undecided状态给了用户一小时观察期五种禁用方式覆盖命令行、环境变量、文件名与运行时命令四个层面且一旦通过前几者锁定便无法在运行时修改同时每次上报都会在本地留下telemetry.json可审查副本命令统计只包含命令名、参数名与结果类型绝不涉及参数值、字段名与错误正文。理解这些行为后无论是出于隐私考虑关闭遥测还是为改进兼容性显式开启并提交报告你都能精准掌控 FerretDB 实例的每一个上报动作。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐EMQX Telemetry 遥测机制全解析数据采集范围、开关控制与源码实现EMQX Telemetry 遥测机制全解析数据采集范围、开关控制与源码实现 EMQX 的 emqx_telemetry 应用负责在不干扰业务的前提下定期向后端物联网消息队列通信Wasp 遥测机制完全指南数据采集范围、发送策略与退出方案Wasp 遥测机制完全指南数据采集范围、发送策略与退出方案 Wasp 作为全栈 Web 应用框架其 CLI 内置了一套匿名化、范围受限的遥测TelemetWeb框架后端前端CLI开发工具Wasp 遥测Telemetry机制全解析数据采集范围、12 小时限流与退出方式Wasp 遥测Telemetry机制全解析数据采集范围、12 小时限流与退出方式 Wasp 的遥测Telemetry是一套匿名化、范围极小的使用数据采Web框架后端前端CLI开发工具上一篇三指拖拽Windows触控板终极指南免费开源工具实现macOS级操作体验下一篇三步法解决离线音乐库歌词同步难题LRCGet完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表