class Sqreen::Deliveries::Batch
Simple
delivery method that batch event already seen in a batch
Attributes
current_batch[RW]
first_seen[RW]
max_batch[RW]
max_staleness[RW]
Public Class Methods
new(session, max_batch, max_staleness, randomize_staleness = true)
click to toggle source
Calls superclass method
# File lib/sqreen/deliveries/batch.rb, line 26 def initialize(session, max_batch, max_staleness, randomize_staleness = true) super(session) self.max_batch = max_batch self.max_staleness = max_staleness @original_max_staleness = max_staleness self.current_batch = [] @first_seen = {} @randomize_staleness = randomize_staleness end
Public Instance Methods
drain()
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 44 def drain post_batch unless current_batch.empty? end
post_event(event)
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 39 def post_event(event) current_batch.push(event) post_batch if post_batch_needed?(event) end
tick()
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 48 def tick post_batch if !current_batch.empty? && stale? end
Protected Instance Methods
event_key(event)
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 95 def event_key(event) case event when Sqreen::Attack "att-#{event.rule_name}" when Sqreen::RemoteException "rex-#{event.klass}" when Sqreen::AggregatedMetric "agg-metric" when Sqreen::Kit::Signals::Signal "signal" when Sqreen::Kit::Signals::Trace "signal" end end
event_keys(event)
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 83 def event_keys(event) return [event_key(event)] unless event.is_a?(Sqreen::RequestRecord) res = [] res += event.observed.fetch(:attacks, []).map { |e| "att-#{e[:rule_name]}" } res += event.observed.fetch(:sqreen_exceptions, []).map { |e| "rex-#{e[:exception].class}" } res += event.observed.fetch(:sdk, []).select { |e| e[0] == :track }.map { |e| "sdk-track".freeze } res += event.observed.fetch(:signals, []).map { "signal".freeze } return res end
post_batch()
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 70 def post_batch session.post_batch(current_batch) current_batch.clear now = Sqreen.time @first_seen.each_key do |key| @first_seen[key] = now end return unless @randomize_staleness self.max_staleness = @original_max_staleness # Adds up to 10% of lateness self.max_staleness += rand(@original_max_staleness / 10) end
post_batch_needed?(event)
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 60 def post_batch_needed?(event) now = Sqreen.time # do not use any? {} due to side effects inside block event_keys(event).uniq.map do |key| was = @first_seen[key] @first_seen[key] ||= now was.nil? || current_batch.size > max_batch || now > (was + max_staleness) end.any? end
stale?()
click to toggle source
# File lib/sqreen/deliveries/batch.rb, line 54 def stale? min = @first_seen.values.min return false if min.nil? (min + max_staleness) < Sqreen.time end