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

采样

版本  1.62 最新

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

客户端采样配置

在使用配置对象实例化跟踪器时,可以通过 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-agent 以获取在当前服务中使用的适当采样策略。这允许从 Jaeger 后端的中心配置(参见 远程采样 )甚至动态地(参见 自适应采样 )控制服务中的采样策略。

远程采样

如果您的客户端 SDK 配置为使用远程采样配置(参见 远程采样 API ),那么可以通过 jaeger-collector 集中控制采样率。在此设置中,会向客户端 SDK 提供一个采样策略配置,该配置描述了端点及其采样概率。此配置可以由 jaeger-collector 通过两种不同的方式生成:定期从文件加载根据流量动态计算 。生成方法由环境变量 SAMPLING_CONFIG_TYPE 控制,该变量可以设置为 file(默认值)或 adaptive

基于文件的采样配置

jaeger-collector 可以使用 --sampling.strategies-file 选项实例化,该选项指向一个文件,其中包含要提供给 Jaeger 客户端的采样策略。该选项的值可以包含指向 JSON 文件的路径,如果其内容发生变化,该文件将自动重新加载,或者包含一个 HTTP 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 定义特定于操作的采样策略。有两种类型的策略可用:probabilisticratelimiting,如 上文 所述(注意:ratelimiting 不支持 operation_strategies)。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 中通过观察从服务接收到的跨度并重新计算每个服务/端点组合的采样概率来工作,以确保收集的跟踪量与 --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,在这种模式下,它尝试将其跨度数据存储在配置的 elasticsearch 集群中,并将自适应采样数据存储在配置的 cassandra 集群中。注意,此功能不能用于将跨度和自适应采样数据存储在同一类型的两个不同后端中。

阅读 这篇博客文章external link 以详细了解自适应采样引擎。