moleculerjs / site

:globe_with_meridians: Official website for Moleculer
https://moleculer.services
21 stars 71 forks source link

Extend Jaeger sampler documentation. #159

Open VitaliiHrozynskyi opened 2 years ago

VitaliiHrozynskyi commented 2 years ago

Is your feature request related to a problem? Please describe. There is no clear documentation on how to configure the Jaeger sampler. Currently sampling.options refers to https://www.jaegertracing.io/docs/1.14/sampling/#client-sampling-configuration which is describing Jaeger config outside of Moleculer scope.

When using configuration object to instantiate the tracer, the type of sampling can be selected via sampler.type and sampler.param properties. Jaeger libraries support the following samplers:

Constant (sampler.type=const) sampler always makes the same decision for all traces. It either samples all traces (sampler.param=1) or none of them (sampler.param=0). Probabilistic (sampler.type=probabilistic) sampler makes a random sampling decision with the probability of sampling equal to the value of sampler.param property. For example, with sampler.param=0.1 approximately 1 in 10 traces will be sampled. Rate Limiting (sampler.type=ratelimiting) sampler uses a leaky bucket rate limiter to ensure that traces are sampled with a certain constant rate. For example, when sampler.param=2.0 it will sample requests with the rate of 2 traces per second. Remote (sampler.type=remote, which is also the default) sampler consults Jaeger agent for the appropriate sampling strategy to use in the current service. This allows controlling the sampling strategies in the services from a central configuration in Jaeger backend, or even dynamically (see Adaptive Sampling).

And here is what we have in our code:

getSampler(serviceName) {
  if (isFunction(this.opts.sampler)) return this.opts.sampler;

  if (this.opts.sampler.type == "RateLimiting")
    return new Jaeger.RateLimitingSampler(
      this.opts.sampler.options.maxTracesPerSecond,
      this.opts.sampler.options.initBalance
    );

  if (this.opts.sampler.type == "Probabilistic")
    return new Jaeger.ProbabilisticSampler(this.opts.sampler.options.samplingRate);

  if (this.opts.sampler.type == "GuaranteedThroughput")
    return new GuaranteedThroughputSampler(
      this.opts.sampler.options.lowerBound,
      this.opts.sampler.options.samplingRate
    );

  if (this.opts.sampler.type == "RemoteControlled")
    return new RemoteControlledSampler(serviceName, this.opts.sampler.options);

  return new Jaeger.ConstSampler(
    this.opts.sampler.options && this.opts.sampler.options.decision != null
      ? this.opts.sampler.options.decision
      : 1
  );
}

Describe the solution you'd like Describe a full list of possible sample params in docs.

Describe alternatives you've considered

Additional context