class Charrington::TransformRedshift

Constants

ColumnBlacklist
Error
EventNil
KEY_FILTER_BLACKLIST
KEY_RAISE_BLACKLIST
TableNameNil

Attributes

event[RW]
top_level_keys[R]

Public Class Methods

new(event) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 18
def initialize(event)
  raise EventNil, "Event is nil" if event.nil?
  event = event.to_hash
  @event = drop_keys(event)
  @top_level_keys = @event.keys
  check_blacklist
end

Public Instance Methods

call() click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 26
def call
  handle_event_key(event)
  add_id_to_event(event)

  handle_key_transform(event, "anonymous_id", "anonymous_user")
  handle_key_transform(event, "sent_at", "published_at")
  handle_key_transform(event, "original_timestamp", "sent_at")
  handle_key_transform(event, "received_at", "sent_at")
  handle_key_transform(event, "timestamp", "sent_at")

  handle_meta_section(event)

  transform_session_stuff(event)

  event.delete_if {|k, _v| ['session', 'meta', 'published_at', 'anonymous_user'].include?(k) }

  event
end

Private Instance Methods

add_id_to_event(hash) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 55
def add_id_to_event(hash)
  hash["id"] = SecureRandom.hex(10)
end
check_blacklist() click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 99
def check_blacklist
  arr = []
  KEY_RAISE_BLACKLIST.each { |k| arr << k if event.keys.include?(k) }
  raise ColumnBlacklist, "Event contains these blacklisted keys: #{arr.join(",")}" unless arr.empty?
end
drop_keys(event) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 105
def drop_keys(event)
  event.delete_if {|k, _v| k.start_with?("@") || KEY_FILTER_BLACKLIST.include?(k) }
end
flatten_hash(hash) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 109
def flatten_hash(hash)
  hash.each_with_object({}) do |(k, v), acc|
    if v.is_a? Hash
      flatten_hash(v).map do |h_k, h_v|
        acc["#{k}_#{h_k}"] = h_v
      end
    else
      acc[k] = v
    end
  end
end
handle_event_key(hash) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 59
def handle_event_key(hash)
  event_name = hash["event"] || ""

  hash["event_text"] = event_name

  hash["event"] = underscore_event_name(event_name)
end
handle_key_transform(hash, key_that_should_be_there, key_to_take_value_from) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 47
def handle_key_transform(hash, key_that_should_be_there, key_to_take_value_from)
  unless hash.has_key?(key_that_should_be_there)
    hash[key_that_should_be_there] = hash[key_to_take_value_from] || ""
  else
    hash
  end
end
handle_meta_section(hash) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 88
def handle_meta_section(hash)
  meta_section = hash["meta"] || {}

  meta_section.each {|k, v|
    next unless k.kind_of?(String)
    next if [Array, Hash].map { |type| v.kind_of?(type) }.any?

    hash[k] = v
  }
end
transform_session_stuff(hash) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 78
def transform_session_stuff(hash)
  session_stuff = hash["session"] || {}

  session_stuff.each {|k, v|
    next unless k.kind_of?(String)

    hash["context_#{k}"] = v
  }
end
underscore_event_name(event_name) click to toggle source
# File lib/logstash/outputs/charrington/transform_redshift.rb, line 67
def underscore_event_name(event_name)
  event_name.
  gsub(/::/, '/').
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
  downcase.
  gsub(/[^a-z0-9]+/, "_").
  gsub(/\A_+/, "").
  gsub(/_+\z/, "")
end