Class: OpenTelemetry::Sampler::XRay::RateLimiter

Inherits:
Object
  • Object
show all
Defined in:
lib/opentelemetry/sampler/xray/rate_limiter.rb

Overview

RateLimiter keeps track of the current reservoir quota balance available (measured via available time) If enough time has elapsed, the RateLimiter will allow quota balance to be consumed/taken (decrease available time) A RateLimitingSampler uses this RateLimiter to determine if it should sample or not based on the quota balance available.

Instance Method Summary collapse

Constructor Details

#initialize(quota, max_balance_in_seconds = 1) ⇒ RateLimiter

Returns a new instance of RateLimiter.



14
15
16
17
18
19
20
# File 'lib/opentelemetry/sampler/xray/rate_limiter.rb', line 14

def initialize(quota, max_balance_in_seconds = 1)
  @max_balance_millis = max_balance_in_seconds * 1000.0
  @quota = quota
  @wallet_floor_millis = Time.now.to_f * 1000
  # current "balance" would be `ceiling - floor`
  @lock = Mutex.new
end

Instance Method Details

#take(cost = 1) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/opentelemetry/sampler/xray/rate_limiter.rb', line 22

def take(cost = 1)
  return false if @quota <= 0

  quota_per_millis = @quota / 1000.0

  # assume divide by zero not possible
  cost_in_millis = cost / quota_per_millis

  @lock.synchronize do
    wallet_ceiling_millis = Time.now.to_f * 1000
    current_balance_millis = wallet_ceiling_millis - @wallet_floor_millis
    current_balance_millis = [current_balance_millis, @max_balance_millis].min
    pending_remaining_balance_millis = current_balance_millis - cost_in_millis

    if pending_remaining_balance_millis >= 0
      @wallet_floor_millis = wallet_ceiling_millis - pending_remaining_balance_millis
      return true
    end

    # No changes to the wallet state
    false
  end
end