开源项目的透明遥测
软件开发人员如何理解其软件的哪些部分正在使用中,它们是否按预期运行?现代的答案是遥测,这意味着软件发送将这些问题的答案返回到收集服务器的数据。这篇文章是关于为什么我认为遥测技术对开源项目很重要,以及接近遥测系统的情况以开源的方式。这导致了一种新的设计,我称之为透明遥测.如果你不耐烦,跳到结尾处的摘要.系列中的其他帖子详细设计和呈现各种用途.为什么选择遥测?
没有遥测技术,开发人员依靠错误报告和调查来发现当他们的软件无法工作或如何使用时。这两个都是技术的有效性太有限。让我们依次看看每一个。
错误报告是不够的。用户只有在认为有什么东西坏了时才提交错误报告。如果一个函数的行为与文档中的不一致,那么这是一个需要报告的明显错误。但是如果一个程序的错误行为不影响正确性,用户不太可能注意到。通过透明遥测收集的统计数据使开发人员会注意到,即使用户没有注意到,也会出现问题。
例如,在2020年初Go 1.14发布过程中,我们做了一个更改以构建macOS Go发行版的方式,作为保持其可接受性的一部分苹果的签名工具。不幸的是,我们做出改变的方式也改变了一切预编译的.a个
出现分发中附带的文件版本过时。结果是去
命令重新生成并缓存第一次运行时使用标准库,这意味着编译任何使用包的程序网
(使用cgo公司
)需要安装Xcode。所以Go 1.14及以后的版本无意中甚至需要Xcode来编译简单的Go演示程序,比如基本的HTTP服务器。这不是我们希望Go在macOS上工作的方式。在没有Xcode的系统上,当去
试图调用叮当作响
,macOS弹出一个框解释如何安装。用户只是接受这是必要的,也许甚至在思考去
已经显示了弹出窗口。在Go发布的三年中,没有人报告过这个bug。直到2022年底,我们在调查其他事情时才注意到并解决了这个问题。通过对预编译的标准库包的高速缓存中的未命中率进行遥测,影响是显而易见的:所有运行Go 1.14或更高版本的Mac电脑预安装的软件包丢失率为100%。我们的单元测试没有发现这个错误,因为它是由由具有修改过的环境的分布式构建机器与实际用户机器不同。单元测试在相同的修改环境中运行因为它的构造和工作都很好。开发人员计算机之间的这些意外差异用户机器在规模上是不可避免的。在用户机器上检测软件是最可靠的了解其工作情况的方法。
调查是不够的。调查有助于我们了解用户想使用Go、,但它们只是一个小样本,分辨率有限。询问调查废物中不常用特征的使用情况大多数受访者都有时间,需要大量回应计数以获得准确的测量结果。
例如,我们在Go 1.13发行说明中宣布未来的版本将不再支持本机客户端(GOOS=氯化钠
).同样,我们在Go 1.15发行说明中宣布未来的版本将不再支持硬件浮点在不带SSE2指令的32位Intel CPU上(GO386=387
).这两次移除都进行得很顺利,追溯性地证明我们的关于很少有人会受到影响的直觉是正确的。另一方面,我们起草了Go 1.18的公告移除-buildmode=共享
,因为它本质上是自从引入模块以来,但当我们发布Go 1.18 beta 1时,我们收到了反馈至少有几个人以某种形式使用它。我们仍然不知道有多少人在使用它,或者它是不是值得维护成本,所以它一直存在.另一个问题是要支持ARMv5多长时间(山羊=5
),它没有现代原子指令。最近,我们宣布Go 1.20将是最后一个发布以支持macOS High Sierra立即要求保留.使用信息将帮助我们做出更明智的决定。请务必注意此使用信息的局限性:如果在所有使用有问题的功能,或仅用于机器熬夜的时间不足以报告任何事情,那么我们就不遵守用法了。遥测从来都不是完美的,但它是决策的有用输入比猜测要好得多。调查并不是更好,通常也是更差:我们能问多少问题是有限制的在调查中合理提问,问一个99%的人回答“不,我不使用那个”的问题浪费了大多数人的时间。为什么要对开源进行遥测?
当你听到遥测这个词时,如果你和我一样,你可能已经对侵入性详细痕迹的心理图像的发自内心的负面反应你的每一次按键和鼠标点击都会返回给开发人员你正在使用的软件。这是有充分理由的!那个心理图像听起来一定是夸张了但结果相当准确。(引文:Kindle跟踪单个页面的翻页次数,VS代码遥测日志,和.NET遥测事件.)
开源软件项目倾向于避免这种遥测,原因有二。首先,收集和存储详细的活动痕迹会给用户带来巨大的隐私成本。第二个是必须限制对这些数据的访问,这将使该项目的开放程度低于大多数人努力追求的程度。当选择是在这种侵入性跟踪还是什么都不做之间,什么都不做似乎很容易。然而,什么都不做也有真正的缺点。这意味着像我这样的开源开发人员往往不太理解我们的软件是如何使用或如何执行的。然后,因为我们缺乏这些知识,我们最终通过维护未使用的功能来浪费时间,通过删除仍在使用的功能伤害用户,并且由于没有注意到而提供较差的用户体验当我们的软件在实际使用中表现不佳时。
一些开源项目采用了传统的遥测技术,成功率参差不齐,用户反推程度各不相同。例如:无畏,GitLab公司,和自制软件.自制的遥测技术似乎已被用户普遍接受,VS Code的详细遥测尚未停止它不会被74%的开发者使用,据报道2022年StackOverflow调查.甚至可能遥测的好处是VSCode开发人员能够构建用户非常喜欢的工具的部分原因。即便如此,绝大多数项目,甚至是大型项目,远离遥测。
我相信在侵入性追踪之间的选择什么都不做是错误的二分法,它正在损害开源。没有基本信息关于他们的软件是如何使用的以及它的性能如何相比之下,开源开发人员处于劣势商业软件开发人员。没有这些信息会让人更难理解什么重要,什么不起作用,使优先排序变得更加困难。没有明确的优先顺序反过来会加剧与维护人员职业倦怠相关的预先存在的问题。
埃里克·雷蒙德(Eric Raymond)有一句名言“只要有足够的眼球,所有的虫子都是浅的,”他解释为意思是“[g]拥有足够大的beta-tester和联合开发人员基础,几乎每一个问题都会很快被描述出来,而解决方法对某些人来说是显而易见的。”也许这在1997年是真的(也许不是),但今天肯定不是这样,正如Go macOS缓存错误所示。四分之一个世纪后,软件变得更大了,并使用开源软件到目前为止,还有更多人没有开发它并且不熟悉它应该和不应该如何表现。眼球没有鳞片。
我认为开源软件项目需要探索新的遥测设计有助于开发人员获得他们高效工作所需的信息,没有收集详细用户活动的侵入性痕迹。透明遥测
这一系列博客帖子提出了一个这样的设计,我称之为透明遥测,因为它收集的数据尽可能少(每年从每个安装中收集数千字节)然后发布它收集的每一位,供公众检查和分析。
我想探索在Go工具链中使用此系统或类似系统,我希望这将有助于Go项目开发人员和用户。明确地说,我只是建议在Go中添加工具Go团队编写和分发的命令行工具,例如去
命令,Go编译器,戈普斯
、和政府检查
.我是不建议由Go编译器添加指令插入世界上所有围棋项目:这显然是不合适的。此外,在这些帖子中,“开发人员”指的是给定文章的作者软件,而“用户”是指用户该软件的。从Go工具链的角度来看,“开发人员”是指像我这样的Go工具链开发人员,而“用户”是指数百万围棋程序员之一使用工具链。
通过透明遥测,当Go工具链中的程序运行时,他们会为各种有趣的事件增加计数器(例如:缓存命中、使用给定功能、在给定范围内测量的延迟)。这些文件只保存计数器值,而不保存用户数据或用户标识符。一些计数器名称包括一个简短的堆栈跟踪(仅函数名称和行偏移量,没有参数数据)。
谷歌的Go团队将运行一个收集服务器。每周,概率为10%(平均每年约5次)用户的Go安装将下载一个“集合配置”找出服务器感兴趣的计数器值以及采样率。收集配置将在Go模块中提供使用验证转到校验和数据库,以增加所有客户都能得到服务的信心相同的配置。根据采样率,Go安装可能会发送报告包含感兴趣的计数器值。典型抽样率约为2%(平均每年每个装置1份报告),但非常罕见的事件可以以更高的频率采样,最高可达10%的限制。随着更多系统参与透明遥测,任何给定系统的总采样率都会降低,因为只需要固定数量的样品.
该报告不包含任何形式的ID–没有用户登录、没有机器ID、没有MAC地址、没有IP地址、,没有IP地址前缀,没有地理位置信息,没有随机生成的伪ID,没有其他类型的标识符。报告将包含有关工具链的基本信息,比如它的版本以及它是为什么操作系统和体系结构而构建的。报告还可以包含有关版本的粗粒度信息主机操作系统(例如“Windows 8”)和Go工具链使用的其他工具,例如本地C编译器(“gcc 2.95”)。
服务器会收集每天上传的报告,更新go.dev上公开提供的遥测图,并发布完整的上传报告供公众下载、检查和分析。
尽管报告不包含任何标识符,但TCP连接上载报告如果不使用代理,将向服务器公开系统的公共IP地址。此IP地址不会以任何方式与上传的报告相关联。标准系统维护(包括DoS预防)可能需要包含IP地址、,但上传的报告将与这些日志分开保存。隐私政策与Go模块镜像和校验和数据库.
这个转到主页和下载页面已包含有关默认值的通知使用Go模块镜像和指向更多信息的链接。该通知和链接将被更新,以在默认情况下公开遥测。要退出,用户将设置GOELEMETRY=关闭
在他们的环境中或者运行一个简单的命令go env-w GOTELEMETRY=关闭
;安装后至少一周才会发送第一份遥测报告,给予足够的时间选择退出。选择退出会停止所有收集和报告:不会发送“选择退出”事件。很难看到安装Go并在未来七天内退出的系统。总结
透明遥测具有以下关键属性:
-
关于收集哪些指标的决策是在开放的公共流程。
-
集合配置是从以下位置自动生成的主动跟踪的指标:没有收集不需要的数据用于度量。
-
使用篡改证据提供集合配置透明日志,很难提供不同的不同系统的集合配置。
-
集合配置是一个可缓存的代理Go模块,因此,任何增强隐私的本地Go代理都已用于普通模块将自动用于集合配置。进一步改善对跟踪系统的关注通过下载集合配置,每次安装都只需要下载配置每周概率为10%,这样每次安装都只需要配置每年大约5次。[更新,2023-02-24:设计有更改为opt-in,这需要提高这些概率。]
-
上传的报告仅包括一周内的事件总数,不是任何按时间排序的事件跟踪。
-
上传的报告不包括用户ID、机器ID或任何其他类型的ID。
-
上传的报告仅包含收集服务器已知的字符串:计数器名称、程序名称和集合配置中重复的版本字符串,以及特定的、未修改的Go工具链程序中的函数名用于堆栈跟踪。报告中唯一的非字符串数据类型是事件计数、日期和行号。
-
上传报告的HTTP会话公开的IP地址不是与报告一起记录。
-
多亏了取样,只有固定数量的上传报告实现特定精度目标所需的安装已存在。具体来说,只需要大约16000份报告在99%的置信水平下,精确度为1%。这意味着随着新系统的添加系统,每个系统报告的频率较低.保守估计,Go安装量为200万台,每周约有16000份报告,相当于每周报告率远低于2%,意味着每次安装上传的报告平均少于每年一次。[更新,2023-02-24:设计有更改为opt-in,这需要提高这些概率。]
-
汇总计算指标以图形和表格形式公开。
-
收集的完整原始数据被公开,以便项目维护人员作为直接数据收集者,他们没有专有优势或洞察力。
-
默认情况下,系统处于打开状态,但选择退出很容易、有效且持久。[更新,2023-02-24:设计已经更改为opt-in.]
接下来的步骤
有关设计的更多详细信息,请参阅下一个帖子.有关更多用例,请参阅在那之后发帖.
尽管这些帖子使用Go作为示例系统,使用透明遥测,我希望这些想法能够应用也可以被其他开源项目采用,在各自独立的收集系统中。例如,即使VS Code收集高分辨率事件跟踪(有时每分钟发生几十或数百个事件),仔细阅读这些痕迹,发现在每一个事件中几乎没有什么是新的。也就是说,VS Code因收集大量数据而受到声誉打击但似乎收集到的实际信息相对较少。也许在VS代码或类似编辑器中使用透明遥测可以提供编辑器的开发人员大致相当于洞察力和开发速度用户的隐私成本低得多。
我发布这些是为了启动关于围棋工具链如何采用遥测以某种形式帮助Go工具链开发人员做得更好关于Go开发和维护的决策。我已经编写了本地计数器收集的实现说服自己它可以做得足够便宜,但如今,该体系中没有任何其他部分以任何形式存在。我希望这个系统能在2023年建成。