采样
Jaeger 库实现了统一的预采样(或头部采样)。例如,假设我们有一个简单的调用图,服务 A 调用服务 B,服务 B 调用服务 C:A -> B -> C
。当服务 A 接收到一个不包含追踪信息的请求时,Jaeger Tracer 会启动一个新的追踪,为其分配一个随机的追踪 ID,并根据当前安装的采样策略做出采样决定。采样决定会随着请求传播到 B 和 C,因此这些服务不会再次做出采样决定,而是遵循由顶层服务 A 做出的决定。这种方法确保如果一个追踪被采样,它的所有 Span 都将被记录到后端。如果每个服务都独立做出采样决定,我们将很少在后端得到完整的追踪。
客户端采样配置
在使用配置对象实例化 Tracer 时,可以通过 sampler.type
和 sampler.param
属性来选择采样类型。Jaeger 库支持以下采样器:
- 常量采样器 (
sampler.type=const
) 始终对所有追踪做出相同的决定。它要么采样所有追踪 (sampler.param=1
),要么都不采样 (sampler.param=0
)。 - 概率采样器 (
sampler.type=probabilistic
) 以等于sampler.param
属性值的概率做出随机采样决定。例如,当sampler.param=0.1
时,大约 1/10 的追踪将被采样。 - 限速采样器 (
sampler.type=ratelimiting
) 使用漏桶限速器来确保追踪以一定的恒定速率采样。例如,当sampler.param=2.0
时,它将以每秒 2 个追踪的速率对请求进行采样。 - 远程采样器 (
sampler.type=remote
,也是默认设置) 会咨询 jaeger-collector,以确定在当前服务中使用的适当采样策略。这允许在 Jaeger 后端的中心配置中(参见远程采样),甚至动态地(参见自适应采样)控制服务的采样策略。
远程采样
如果你的客户端 SDK 配置为使用远程采样配置(参见 远程采样 API),则采样率可以通过 jaeger-collector 进行集中控制。在这种设置下,采样策略配置被提供给客户端 SDK,该配置描述了端点及其采样概率。此配置可以通过 jaeger-collector 通过两种不同的方式生成:从文件定期加载或根据流量动态计算。生成方法由环境变量 SAMPLING_CONFIG_TYPE
控制,它可以设置为 file
(默认)或 adaptive
。
基于文件的采样配置
jaeger-collector 可以通过 --sampling.strategies-file
选项实例化,该选项指向包含要提供给 Jaeger 客户端的采样策略的文件。选项的值可以是一个 JSON 文件的路径,该文件内容更改时会自动重新加载;也可以是一个 HTTP URL,文件会从该 URL 定期获取,重新加载频率由 --sampling.strategies-reload-interval
选项控制。
如果未提供配置,jaeger-collector 将返回默认的概率采样策略,对所有服务概率为 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
服务,除非它们对这两个操作定义了自己的策略。
自适应采样
自 Jaeger v1.27 起。
自适应采样在 jaeger-collector 中工作,它通过观察从服务接收的 Span 并重新计算每个服务/端点组合的采样概率,以确保收集的追踪数量与 --sampling.target-samples-per-second
匹配。当检测到新的服务或端点时,它最初会以 --sampling.initial-sampling-probability
的概率进行采样,直到收集到足够的数据来计算适合流经该端点的流量的速率。
自适应采样需要一个存储后端来存储观察到的流量数据和计算出的概率。目前支持 memory
(用于 all-in-one 部署)、cassandra
、badger
、elasticsearch
和 opensearch
作为采样存储后端。
默认情况下,自适应采样会尝试使用 SPAN_STORAGE_TYPE
指定的后端来存储数据。然而,也可以使用 SAMPLING_STORAGE_TYPE
指定第二种类型的后端。例如,SPAN_STORAGE_TYPE=elasticsearch SAMPLING_STORAGE_TYPE=cassandra ./jaeger-collector
将以一种模式运行 jaeger-collector,其中它尝试将其 Span 数据存储在配置的 elasticsearch 集群中,并将其自适应采样数据存储在配置的 cassandra 集群中。请注意,此功能不能用于将 Span 数据和自适应采样数据存储在两个不同类型的同一后端中。
阅读这篇博客文章 以了解有关自适应采样引擎的更多详细信息。