class XRay::RuleCache
Cache sampling rules and quota retrieved by `TargetPoller` and `RulePoller`. It will not return anything if it expires.
Attributes
last_updated[RW]
Public Class Methods
new()
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 11 def initialize @rules = [] @last_updated = nil @lock = Mutex.new end
Public Instance Methods
get_matched_rule(sampling_req, now: Time.now.to_i)
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 17 def get_matched_rule(sampling_req, now: Time.now.to_i) return nil if expired?(now) matched = nil rules.each do |rule| matched = rule if matched.nil? && rule.applies?(sampling_req) matched = rule if matched.nil? && rule.default? end matched end
load_rules(new_rules)
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 27 def load_rules(new_rules) @lock.synchronize do # Simply assign rules and sort if cache is empty if @rules.empty? @rules = new_rules return sort_rules end # otherwise we need to merge new rules and current rules curr_rules = {} @rules.each do |rule| curr_rules[rule.name] = rule end # Update the rules in the cache @rules = new_rules # Transfer state information @rules.each do |rule| curr_rule = curr_rules[rule.name] rule.merge(curr_rule) unless curr_rule.nil? end sort_rules end end
load_targets(targets_h)
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 51 def load_targets(targets_h) @lock.synchronize do @rules.each do |rule| target = targets_h[rule.name] next if target.nil? rule.rate = target.fixed_rate rule.reservoir.load_target_info( quota: target.reservoir_quota, ttl: target.reservoir_quota_ttl, interval: target.interval ) end end end
rules()
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 66 def rules @lock.synchronize do @rules end end
Private Instance Methods
expired?(now)
click to toggle source
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 81 def expired?(now) # The cache is treated as expired if it is never loaded. @last_updated.nil? || now > @last_updated + @@TTL end
sort_rules()
click to toggle source
The cache should maintain the order of the rules based on priority. If priority is the same we sort name by alphabet as rule name is unique.
# File lib/aws-xray-sdk/sampling/rule_cache.rb, line 77 def sort_rules @rules.sort_by! { |rule| [rule.priority, rule.name] } end