OpenTelemetry 被设计成允许长期稳定性和不确定性并存的局面。在 OpenTelemetry 中,稳定性保证是在每个信号的基础上提供的。与其看版本号,不如检查你想使用的信号的稳定性等级。
信号生命周期
图 6-1 显示了新信号是如何被添加到 OpenTelemetry 的。实验性信号仍在开发中。它们可能在任何时候改变并破坏兼容性。实验性信号的开发是以规范提案的形式开始的,它是与一组原型一起开发的。一旦实验性信号准备好在生产中使用,信号的特性就会被冻结,新信号的测试版就会以多种语言创建。测试版可能不是完整的功能,它们可能会有一些突破性的变化,但它们被认为是为早期采用者的产品反馈做好准备。一旦一个信号被认为可以被宣布为稳定版本,就会发布一个候选版本。如果候选版本能够在一段时间内保持稳定,没有问题,那么该信号的规范和测试版都被宣布为稳定。
一旦一个信号变得稳定,它就属于 OpenTelemetry 的长期支持保障范围。OpenTelemetry 非常重视向后兼容和无缝升级。详情见以下章节。
如果 OpenTelemetry 信号的某个组件需要退役,该组件将被标记为废弃的。被废弃的组件不再获得新的功能,但它们仍然被 OpenTelemetry 的长期支持保证所覆盖。如果可能的话,该组件将永远不会被删除,并将继续发挥作用。如果一个组件必须被删除,将提前宣布删除日期。
实验性的功能总是与稳定性的功能保持在不同的包中,稳定的功能永远不能引用实验性的功能。这确保了新的开发不会影响现有特性的稳定性。只要库只依赖于稳定的特性,它们就不会经历破坏性的 API 变化。
API 的稳定性
OpenTelemetry API 预计将被数以千计的库所依赖,有数以百万计的调用站点。因此,API 的稳定部分决不能破坏向后的兼容性。应用程序的所有者和库的开发者不应该为了升级到一个新版本的 API 而重新测量他们的应用程序。
如果一个 OpenTelemetry API 被废弃(这不太可能),被废弃的 API 仍将保持稳定并发挥功能。
原生工具是稳定的工具
携带原生 OpenTelemetry 仪表的 OSS 库应该只使用稳定的 API,因为实验性功能的改变可能会造成依赖性冲突。
也就是说,我们鼓励进行测试。如果一个库愿意为实验性的 OpenTelemetry 功能提供支持,这是一个给项目提供反馈和参与新功能设计的好方法。然而,我们建议将与实验性 OpenTelemetry 功能的集成作为可选的插件提供,终端用户必须单独安装才能启用。
一旦功能变得稳定,就没有必要把它们作为一个单独的插件。事实上,最好是将 OpenTelemetry 原生集成,因为用户可能会忘记安装插件。这样一来,如果应用程序所有者安装了 OpenTelemetry SDK,他们就会自动开始接收来自每个库的数据。如果没有安装 SDK,API 的调用就没有意义了。原生仪表是我们希望 OpenTelemetry 能够简化应用程序所有者的观察能力的一种方式 —— 它已经存在于每一个库中,只要它需要,就可以随时使用。
SDK 和收集器的稳定性
SDK 的稳定性集中在两个方面:插件接口和资源使用。SDK 可能偶尔会废止一个插件接口。为了确保应用程序的所有者能够干净利落地进行升级,必须在废弃的接口被删除之前添加一个替代接口,而使用废弃接口的流行插件必须被迁移到新的接口上。通过以这种方式安全地迁移插件生态系统,可以避免应用程序所有者陷入这样的境地:他们想要升级,但却被一个无法使用的插件所阻挡。在废弃和移除一个插件接口之间必须有至少 6 个月的时间,而且废弃的接口只有在维护它们会造成性能问题时才会被移除。否则,我们将无限期地保留这些被废弃的接口。
说到性能,OpenTelemetry SDK 的稳定部分必须避免性能倒退,以确保 SDK 的较新版本在升级时不会引起资源争夺。很明显,启用新版本中增加的功能可能需要额外的资源。但是,简单地升级 SDK 不应该导致性能退步。
与 SDK 一样,收集器试图避免性能退步,并为收集器插件生态系统提供一个渐进的升级路径。
升级 OpenTelemetry 客户端
在运行 OpenTelemetry 时,我们希望用户能保持最新的 SDK 版本。有两个事件可能会迫使用户升级 SDK:一个库将其仪表升级到新版本的 API,或者 OpenTelemetry 发布一个重要的安全补丁。
上面列出的稳定性保证确保了这种升级路径始终是可行的。只要一个应用程序只依赖于稳定的信号,升级应该只涉及依赖性的提升。教程不需要重写,插件也不会突然变得不受支持。
OpenTelemetry 致力于向后兼容的一个很好的例子是它对其前身 OpenTracing 的支持。OpenTelemetry 追踪信号与 OpenTracing API 完全兼容,OpenTelemetry 和 OpenTracing API 调用可以混合到同一个应用程序中。OpenTracing 用户可以升级到 OpenTelemetry 而不需要重写现有的仪表。