class Raven::Client

Encodes events and sends them to the Sentry server.

Constants

CONTENT_TYPE
PROTOCOL_VERSION
USER_AGENT

Attributes

configuration[RW]

Public Class Methods

new(configuration) click to toggle source
# File lib/raven/client.rb, line 19
def initialize(configuration)
  @configuration = configuration
  @processors = configuration.processors.map { |v| v.new(self) }
  @state = ClientState.new
end

Public Instance Methods

send_event(event) click to toggle source
# File lib/raven/client.rb, line 25
def send_event(event)
  return false unless configuration_allows_sending

  # Convert to hash
  event = event.to_hash

  if !@state.should_try?
    Raven.logger.error("Not sending event due to previous failure(s): #{get_log_message(event)}")
    return
  end

  Raven.logger.debug "Sending event #{event[:event_id]} to Sentry"

  content_type, encoded_data = encode(event)

  begin
    transport.send_event(generate_auth_header, encoded_data,
                   :content_type => content_type)
  rescue => e
    failed_send(e, event)
    return
  end

  successful_send

  event
end
transport() click to toggle source
# File lib/raven/client.rb, line 53
def transport
  @transport ||=
    case configuration.scheme
    when 'udp'
      Transports::UDP.new(configuration)
    when 'http', 'https'
      Transports::HTTP.new(configuration)
    when 'dummy'
      Transports::Dummy.new(configuration)
    else
      fail "Unknown transport scheme '#{configuration.scheme}'"
    end
end

Private Instance Methods

configuration_allows_sending() click to toggle source
# File lib/raven/client.rb, line 69
def configuration_allows_sending
  if configuration.send_in_current_environment?
    true
  else
    configuration.log_excluded_environment_message
    false
  end
end
encode(event) click to toggle source
# File lib/raven/client.rb, line 78
def encode(event)
  hash = @processors.reduce(event.to_hash) { |memo, p| p.process(memo) }
  encoded = OkJson.encode(hash)

  case configuration.encoding
  when 'gzip'
    ['application/octet-stream', strict_encode64(Zlib::Deflate.deflate(encoded))]
  else
    ['application/json', encoded]
  end
end
failed_send(e, event) click to toggle source
# File lib/raven/client.rb, line 118
def failed_send(e, event)
  @state.failure
  Raven.logger.error "Unable to record event with remote Sentry server (#{e.class} - #{e.message})"
  e.backtrace[0..10].each { |line| Raven.logger.error(line) }
  Raven.logger.error("Failed to submit event: #{get_log_message(event)}")
end
generate_auth_header() click to toggle source
# File lib/raven/client.rb, line 94
def generate_auth_header
  now = Time.now.to_i.to_s
  fields = {
    'sentry_version' => PROTOCOL_VERSION,
    'sentry_client' => USER_AGENT,
    'sentry_timestamp' => now,
    'sentry_key' => configuration.public_key,
    'sentry_secret' => configuration.secret_key
  }
  'Sentry ' + fields.map { |key, value| "#{key}=#{value}" }.join(', ')
end
get_log_message(event) click to toggle source
# File lib/raven/client.rb, line 90
def get_log_message(event)
  (event && event[:message]) || '<no message value>'
end
strict_encode64(string) click to toggle source
# File lib/raven/client.rb, line 106
def strict_encode64(string)
  if Base64.respond_to? :strict_encode64
    Base64.strict_encode64 string
  else # Ruby 1.8
    Base64.encode64(string)[0..-2]
  end
end
successful_send() click to toggle source
# File lib/raven/client.rb, line 114
def successful_send
  @state.success
end