class LogStash::Outputs::Sentry

Attributes

sentry_keys[RW]

Public Class Methods

sentry_key(name, field_default=nil, value_default=nil) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 18
def self.sentry_key(name, field_default=nil, value_default=nil)
  name = name.to_s if name.is_a?(Symbol)

  @sentry_keys ||= []
  @sentry_keys << name

  opts = {
      :validate => :string,
      :required => false,
  }

  config name, opts.merge(if field_default then {:default => field_default} else {} end)
  config "#{name}_value", opts.merge(if value_default then {:default => value_default} else {} end)
end

Public Instance Methods

create_packet(event, timestamp) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 101
def create_packet(event, timestamp)
  require 'securerandom'
  event_id = SecureRandom.uuid.gsub('-', '')

  packet = {
    # parameters required by sentry
    :event_id => event_id,
    :timestamp => timestamp.to_s,
    :logger => get(event, :_logger) || "logstash",
    :platform => get(event, :platform) || "other",
  }

  for key in LogStash::Outputs::Sentry.sentry_keys
      sentry_key = key.gsub(/^_/,'')
      next if packet[sentry_key];
      value = get(event, key)
      packet[sentry_key] = value if value
  end

  return packet
end
get(event, key) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 77
def get(event, key)
  key = key.to_s if key.is_a?(Symbol)

  instance_variable_name = key.gsub(/\./, '')

  field = instance_variable_get("@#{instance_variable_name}")
  if field == ''
    ret = event.to_hash
    ret.delete('tags')
    return ret
  elsif field
    return event.get(field) if event.get(field)
  end

  value = instance_variable_get("@#{instance_variable_name}_value")
  return value # can be nil
end
multi_receive(events) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 95
def multi_receive(events)
  for event in events
    receive(event)
  end
end
receive(event) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 137
def receive(event)
  begin
    require 'time'
    timestamp = get(event, :timestamp) || Time.now

    sentry_packet = create_packet(event, timestamp)
    @logger.debug('Sentry packet', :sentry_packet => sentry_packet)
                 
    send_packet(event, sentry_packet, timestamp)
  rescue Exception => e
    @logger.warn('Unhandled exception', :exception => e)
  end
end
register() click to toggle source
# File lib/logstash/outputs/sentry.rb, line 74
def register
end
send_packet(event, packet, timestamp) click to toggle source
# File lib/logstash/outputs/sentry.rb, line 123
def send_packet(event, packet, timestamp)
  auth_header = "Sentry sentry_version=5," +
    "sentry_client=raven_logstash/0.4.0," +
    "sentry_timestamp=#{timestamp.to_i}," +
    "sentry_key=#{event.sprintf(@key)}," +
    "sentry_secret=#{event.sprintf(@secret)}"

  url = "#{event.sprintf(@url)}/#{event.sprintf(@project_id)}/store/"

  require 'http'
  response = HTTP.post(url, :body => packet.to_json, :headers => {:"X-Sentry-Auth" => auth_header})
  raise "Sentry answered with #{response} and code #{response.code} to our request #{packet}" unless response.code == 200
end