tencent cloud

文档反馈

使用 Jaeger 进行客户端采样配置

最后更新时间:2024-04-02 10:09:04
    本文将为您介绍如何使用 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
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持