采样
Jaeger 库实现了统一的前置(或基于头部)采样。例如,假设我们有一个简单的调用图,其中服务 A 调用服务 B,B 调用服务 C:A -> B -> C
。当服务 A 收到一个不包含跟踪信息的请求时,Jaeger 跟踪器将启动一个新的跟踪,为其分配一个随机的跟踪 ID,并根据当前安装的采样策略做出采样决策。采样决策将随请求传播到 B 和 C,因此这些服务不会再次做出采样决策,而是会遵循由顶部服务 A 做出的决策。这种方法保证了如果一个跟踪被采样,其所有 Span 都将记录在后端。如果每个服务都做出自己的采样决策,我们很难在后端获得完整的跟踪。
客户端采样配置
当使用配置对象实例化跟踪器时,可以通过 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-collector 以获取当前服务中要使用的适当采样策略。这允许从 Jaeger 后端的中心配置(参见 远程采样)控制服务中的采样策略,甚至可以动态控制(参见 自适应采样)。
远程采样
如果您的客户端 SDK 配置为使用远程采样配置(参见 远程采样 API),那么采样率可以通过 jaeger-collectors 集中控制。在这种设置中,采样策略配置会提供给客户端 SDK,该配置描述了端点及其采样概率。此配置可以通过两种不同方式由 jaeger-collector 生成:从文件中定期加载 或 根据流量动态计算。生成方法由环境变量 SAMPLING_CONFIG_TYPE
控制,该变量可以设置为 file
(默认)或 adaptive
。
基于文件的采样配置
jaeger-collectors 可以通过 --sampling.strategies-file
选项实例化,该选项指向一个包含要提供给 Jaeger 客户端的采样策略的文件。该选项的值可以是一个 JSON 文件路径(如果其内容发生更改,将自动重新加载),或者是一个 HTTP URL(文件将从中定期检索,重新加载频率由 --sampling.strategies-reload-interval
选项控制)。
如果未提供配置,jaeger-collectors 将为所有服务返回默认的概率采样策略,概率为 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
定义了特定于操作的采样策略。共有 2 种可能的策略类型:上面描述的 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
(用于一体化部署)、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 和自适应采样数据。
阅读 这篇博客文章 以获取有关自适应采样引擎的更多详细信息。