Class: Raven::Instance

Inherits:
Object
  • Object
show all
Defined in:
lib/raven/instance.rb

Overview

A copy of Raven’s base module class methods, minus some of the integration and global hooks since it’s meant to be used explicitly. Useful for sending errors to multiple sentry projects in a large application.

Examples:

class Foo
  def initialize
    @other_raven = Raven::Instance.new
    @other_raven.configure do |config|
      config.server = 'http://...'
    end
  end

  def foo
    # ...
  rescue => e
    @other_raven.capture_exception(e)
  end
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context = nil) ⇒ Instance

Returns a new instance of Instance.



33
34
35
# File 'lib/raven/instance.rb', line 33

def initialize(context = nil)
  @context = @explicit_context = context
end

Instance Attribute Details

#clientObject

The client object is responsible for delivering formatted data to the Sentry server.



57
58
59
# File 'lib/raven/instance.rb', line 57

def client
  @client ||= Client.new(configuration)
end

#configurationObject

The configuration object.

See Also:

  • Raven.configure


51
52
53
# File 'lib/raven/instance.rb', line 51

def configuration
  @configuration ||= Configuration.new
end

Instance Method Details

#annotate_exception(exc, options = {}) ⇒ Object

Provides extra context to the exception prior to it being handled by Raven. An exception can have multiple annotations, which are merged together.

The options (annotation) is treated the same as the “options“ parameter to “capture_exception“ or “Event.from_exception“, and can contain the same “:user“, “:tags“, etc. options as these methods.

These will be merged with the “options“ parameter to “Event.from_exception“ at the top of execution.

Examples:

begin
  raise "Hello"
rescue => exc
  Raven.annotate_exception(exc, :user => { 'id' => 1,
                           'email' => '[email protected]' })
end


161
162
163
164
165
166
# File 'lib/raven/instance.rb', line 161

def annotate_exception(exc, options = {})
  notes = (exc.instance_variable_defined?(:@__raven_context) && exc.instance_variable_get(:@__raven_context)) || {}
  notes.merge!(options)
  exc.instance_variable_set(:@__raven_context, notes)
  exc
end


207
208
209
# File 'lib/raven/instance.rb', line 207

def breadcrumbs
  BreadcrumbBuffer.current
end

#capture(options = {}) ⇒ Object

Capture and process any exceptions from the given block.

Examples:

Raven.capture do
  MyApp.run
end


100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/raven/instance.rb', line 100

def capture(options = {})
  if block_given?
    begin
      yield
    rescue Error
      raise # Don't capture Raven errors
    rescue Exception => e
      capture_type(e, options)
      raise
    end
  else
    install_at_exit_hook(options)
  end
end

#capture_type(obj, options = {}) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/raven/instance.rb', line 115

def capture_type(obj, options = {})
  return false unless should_capture?(obj)
  message_or_exc = obj.is_a?(String) ? "message" : "exception"
  if (evt = Event.send("from_" + message_or_exc, obj, options))
    yield evt if block_given?
    if configuration.async?
      configuration.async.call(evt)
    else
      send_event(evt)
    end
    Thread.current["sentry_#{object_id}_last_event_id".to_sym] = evt.id
    evt
  end
end

#configure {|configuration| ... } ⇒ Object

Call this method to modify defaults in your initializers.

Examples:

Raven.configure do |config|
  config.server = 'http://...'
end

Yields:



77
78
79
80
81
82
83
# File 'lib/raven/instance.rb', line 77

def configure
  yield(configuration) if block_given?

  self.client = Client.new(configuration)
  report_status
  client
end

#contextObject



37
38
39
40
41
42
43
# File 'lib/raven/instance.rb', line 37

def context
  if @explicit_context
    @context ||= Context.new
  else
    Context.current
  end
end

#extra_context(options = nil) ⇒ Object

Bind extra context. Merges with existing context (if any).

Extra context shows up as Additional Data within Sentry, and is completely arbitrary.

Examples:

Raven.extra_context('my_custom_data' => 'value')


197
198
199
# File 'lib/raven/instance.rb', line 197

def extra_context(options = nil)
  context.extra.merge!(options || {})
end

#last_event_idObject



130
131
132
# File 'lib/raven/instance.rb', line 130

def last_event_id
  Thread.current["sentry_#{object_id}_last_event_id".to_sym]
end

#loggerObject



45
46
47
# File 'lib/raven/instance.rb', line 45

def logger
  @logger ||= Logger.new
end

#rack_context(env) ⇒ Object



201
202
203
204
205
# File 'lib/raven/instance.rb', line 201

def rack_context(env)
  env = nil if env.empty?

  context.rack_env = env
end

#report_statusObject

Tell the log that the client is good to go



62
63
64
65
66
67
68
69
# File 'lib/raven/instance.rb', line 62

def report_status
  return if client.configuration.silence_ready
  if client.configuration.send_in_current_environment?
    logger.info "Raven #{VERSION} ready to catch errors"
  else
    logger.info "Raven #{VERSION} configured not to send errors."
  end
end

#send_event(event) ⇒ Object

Send an event to the configured Sentry server

Examples:

evt = Raven::Event.new(:message => "An error")
Raven.send_event(evt)


90
91
92
# File 'lib/raven/instance.rb', line 90

def send_event(event)
  client.send_event(event)
end

#should_capture?(message_or_exc) ⇒ Boolean

Returns:

  • (Boolean)


134
135
136
137
138
139
140
# File 'lib/raven/instance.rb', line 134

def should_capture?(message_or_exc)
  if configuration.should_capture
    configuration.should_capture.call(*[message_or_exc])
  else
    true
  end
end

#tags_context(options = nil) ⇒ Object

Bind tags context. Merges with existing context (if any).

Tags are key / value pairs which generally represent things like application version, environment, role, and server names.

Examples:

Raven.tags_context('my_custom_tag' => 'tag_value')


186
187
188
# File 'lib/raven/instance.rb', line 186

def tags_context(options = nil)
  context.tags.merge!(options || {})
end

#user_context(options = nil) ⇒ Object

Bind user context. Merges with existing context (if any).

It is recommending that you send at least the “id“ and “email“ values. All other values are arbitrary.

Examples:

Raven.user_context('id' => 1, 'email' => '[email protected]')


175
176
177
# File 'lib/raven/instance.rb', line 175

def user_context(options = nil)
  context.user = options || {}
end