乌克兰国旗 我们与乌克兰的朋友和同事站在一起。要在乌克兰急需时支持他们,请访问此页面

采样

版本  2.6 最新 前往最新的 1.x 版本

处理大量链路追踪数据时,采样至关重要。采样有助于控制生成链路追踪数据的应用程序的开销,以及追踪数据的存储和处理成本。理想情况下,采样的目标是丢弃不太重要的数据,并保留诊断问题所需的数据。

Jaeger 支持多种类型的采样策略。

头部采样

头部采样是指在链路追踪开始时做出采样决策。OpenTelemetry SDKs 内置了对头部采样的支持。有关该主题的详细信息,请参阅 OpenTelemetry 关于头部采样的文档外部链接 - Jaeger 分布式追踪平台

尾部采样

尾部采样允许在链路追踪完成后并收集到所有 Span 后再做出采样决策。这提供了对保留哪些链路追踪以及丢弃哪些链路追踪的更精细控制。其缺点在于 (a) 应用程序必须记录和导出所有链路追踪,这会带来运行时开销,以及 (b) Jaeger 后端会产生更高的内存和处理成本。您可以在 OpenTelemetry 文档外部链接 - Jaeger 分布式追踪平台中了解更多关于尾部采样的信息。

Jaeger 通过 尾部采样处理器外部链接 - 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 定义了特定操作的采样策略。策略有两种类型:probabilisticratelimiting(如上所述,注意:operation_limiting 不支持 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 服务,除非它们为这两个操作定义了自己的策略。

自适应采样

配置 remote_sampling 扩展的另一种方式是使用自适应采样,它通过观察接收到的 Span 并重新计算每个服务/端点组合的采样概率来工作,以确保收集的链路追踪数量与 target_samples_per_second 相匹配。当检测到新的服务或端点时,它会以 initial_sampling_probability 进行采样,直到收集到足够的数据来计算适用于通过该端点的流量的速率。

自适应采样需要一个 sampling_store 存储后端来存储观察到的流量数据和计算出的概率。目前,memory(用于 all-in-one 部署)、cassandrabadgerelasticsearchopensearch 支持作为采样存储后端。此 示例配置外部链接 - Jaeger 分布式追踪平台说明了自适应采样的使用。

阅读 这篇博文外部链接 - Jaeger 分布式追踪平台了解自适应采样引擎的更多详情。