Class: LogStash::Outputs::Sentry

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/outputs/sentry.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.sentry_keysObject

Returns the value of attribute sentry_keys.



32
33
34
# File 'lib/logstash/outputs/sentry.rb', line 32

def sentry_keys
  @sentry_keys
end

Class Method Details

.sentry_key(name, field_default = nil, value_default = nil) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 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

Instance Method Details

#create_packet(event, timestamp) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 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) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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) ⇒ Object



95
96
97
98
99
# File 'lib/logstash/outputs/sentry.rb', line 95

def multi_receive(events)
  for event in events
    receive(event)
  end
end

#receive(event) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
# 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

#registerObject



74
75
# File 'lib/logstash/outputs/sentry.rb', line 74

def register
end

#send_packet(event, packet, timestamp) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
# 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