Go 博客[1]
Go 1.23 为您提供了一种新方法来帮助改进 Go 工具链。通过启用 遥测上传[2] ,您可以选择与 Go 团队共享有关工具链程序及其使用情况的数据。这些数据将帮助 Go 贡献者修复错误、避免回归并做出更好的决策。
默认情况下,Go 遥测数据仅存储在您的本地计算机上。如果您启用上传,您的数据的 有限[3] 子集将每周发布到 telemetry.go.dev[4] 。
从 Go 1.23 开始,您可以使用以下命令启用本地遥测数据的上传:
go telemetry on
要禁用甚至本地遥测数据收集,请运行以下命令:
go telemetry off
遥测文档[5] 包含了更详细的实现描述。
Go 遥测的简史 ¶[6]
虽然软件遥测并不是一个新概念,但 Go 团队经历了多次迭代,以寻找满足 Go 性能、可移植性和透明度要求的遥测实现。
最初的 设计[7] 旨在做到如此不引人注目、开放和保护隐私,以至于默认情况下可以接受启用,但许多用户在长时间的 公开讨论[8] 中提出了担忧,最终设计被 更改[9] 为需要用户明确同意远程上传。
新设计于 2023 年 4 月 被接受[10] ,并在那个夏天实施。
gopls 中的遥测 ¶[11]
Go 遥测的第一次迭代于 2023 年 10 月在 Go 语言服务器 gopls
[12] 的 v0.14[13] 版本中发布。发布后,大约有 100 名用户启用了上传,可能是受到发布说明或 Gophers Slack[14] 频道讨论的激励,数据开始慢慢流入。不久之后,遥测就在 gopls 中发现了第一个错误:
Dan 在他上传的遥测数据中注意到的堆栈跟踪导致一个错误被报告并修复。值得指出的是,我们不知道是谁报告了这个堆栈。
IDE 提示 ¶[15]
虽然看到遥测在实践中发挥作用很棒,我们也感谢那些早期采用者的支持,但 100 名参与者还不足以衡量我们想要衡量的类型。
正如 Russ Cox 在他最初的博客文章中 指出的[8] ,遥测默认关闭的方法的一个缺点是需要持续鼓励参与。需要进行外展活动以维持足够大的用户样本,以进行有意义的定量数据分析,并代表用户群体。虽然博客文章和发布说明可以提高参与度(我们很感谢如果您在阅读本文后启用遥测!),但它们会导致样本偏斜。例如,我们从 gopls 的早期遥测采用者那里几乎没有收到 GOOS=windows
的数据。
为了帮助接触更多用户,我们在 VS Code Go 插件[16] 中引入了一个提示,询问用户是否要启用遥测:
VS Code 显示的遥测提示。
截至本博客文章发布时,该提示已推广到 5% 的 VS Code Go 用户,遥测样本已增长到每周约 1800 名参与者:
提示有助于接触更多用户。
(初始的增长可能是由于向 VS Code Go 每夜版[17] 扩展的_所有_用户发出提示所致)。
然而,与 最新的Go调查结果[18] 相比,这引入了明显偏向VS Code用户的倾斜:
我们怀疑VS Code在遥测数据中被过度代表。
我们计划通过 向所有使用gopls的支持LSP的编辑器发出提示[19] 来解决这种倾斜,这将利用语言服务器协议本身的一项功能。
遥测的成功 ¶[20]
出于谨慎考虑,我们在gopls初始推出遥测时只提议收集几个基本指标。其中之一是 gopls/bug
[21] 堆栈计数器,它记录gopls遇到的意外或"不可能"的情况。实际上,它是一种断言,但不是停止程序,而是在遥测中记录它在某次执行中被触及,以及堆栈。
在我们的 gopls可扩展性[22] 工作中,我们添加了许多这种类型的断言,但在测试或我们自己使用gopls时很少观察到它们失败。我们预期这些断言中的绝大多数是无法触及的。
当我们开始提示VS Code中的随机用户启用遥测时,我们发现许多这些条件_确实_在实践中被触及,而堆栈跟踪的上下文通常足以让我们重现并修复长期存在的错误。我们开始在 gopls/telemetry-wins
[23] 标签下收集这些问题,以跟踪遥测带来的"成功"。
我开始以第二种含义思考"遥测成功":当比较有遥测和无遥测的gopls开发时,遥测胜出。
谢谢Paul的建议。
遥测带来的错误中最令人惊讶的方面是它们中有多少是_真实的_。当然,有些对用户是不可见的,但相当多的是gopls的实际错误行为——比如在某些罕见条件下缺失交叉引用,或微妙的不准确补全。这些正是用户可能会轻微烦恼但可能不会费心报告为问题的那种事情。也许用户会假设这种行为是有意的。如果他们确实报告了问题,他们可能不确定如何重现错误,或者我们需要在问题跟踪器上进行长时间的来回沟通才能捕获堆栈跟踪。没有遥测,_没有合理的方式_能发现这些错误中的大多数,更不用说修复它们了。
而这一切仅仅来自几个计数器。我们只对_我们知道的_潜在错误进行了堆栈跟踪的检测。那么我们没有预料到的问题呢?
自动崩溃报告 ¶[24]
Go 1.23包含了一个新的 runtime.SetCrashOutput
[25] API,可以通过看门狗进程实现自动崩溃报告。从 v0.15.0[26] 开始,gopls在崩溃时报告crash/crash
堆栈计数器,前提是gopls本身是用Go 1.23构建的。
当我们发布gopls@v0.15.0时,我们样本中只有少数用户使用未发布的Go 1.23开发版构建了gopls,但新的crash/crash
计数器仍然发现了 两个错误[27] 。
考虑到遥测仅使用少量检测和目标样本的一小部分就已证明如此有用,未来看起来一片光明。
Go 1.23在Go工具链中记录遥测数据,包括go
命令和其他工具如编译器、链接器和go vet
。我们已经为vulncheck
和VS Code Go插件添加了遥测功能,并 提议[28] 将其添加到delve
中。
原始的遥测博客系列 构思了许多想法[29] ,探讨如何利用遥测来改进Go。我们期待探索这些想法以及更多。
在gopls中,我们计划使用遥测来提高可靠性并为决策和优先级排序提供信息。通过Go 1.23启用的自动崩溃报告,我们预计在预发布测试中能捕获更多的崩溃。展望未来,我们将添加更多计数器来衡量用户体验——关键操作的延迟、各种功能的使用频率——以便我们能够将精力集中在最能惠及Go开发者的地方。
Go将于今年11月迎来15周年,语言本身及其生态系统都在持续增长。遥测将在帮助Go贡献者更快、更安全地朝着正确方向前进方面发挥关键作用。
参考链接
1. Go 博客: https://go.dev/blog/
2. 遥测上传: https://go.dev/doc/go1.23#telemetry
3. 有限: https://go.dev/doc/telemetry#proposals
4. telemetry.go.dev: https://telemetry.go.dev/
5. 遥测文档: https://go.dev/doc/telemetry
6. ¶: https://go.dev/blog/gotelemetry#a-brief-history-of-go-telemetry
7. 设计: https://research.swtch.com/telemetry-design
8. 公开讨论: https://go.dev/issue/58409
9. 更改: https://research.swtch.com/telemetry-opt-in#campaign
10. 被接受: https://go.dev/issue/58894
11. ¶: https://go.dev/blog/gotelemetry#telemetry-in-gopls
12. gopls
: https://go.googlesource.com/tools/+/refs/heads/master/gopls/
13. v0.14: https://github.com/golang/tools/releases/tag/gopls%2Fv0.14.0
14. Gophers Slack: https://gophers.slack.com/messages/gopls/
15. ¶: https://go.dev/blog/gotelemetry#ide-prompting
16. VS Code Go 插件: https://marketplace.visualstudio.com/items?itemName=golang.go
17. VS Code Go 每夜版: https://marketplace.visualstudio.com/items?itemName=golang.go-nightly
18. 最新的Go调查结果: https://go.dev/blog/survey2024-h1-results.md
19. 向所有使用gopls的支持LSP的编辑器发出提示: https://go.dev/issue/67821
20. ¶: https://go.dev/blog/gotelemetry#telemetry-wins
21. gopls/bug
: https://go.dev/issue/62249
22. gopls可扩展性: https://go.dev/blog/gopls-scalability.md
23. gopls/telemetry-wins
: https://github.com/golang/go/issues?q=is%3Aissue+label%3Agopls%2Ftelemetry-wins
24. ¶: https://go.dev/blog/gotelemetry#automated-crash-reporting
25. runtime.SetCrashOutput
: https://go.dev/doc/go1.23#runtimedebugpkgruntimedebug
26. v0.15.0: https://github.com/golang/tools/releases/tag/gopls%2Fv0.15.0
27. 两个错误: https://github.com/golang/tools/releases/tag/gopls%2Fv0.15.2
28. 提议: https://go.dev/issue/68384
29. 构思了许多想法: https://research.swtch.com/telemetry-uses