乌克兰国旗 我们与在乌克兰的朋友和同事站在一起。如需支持处于困境中的乌克兰,请访问此页面

采样

版本  1.71 最新 前往最新的 2.x 版本

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

客户端采样配置

当使用配置对象实例化跟踪器时,可以通过 sampler.typesampler.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 种可能的策略类型:上面描述的 probabilisticratelimiting(注意: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(用于一体化部署)、cassandrabadgerelasticsearchopensearch 作为采样存储后端受支持。

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

阅读 这篇博客文章external link - Jaeger 分布式追踪平台以获取有关自适应采样引擎的更多详细信息。