有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
文档中心 > 应用性能监控 > 最佳实践 > 使用 Jaeger 进行客户端采样配置
本文将为您介绍如何使用 Jaeger 进行客户端采样配置。

操作背景

在访问量较大时,全链路数据上报可能会导致使用应用性能监控的成本较高。在访问量级较大的情况下,往往会进行数据采样。
说明
采样指从全量采集的所有链路数据中,采集部分数据进行分析,减少上报数量和链路存储费用,降低使用应用性能监控的成本。

采样解析

以一个简单的调用关系为例:A > B > C( A 服务调用 B 服务,同时,B 服务调用 C 服务)。如果 A 服务被调用的时候没有收到任何追踪信息,A 服务的 Jaeger 库就会创建一个新的追踪(Trace),分配一个 Trace ID,并根据采样配置决策是否需要保存这次追踪。采样配置决策与请求一起传递到 B 服务和 C 服务,因此我们只需要在 A 服务进行采样配置即可。

操作步骤

采样策略

Jaeger客户端支持4种采样策略,分别是:
Constant (sampler.type=const) :采样率的可设置的值为 0 和 1,分别表示关闭采样和全部采样
Probabilistic (sampler.type=probabilistic) :按照概率采样,取值可在 0 至 1 之间,例如:设置为 0.5 ,表示对 50% 的请求采样。
Rate Limiting (sampler.type=ratelimiting):设置每秒的采样次数上限 。 例如当 sampler.param = 2.0 时,它将以每秒 2条链路对请求进行采样。
Remote (sampler.type=remote): 默认策略。 采样遵循远程设置,取值的含义和 probabilistic 相同,都意为采样的概率,但是设置为 remote 后,Client 会从 Jaeger Agent 中动态获取采样率设置。 为了最大程度地减少开销,**Jaeger 默认采用 0.1% 的采样策略采集数据 (1000次里面采集1次)**。

Java 示例

1. 将 Jaeger 库添加到依赖项中。
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-client</artifactId>
<version>0.32.0</version>
</dependency>

2. 代码示例如下。
import io.jaegertracing.Configuration;
import io.jaegertracing.Configuration.ReporterConfiguration;
import io.jaegertracing.Configuration.SamplerConfiguration;
import io.jaegertracing.internal.JaegerTracer;
import io.jaegertracing.internal.samplers.ConstSampler;
import io.opentracing.Span;
import io.opentracing.util.GlobalTracer;

...

SamplerConfiguration samplerConfig = SamplerConfiguration.fromEnv()
.withType(ConstSampler.TYPE)
.withParam(1);

ReporterConfiguration reporterConfig = ReporterConfiguration.fromEnv()
.withLogSpans(true);

Configuration config = new Configuration("helloWorld")
.withSampler(samplerConfig)
.withReporter(reporterConfig);

GlobalTracer.register(config.getTracer());

...
Span parent = GlobalTracer.get().buildSpan("hello").start();
try (Scope scope = GlobalTracer.get().scopeManager()
.activate(parent)) {
Span child = GlobalTracer.get().buildSpan("world")
.asChildOf(parent).start();
try (Scope scope = GlobalTracer.get().scopeManager()
.activate(child)) {
}
}


GO 示例

import (
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/config"
)

...

func main() {
...
cfg := config.Configuration{
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
BufferFlushInterval: 1 * time.Second,
},
}
tracer, closer, err := cfg.New(
"your_service_name",
config.Logger(jaeger.StdLogger),
)
opentracing.SetGlobalTracer(tracer)
defer closer.Close()

someFunction()
...
}

...

func someFunction() {
parent := opentracing.GlobalTracer().StartSpan("hello")
defer parent.Finish()
child := opentracing.GlobalTracer().StartSpan(
"world", opentracing.ChildOf(parent.Context()))
defer child.Finish()
}

说明
更多语言采样说明请参见 Client Library Features