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