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