File: rate_limiting.rb

package info (click to toggle)
ruby-jaeger-client 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 624 kB
  • sloc: ruby: 3,381; makefile: 6; sh: 4
file content (51 lines) | stat: -rw-r--r-- 1,580 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# frozen_string_literal: true

module Jaeger
  module Samplers
    # Samples at most max_traces_per_second. The distribution of sampled
    # traces follows burstiness of the service, i.e. a service with uniformly
    # distributed requests will have those requests sampled uniformly as
    # well, but if requests are bursty, especially sub-second, then a number
    # of sequential requests can be sampled each second.
    class RateLimiting
      attr_reader :tags, :max_traces_per_second

      def initialize(max_traces_per_second: 10)
        update(max_traces_per_second: max_traces_per_second)
      end

      def update(max_traces_per_second:)
        if max_traces_per_second < 0.0
          raise "max_traces_per_second must not be negative, got #{max_traces_per_second}"
        end

        return false if max_traces_per_second == @max_traces_per_second

        @tags = {
          'sampler.type' => 'ratelimiting',
          'sampler.param' => max_traces_per_second
        }
        @max_traces_per_second = max_traces_per_second
        max_balance = [max_traces_per_second, 1.0].max

        if @rate_limiter
          @rate_limiter.update(
            credits_per_second: max_traces_per_second,
            max_balance: max_balance
          )
        else
          @rate_limiter = RateLimiter.new(
            credits_per_second: max_traces_per_second,
            max_balance: [max_traces_per_second, 1.0].max
          )
        end

        true
      end

      def sample(*)
        [@rate_limiter.check_credit(1.0), @tags]
      end
    end
  end
end