乌克兰国旗 我们与乌克兰的朋友和同事站在一起。如需支持乌克兰渡过难关,请访问此页面

采样

版本  1.69 最新 转到最新的 2.x 版本

Jaeger 库实现了统一的预采样(或头部采样)。例如,假设我们有一个简单的调用图,服务 A 调用服务 B,服务 B 调用服务 C:A -> B -> C。当服务 A 接收到一个不包含追踪信息的请求时,Jaeger Tracer 会启动一个新的追踪,为其分配一个随机的追踪 ID,并根据当前安装的采样策略做出采样决定。采样决定会随着请求传播到 B 和 C,因此这些服务不会再次做出采样决定,而是遵循由顶层服务 A 做出的决定。这种方法确保如果一个追踪被采样,它的所有 Span 都将被记录到后端。如果每个服务都独立做出采样决定,我们将很少在后端得到完整的追踪。

客户端采样配置

在使用配置对象实例化 Tracer 时,可以通过 sampler.typesampler.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 的概率采样,但操作 op1op2 除外,它们分别以 0.2 和 0.4 的概率进行概率采样。
  • 服务 bar 的所有操作都以每秒 5 个追踪的速率进行限速。
  • 任何其他服务将使用 default_strategy 中定义的 0.5 概率进行采样。
  • default_strategy 还包含共享的每操作策略。在此示例中,我们通过使用概率 0,禁用所有服务对 /health/metrics 端点的追踪。这些每操作策略将应用于配置中未列出的任何新服务,以及 foobar 服务,除非它们对这两个操作定义了自己的策略。

自适应采样

自 Jaeger v1.27 起。

自适应采样在 jaeger-collector 中工作,它通过观察从服务接收的 Span 并重新计算每个服务/端点组合的采样概率,以确保收集的追踪数量与 --sampling.target-samples-per-second 匹配。当检测到新的服务或端点时,它最初会以 --sampling.initial-sampling-probability 的概率进行采样,直到收集到足够的数据来计算适合流经该端点的流量的速率。

自适应采样需要一个存储后端来存储观察到的流量数据和计算出的概率。目前支持 memory(用于 all-in-one 部署)、cassandrabadgerelasticsearchopensearch 作为采样存储后端。

默认情况下,自适应采样会尝试使用 SPAN_STORAGE_TYPE 指定的后端来存储数据。然而,也可以使用 SAMPLING_STORAGE_TYPE 指定第二种类型的后端。例如,SPAN_STORAGE_TYPE=elasticsearch SAMPLING_STORAGE_TYPE=cassandra ./jaeger-collector 将以一种模式运行 jaeger-collector,其中它尝试将其 Span 数据存储在配置的 elasticsearch 集群中,并将其自适应采样数据存储在配置的 cassandra 集群中。请注意,此功能不能用于将 Span 数据和自适应采样数据存储在两个不同类型的同一后端中。

阅读这篇博客文章外部链接 - Jaeger 分布式追踪平台以了解有关自适应采样引擎的更多详细信息。