采样
处理大量链路追踪数据时,采样至关重要。采样有助于控制生成链路追踪数据的应用程序的开销,以及追踪数据的存储和处理成本。理想情况下,采样的目标是丢弃不太重要的数据,并保留诊断问题所需的数据。
Jaeger 支持多种类型的采样策略。
头部采样
头部采样是指在链路追踪开始时做出采样决策。OpenTelemetry SDKs 内置了对头部采样的支持。有关该主题的详细信息,请参阅 OpenTelemetry 关于头部采样的文档 。
尾部采样
尾部采样允许在链路追踪完成后并收集到所有 Span 后再做出采样决策。这提供了对保留哪些链路追踪以及丢弃哪些链路追踪的更精细控制。其缺点在于 (a) 应用程序必须记录和导出所有链路追踪,这会带来运行时开销,以及 (b) Jaeger 后端会产生更高的内存和处理成本。您可以在 OpenTelemetry 文档 中了解更多关于尾部采样的信息。
Jaeger 通过 尾部采样处理器 支持尾部采样。
- 此 允许对观察到的所有数据进行采样的配置 提供了调试日志以诊断问题。
- 第二种配置是 针对特定服务名称进行采样 。
远程采样
远程采样是头部采样的一种形式,其中采样策略的配置由 SDK 从 Jaeger 后端检索。它允许将采样策略整合到一处中心位置,并简化了在大规模生产系统中运行的 SDK 的管理。
Jaeger 的 remote_sampling
扩展支持 Jaeger 的远程采样协议,该协议将采样策略定义为每个服务和端点的不同采样率。策略可以通过两种不同方式由 Jaeger 生成:从文件定期加载或根据流量动态计算。
以下是远程采样使用的两种基本类型的头部采样器
- 概率采样器 (Probabilistic) 根据预先配置的概率进行随机采样决策。例如,当
probability=0.1
时,大约 10 条链路追踪中有 1 条会被采样。 - 限速采样器 (Rate Limiting) 使用漏桶限速器来确保以一定的恒定速率进行链路追踪采样。例如,当
rate=2.0
时,它将以每秒 2 条链路追踪的速率对请求进行采样。
基于文件的采样配置
Jaeger 中的 remote_sampling
扩展可以通过指向一个文件的指针进行配置,该文件描述了如何为不同的服务生成采样策略。如果文件内容发生变化,该文件将自动重新加载。
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_limiting
不支持 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
扩展的另一种方式是使用自适应采样,它通过观察接收到的 Span 并重新计算每个服务/端点组合的采样概率来工作,以确保收集的链路追踪数量与 target_samples_per_second
相匹配。当检测到新的服务或端点时,它会以 initial_sampling_probability
进行采样,直到收集到足够的数据来计算适用于通过该端点的流量的速率。
自适应采样需要一个 sampling_store
存储后端来存储观察到的流量数据和计算出的概率。目前,memory
(用于 all-in-one 部署)、cassandra
、badger
、elasticsearch
和 opensearch
支持作为采样存储后端。此 示例配置 说明了自适应采样的使用。
阅读 这篇博文 了解自适应采样引擎的更多详情。