采样
通过 跟踪 (traces),您可以观察请求在分布式系统中从一个服务流向另一个服务的过程。跟踪对于系统的高层和深入分析都非常实用。
然而,如果绝大多数请求都成功完成,并且延迟和错误都在可接受范围内,那么您并不需要 100% 的跟踪数据来有效地观察您的应用程序和系统。您只需要正确的采样。
术语
在讨论采样时使用一致的术语非常重要。跟踪或跨度 (span) 被视为“已采样”或“未采样”。
- 已采样:跟踪或跨度已被处理和导出。因为它被采样器选为人群的代表,所以它被视为“已采样”。
- 未采样:跟踪或跨度未被处理或导出。因为它未被采样器选择,所以它被视为“未采样”。
有时,这些术语的定义会被混淆。您可能会发现有人说他们正在“剔除数据”或未被处理或导出的数据被视为“已采样”。这些说法是不正确的。
为何需要采样?
采样是减少可观测性成本而不损失可见性的最有效方法之一。虽然还有其他降低成本的方法,例如过滤或聚合数据,但这些其他方法并不遵循代表性原则,而代表性原则对于执行应用程序或系统行为的深入分析至关重要。
代表性是指较小的群体可以准确地代表较大的群体的原则。此外,代表性可以通过数学验证,这意味着您可以高度确信较小的数据样本准确地代表了较大的群体。
此外,您生成的数据越多,您实际需要代表性样本的数据就越少。对于高流量系统,通常 1% 或更低的采样率就可以非常准确地代表其他 99% 的数据。
何时采样
如果您符合以下任何条件,请考虑采样:
- 您每秒生成 1000 个或更多跟踪。
- 您的大部分跟踪数据代表了健康的流量,数据变化很小。
- 您有一些常见标准,例如错误或高延迟,通常意味着有问题。
- 您有一些特定于领域的标准,可用于确定除错误和延迟之外的相关数据。
- 您可以描述一些确定数据是应被采样还是丢弃的常见规则。
- 您有办法区分您的服务,以便对高流量和低流量服务应用不同的采样率。
- 您能够将未采样的数据(以防万一)路由到低成本存储系统。
最后,考虑您的总体预算。如果您用于可观测性的预算有限,但可以花费时间进行有效的采样,那么采样通常是值得的。
何时不要采样
采样可能不适合您。如果您符合以下任何条件,您可能想避免采样:
- 您生成的数据量非常少(每秒几十个小跟踪或更少)。
- 您仅聚合使用可观测性数据,因此可以预先聚合数据。
- 您因法规等情况而无法丢弃数据(并且无法将未采样的数据路由到低成本存储)。
最后,请考虑与采样相关的以下三个成本:
- 有效采样数据的直接计算成本,例如尾部采样代理。
- 随着越来越多的应用程序、系统和数据卷入,维护有效采样方法的间接工程成本。
- 由于无效采样技术而错失关键信息的间接机会成本。
采样虽然在降低可观测性成本方面很有效,但如果执行不当,可能会引入其他意想不到的成本。根据您的可观测性后端、数据性质以及您尝试有效采样的程度,将更多资源分配给可观测性可能会更便宜,无论是通过供应商还是自托管计算。
头部采样
头部采样是一种采样技术,用于尽早做出采样决策。采样或丢弃跨度或跟踪的决策不是通过检查整个跟踪来做出的。
例如,最常见的头部采样形式是一致概率采样。这也称为确定性采样。在这种情况下,采样决策基于跟踪 ID 和要采样的跟踪百分比。这确保了整个跟踪都被采样——没有丢失的跨度——以一致的速率,例如所有跟踪的 5%。
头部采样的优点是:
- 易于理解
- 易于配置
- 高效
- 可以在跟踪收集管道的任何点进行
头部采样的主要缺点是无法根据整个跟踪中的数据做出采样决策。例如,您无法仅通过头部采样来确保所有包含错误的跟踪都被采样。对于这种情况以及许多其他情况,您需要尾部采样。
尾部采样
尾部采样是指通过考虑跟踪中的所有或大部分跨度来决定是否采样跟踪。尾部采样允许您根据从跟踪的不同部分派生的特定标准对跟踪进行采样,而这是头部采样无法实现的。
以下是一些如何使用尾部采样的示例:
- 始终采样包含错误的跟踪。
- 根据总体延迟对跟踪进行采样。
- 根据跟踪中一个或多个跨度上的特定属性的存在或值对跟踪进行采样;例如,对新部署的服务生成的更多跟踪进行采样。
- 根据特定标准对跟踪应用不同的采样率,例如当跟踪仅来自低流量服务与来自高流量服务的跟踪相比时。
正如您所见,尾部采样在数据采样方式上具有更高的复杂性。对于必须对遥测数据进行采样的较大系统,几乎总是需要使用尾部采样来平衡数据量与数据的有用性。
如今,尾部采样存在三个主要缺点:
- 尾部采样可能难以实现。根据您可用的采样技术类型,它并不总是“即插即用”的。随着您的系统变化,您的采样策略也会随之变化。对于大型复杂的分布式系统,实现采样策略的规则也可能很大且复杂。
- 尾部采样可能难以操作。实现尾部采样的组件必须是能够接受和存储大量数据的有状态系统。根据流量模式,这可能需要数十甚至数百个计算节点,所有这些节点都以不同的方式利用资源。此外,如果尾部采样器无法跟上接收到的数据量,它可能需要“回退”到计算效率较低的采样技术。由于这些因素,监控尾部采样组件至关重要,以确保它们拥有做出正确采样决策所需的资源。
- 如今,尾部采样器通常会成为特定于供应商的技术。如果您正在为可观测性使用付费供应商,您可用的最有效的尾部采样选项可能仅限于供应商提供的功能。
最后,对于某些系统,尾部采样可能与头部采样结合使用。例如,一组产生极高量跟踪数据的服务可能首先使用头部采样来仅采样一小部分跟踪,然后在遥测管道的后期使用尾部采样做出更复杂的采样决策,然后导出到后端。这通常是为了保护遥测管道免于过载。
支持
Collector
OpenTelemetry Collector 包含以下采样处理器:
语言 SDK
对于 OpenTelemetry API 和 SDK 的特定语言实现,您可以在相应的文档页面中找到采样支持。
供应商
许多供应商提供全面的采样解决方案,这些解决方案集成了头部采样、尾部采样和其他功能,可以满足复杂的采样需求。这些解决方案也可能针对供应商的后端进行了优化。如果您正在向供应商发送遥测数据,请考虑使用他们的采样解决方案。