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