在处理大量追踪数据时,采样是必不可少的。采样有助于控制生成追踪数据的应用程序的开销,以及追踪数据的存储和处理成本。理想情况下,采样的目标是丢弃不太重要的数据,保留诊断问题所需的数据。
Jaeger 支持多种类型的采样策略。
头部采样
头部采样是指在追踪开始时就做出采样决策。OpenTelemetry SDK 内置了对头部采样的支持。该主题在 OpenTelemetry 头部采样文档中有详细介绍。
尾部采样
尾部采样允许在追踪完成并收集所有 span 之后再做出采样决策。这提供了对保留哪些追踪数据和丢弃哪些追踪数据的更细粒度控制。其缺点是:(a) 应用程序必须记录和导出所有追踪数据,带来运行时开销;(b) Jaeger 后端需要更高的内存和处理成本。您可以在 OpenTelemetry 文档中了解更多关于尾部采样的信息。
Jaeger 通过 tail sampling processor 支持尾部采样。
- 此配置允许对 Jaeger 观察到的所有数据进行采样,并通过 debug 日志来诊断问题。
- 第二个配置按特定服务名称进行采样。
远程采样
远程采样是头部采样的一种形式,其中采样策略的配置由 SDK 从 Jaeger 后端获取。它允许将采样策略集中在一个位置,简化了在大规模生产系统中运行的 SDK 的管理。
Jaeger 的 remote_sampling extension 支持 Jaeger 的远程采样协议,该协议为每个服务和端点定义了不同的采样率作为采样策略。策略可以通过两种不同的方式由 Jaeger 生成:定期从文件加载或基于流量动态计算。
以下是远程采样使用的两种基本头部采样器类型:
- 概率采样器 以预配置的概率做出随机采样决策。例如,当
probability=0.1时,大约每 10 条追踪中有 1 条会被采样。 - 速率限制采样器 使用漏桶速率限制器来确保以某个恒定速率进行追踪采样。例如,当
rate=2.0时,将以每秒 2 条追踪的速率进行采样。
基于文件的采样配置
Jaeger 中的 remote_sampling extension 可以配置一个指向文件的路径,该文件描述了应如何为不同服务生成采样策略。如果文件内容发生变化,将自动重新加载。
remote_sampling:
file:
path: ./cmd/jaeger/sampling-strategies.json
如果未提供配置,Jaeger 将为所有服务返回默认的概率采样策略,概率为 0.001(0.1%)。
示例 strategies.json:
{
"service_strategies": [
{
"service": "foo",
"type": "probabilistic",
"param": 0.8,
"operation_strategies": [
{
"operation": "op1",
"type": "probabilistic",
"param": 0.2
},
{
"operation": "op2",
"type": "probabilistic",
"param": 0.4
}
]
},
{
"service": "bar",
"type": "ratelimiting",
"param": 5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.5,
"operation_strategies": [
{
"operation": "/health",
"type": "probabilistic",
"param": 0.0
},
{
"operation": "/metrics",
"type": "probabilistic",
"param": 0.0
}
]
}
}
service_strategies 元素定义特定于服务的采样策略,operation_strategies 定义特定于操作的采样策略。有两种可能的策略类型:probabilistic 和 ratelimiting,如上所述(注意:operation_strategies 不支持 ratelimiting)。default_strategy 定义了当服务未包含在 service_strategies 中时所传播的兜底采样策略。
在上面的示例中:
- 服务
foo的所有操作以 0.8 的概率进行采样,但操作op1和op2分别以 0.2 和 0.4 的概率进行概率采样。 - 服务
bar的所有操作以每秒 5 条追踪的速率进行限速采样。 - 任何其他服务将以
default_strategy定义的 0.5 概率进行采样。 default_strategy还包括共享的按操作策略。在此示例中,我们通过使用概率 0 来禁用所有服务的/health和/metrics端点的追踪。这些按操作策略将应用于配置中未列出的任何新服务,以及foo和bar服务(除非它们为这两个操作定义了自己的策略)。
自适应采样
配置 remote_sampling extension 的另一种方式是使用自适应采样。其工作原理是观察接收到的 span,并重新计算每个服务/端点组合的采样概率,以确保收集的追踪数据量与 target_samples_per_second 匹配。当检测到新的服务或端点时,会使用 initial_sampling_probability 进行采样,直到收集到足够的数据来计算适合该端点流量的采样率。
自适应采样需要 sampling_store 存储后端来存储观察到的流量数据和计算出的概率。目前支持 memory(用于 all-in-one 部署)、cassandra、badger、elasticsearch 和 opensearch 作为采样存储后端。此示例配置展示了自适应采样的使用方法。
阅读这篇博客文章了解自适应采样引擎的更多详情。