Class: FiberAudit::Runtime::Limits

Inherits:
Object
  • Object
show all
Defined in:
lib/fiber_audit/runtime/limits.rb

Constant Summary collapse

WINDOW_NS =
1_000_000_000
MAX_COUNTER =
9_223_372_036_854_775_807
COUNTERS =
SessionSummary::COUNTERS
DROP_REASONS =
%i[
  sampled_out rate_limited session_event_limited session_byte_limited oversize
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(policy:, started_monotonic_ns:) ⇒ Limits

Returns a new instance of Limits.



19
20
21
22
23
24
25
26
27
28
# File 'lib/fiber_audit/runtime/limits.rb', line 19

def initialize(policy:, started_monotonic_ns:)
  raise RuntimeContractError, 'policy must be a FiberAudit::Runtime::Policy' unless policy.is_a?(Policy)

  @policy = policy
  @started_monotonic_ns = Validation.integer(started_monotonic_ns, 'started_monotonic_ns')
  @counters = COUNTERS.to_h { |name| [name, 0] }
  @window_index = 0
  @emitted_in_window = 0
  @last_admission_ns = @started_monotonic_ns
end

Instance Attribute Details

#policyObject (readonly)

Returns the value of attribute policy.



17
18
19
# File 'lib/fiber_audit/runtime/limits.rb', line 17

def policy
  @policy
end

#started_monotonic_nsObject (readonly)

Returns the value of attribute started_monotonic_ns.



17
18
19
# File 'lib/fiber_audit/runtime/limits.rb', line 17

def started_monotonic_ns
  @started_monotonic_ns
end

Instance Method Details

#countersObject



65
66
67
# File 'lib/fiber_audit/runtime/limits.rb', line 65

def counters
  @counters.dup.freeze
end

#drop!(reason) ⇒ Object



47
48
49
50
51
# File 'lib/fiber_audit/runtime/limits.rb', line 47

def drop!(reason)
  raise RuntimeContractError, "unknown runtime drop reason: #{reason.inspect}" unless DROP_REASONS.include?(reason)

  increment!(reason)
end

#emitted!(now_ns:) ⇒ Object



53
54
55
56
57
58
# File 'lib/fiber_audit/runtime/limits.rb', line 53

def emitted!(now_ns:)
  now = normalize_admission_time(now_ns)
  advance_window!(now)
  increment!(:events_emitted)
  increment_window!
end

#internal_error!(count: 1) ⇒ Object



60
61
62
63
# File 'lib/fiber_audit/runtime/limits.rb', line 60

def internal_error!(count: 1)
  amount = Validation.integer(count, 'internal error count', minimum: 1)
  increment!(:internal_errors, amount)
end

#observe!Object



30
31
32
# File 'lib/fiber_audit/runtime/limits.rb', line 30

def observe!
  increment!(:events_observed)
end

#preflight_event(now_ns:) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/fiber_audit/runtime/limits.rb', line 38

def preflight_event(now_ns:)
  now = normalize_admission_time(now_ns)
  advance_window!(now)
  return :session_event_limited unless policy.session_event_allowed?(emitted_events: @counters[:events_emitted])
  return :rate_limited unless policy.rate_allowed?(emitted_in_window: @emitted_in_window)

  nil
end

#sampled_out!Object



34
35
36
# File 'lib/fiber_audit/runtime/limits.rb', line 34

def sampled_out!
  increment!(:sampled_out)
end