Sha256: 89be1462568d656f0243ea6e7bcb060a2acf57b4dcc31fd9fbcff58f15032415

Contents?: true

Size: 1.55 KB

Versions: 4

Compression:

Stored size: 1.55 KB

Contents

# typed: true

require_relative '../../core'

require_relative 'sampler'
require_relative '../span'

module Datadog
  module Tracing
    module Sampling
      # {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
      # @public_api
      class RateSampler < Sampler
        KNUTH_FACTOR = 1111111111111111111

        # Initialize a {Datadog::Tracing::Sampling::RateSampler}.
        # This sampler keeps a random subset of the traces. Its main purpose is to
        # reduce the instrumentation footprint.
        #
        # * +sample_rate+: the sample rate as a {Float} between 0.0 and 1.0. 0.0
        #   means that no trace will be sampled; 1.0 means that all traces will be
        #   sampled.
        def initialize(sample_rate = 1.0)
          super()

          unless sample_rate > 0.0 && sample_rate <= 1.0
            Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
            sample_rate = 1.0
          end

          self.sample_rate = sample_rate
        end

        def sample_rate(*_)
          @sample_rate
        end

        def sample_rate=(sample_rate)
          @sample_rate = sample_rate
          @sampling_id_threshold = sample_rate * Tracing::Span::EXTERNAL_MAX_ID
        end

        def sample?(trace)
          ((trace.id * KNUTH_FACTOR) % Tracing::Span::EXTERNAL_MAX_ID) <= @sampling_id_threshold
        end

        def sample!(trace)
          sampled = trace.sampled = sample?(trace)
          trace.sample_rate = @sample_rate if sampled
          sampled
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ddtrace-1.4.2 lib/datadog/tracing/sampling/rate_sampler.rb
ddtrace-1.4.1 lib/datadog/tracing/sampling/rate_sampler.rb
ddtrace-1.4.0 lib/datadog/tracing/sampling/rate_sampler.rb
ddtrace-1.3.0 lib/datadog/tracing/sampling/rate_sampler.rb