概述
Jaeger 库实现了采样的一致性。
具体来说,假设我们有一个简单的调用图,其中服务 A 调用服务 B,B 调用服务 C:A -> B -> C。当服务 A 收到不包含trace信息的请求时,Jaeger Tracer会开始新的trace ,为其分配一个随机trace ID,并根据当前设置的采样策略做出采样决策。
采样决策将与随着对 B 和 C 的请求一起传播,因此这些服务不会再次做出采样决策,而是会下游服务 A 做出的决策。这种方法保证了如果对trace进行采样,所有它的span都将被采样和存储。
反之,如果每个服务都独自进行采样决策,我们几乎无法获得完整的trace信息。
客户端配置
使用配置对象实例化 tracer 时,可以通过 sampler.type 和 sampler.param 属性选择采样类型。
Jaeger 库支持以下采样方式:
- 常量(sampler.type=const):采样器对所有的trace保持相同的行为,要么采样全部的trace信息(sampler.param=1),要么忽略所有的trace信息(sampler.param=0)。
- 概率(sampler.type=probabilistic):采样器以采样概率等于 sampler.param 属性的值进行随机采样决策。例如,使用 sampler.param=0.1 时,大约每10条trace会采样其中的一条。
- 速率限制(sampler.type=ratelimiting):采样器使用速率限制来确保以某个恒定速率对trace进行采样。例如,当 sampler.param=2.0 时,它将以每秒 2 次trace采样的速率对请求进行采样。
- 远程控制(sampler.type=remote,默认值):采样器查询 Jaeger Agent以获取在当前服务中使用的适当采样策略。这允许从 Jaeger 后端的统一配置甚至动态地控制服务中的采样策略(请参阅自适应采样)。
自适应采样
自适应采样器是一个复合采样器,它结合了两个功能:
- 它基于每个操作做出采样决策,即基于span的操作名称。这在 API 服务中尤其有用,这些服务的url之间的流量差异可能非常巨大,并且对整个服务使用单个概率采样器可能会导致从不采样一些低 QPS URL。
- 它支持保证一个最低采样率,例如始终允许每秒 N 次跟踪,然后以一定的概率对高于此值的任何内容进行采样(一切都是针对每个操作,而不是针对每个服务)。
在远程控制采样器的配合下,每个操作的参数可以静态配置或从 Jaeger 后端定期拉取。
自适应采样器旨在与 Jaeger 后端即将推出的自适应采样功能配合使用。
Collector 配置
Collector 可以通过 —sampling.strategies-file 选项使用静态采样策略(如果配置了远程采样器,则传播到相应的服务)。此选项需要配置采样策略的 json 文件的路径。
如果没有配置采样策略,则 Collector 会将所有返回的服务的采样率按照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 配置的是针对特定操作的采样策略。
- Collector中的采样策略类型支持ratelimiting 和 probabilistic,其中,operation_strategies策略中不支持使用ratelimiting。
- default_strategy 定义了当服务未作为 service_strategies 的一部分匹配时而选择的默认采样策略。
下面,我们来完整解读以下上述的配置文件:
- 对于服务foo而言,op1操作以0.2的概率采样、op2操作以0.4的概率采样、其他操作均以0.8的概率采样。
- 对于服务bar而言,所有操作均限制为每秒5次trace采样。
- 其他所有的服务都以默认的0.5的概率进行采样。
- 所有的服务中,禁止了对/health和/metrics URL的请求采样,包括foo和bar服务。除非在foo和bar服务中单独对/health和/metrics URL的请求采样规则进行重写配置。