Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lib/rollbar/exception_reporter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,12 @@ def log_exception_message(exception)
end

def exception_data(exception)
Rollbar.log(Rollbar.configuration.uncaught_exception_level, exception,
:use_exception_level_filters => true)
Rollbar.log(
Rollbar.configuration.uncaught_exception_level,
exception,
:is_uncaught => true,
:use_exception_level_filters => true
)
end
end
end
8 changes: 7 additions & 1 deletion lib/rollbar/item.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Item
attr_writer :payload

attr_reader :level, :message, :exception, :extra, :configuration, :scope, :logger,
:notifier, :context
:notifier, :context, :is_uncaught

def_delegators :payload, :[]

Expand All @@ -47,6 +47,7 @@ def initialize(options)
@payload = nil
@notifier = options[:notifier]
@context = options[:context]
@is_uncaught = options[:is_uncaught]
end

def payload
Expand Down Expand Up @@ -101,6 +102,11 @@ def build_optional_data(data)

data[:code_version] = configuration.code_version if configuration.code_version

if is_uncaught
data[:attributes] ||= []
data[:attributes] << { :key => 'is_uncaught', :value => 'true' }
end

return unless defined?(SecureRandom) && SecureRandom.respond_to?(:uuid)

data[:uuid] = SecureRandom.uuid
Expand Down
26 changes: 18 additions & 8 deletions lib/rollbar/notifier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,17 @@ def log(level, *args)

message, exception, extra, context = extract_arguments(args)
use_exception_level_filters = use_exception_level_filters?(extra)
is_uncaught = uncaught?(extra)

return 'ignored' if ignored?(exception, use_exception_level_filters) ||
ignore_before_process?(level, exception, message, extra)

level = lookup_exception_level(level, exception,
use_exception_level_filters)

ret = report_with_rescue(level, message, exception, extra, context)
ret = report_with_rescue(
level, message, exception, extra, context, is_uncaught
)

raise(exception) if configuration.raise_on_error && exception

Expand All @@ -157,8 +160,8 @@ def ignore_before_process?(level, exception, message, extra)
true
end

def report_with_rescue(level, message, exception, extra, context)
report(level, message, exception, extra, context)
def report_with_rescue(level, message, exception, extra, context, is_uncaught)
report(level, message, exception, extra, context, is_uncaught)
rescue StandardError, SystemStackError => e
original_error = {
:message => message,
Expand Down Expand Up @@ -412,6 +415,12 @@ def use_exception_level_filters?(options)
configuration.use_exception_level_filters_default
end

def uncaught?(options)
option_value = options && options.delete(:is_uncaught)

!!option_value
end

def call_before_process(options)
options = options_for_handler(options)
handlers = configuration.before_process
Expand Down Expand Up @@ -494,7 +503,7 @@ def filtered_level(exception)
end
end

def report(level, message, exception, extra, context)
def report(level, message, exception, extra, context, is_uncaught)
unless message || exception || extra
log_error(
'[Rollbar] Tried to send a report with no message, exception or extra data.'
Expand All @@ -503,7 +512,7 @@ def report(level, message, exception, extra, context)
return 'error'
end

item = build_item(level, message, exception, extra, context)
item = build_item(level, message, exception, extra, context, is_uncaught)

return 'ignored' if item.ignored?

Expand Down Expand Up @@ -540,7 +549,7 @@ def report_internal_error(exception, original_error = nil)
configuration.execute_hook(:on_report_internal_error, exception)

failsafe_message = 'build_item in exception_data'
item = build_item('error', nil, exception, { :internal => true }, nil)
item = build_item('error', nil, exception, { :internal => true }, nil, false)

failsafe_message = 'error in process_item'
process_item(item)
Expand Down Expand Up @@ -571,7 +580,7 @@ def skip_reporting_internal_error(exception)

## Payload building functions

def build_item(level, message, exception, extra, context)
def build_item(level, message, exception, extra, context, is_uncaught)
options = {
:level => level,
:message => message,
Expand All @@ -581,7 +590,8 @@ def build_item(level, message, exception, extra, context)
:logger => logger,
:scope => scope_object,
:notifier => self,
:context => context
:context => context,
:is_uncaught => is_uncaught
}

item = Item.new(options)
Expand Down
2 changes: 2 additions & 0 deletions lib/rollbar/plugins/rails/error_subscriber.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ def report(error, handled:, severity:, context:, source: nil)
# Rails auto injected context
extra[:controller] = extra[:controller].class.name if extra[:controller]&.respond_to?(:class)
extra[:job] = extra[:job].class.name if extra[:job]&.respond_to?(:class)
extra[:is_uncaught] = !handled
extra[:use_exception_level_filters] = !handled

Rollbar.log(severity, error, extra)
end
Expand Down
6 changes: 3 additions & 3 deletions spec/controllers/home_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def send_req(meth, path, args)

context 'rollbar base_data' do
it 'should have the Rails environment' do
data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil)
data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil, false)
data['data'][:environment].should eq(::Rails.env)
end

Expand All @@ -46,7 +46,7 @@ def send_req(meth, path, args)
config.environment = 'dev'
end

data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil)
data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil, false)
data['data'][:environment].should eq('dev')
end

Expand All @@ -55,7 +55,7 @@ def send_req(meth, path, args)
::Rails.env = ''
preconfigure_rails_notifier

data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil)
data = Rollbar.notifier.send(:build_item, 'error', 'message', nil, nil, nil, false)
data['data'][:environment].should eq('unspecified')

::Rails.env = old_env
Expand Down
8 changes: 7 additions & 1 deletion spec/rollbar/item_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
:logger => logger,
:scope => scope,
:notifier => notifier,
:context => context
:context => context,
:is_uncaught => true
}
end

Expand Down Expand Up @@ -130,6 +131,11 @@
payload['data'][:environment].should eq('overridden')
end

it 'should have the is_uncaught attribute' do
payload['data'][:attributes][0][:key].should eq('is_uncaught')
payload['data'][:attributes][0][:value].should eq('true')
end

it 'should not have custom data under default configuration' do
payload['data'][:body][:message][:extra].should be_nil
end
Expand Down
6 changes: 5 additions & 1 deletion spec/rollbar/middleware/rack_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ class RackMockError < RuntimeError; end
end

let(:expected_report_args) do
[uncaught_level, exception, { :use_exception_level_filters => true }]
[
uncaught_level,
exception,
{ :is_uncaught => true, :use_exception_level_filters => true }
]
end

describe '#call' do
Expand Down
2 changes: 1 addition & 1 deletion spec/rollbar/middleware/sinatra_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def app
end

let(:expected_report_args) do
[uncaught_level, exception, { :use_exception_level_filters => true }]
[uncaught_level, exception, { :is_uncaught => true, :use_exception_level_filters => true }]
end

describe '#call' do
Expand Down
8 changes: 6 additions & 2 deletions spec/rollbar/plugins/rack_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ class RackMockError < RuntimeError; end
let(:uncaught_level) { Rollbar.configuration.uncaught_exception_level }

it 'reports the error to Rollbar' do
expect(Rollbar).to receive(:log).with(uncaught_level, exception,
:use_exception_level_filters => true)
expect(Rollbar).to receive(:log).with(
uncaught_level,
exception,
:is_uncaught => true,
:use_exception_level_filters => true
)
expect { request.get('/will_crash') }.to raise_error(exception)
end

Expand Down
6 changes: 4 additions & 2 deletions spec/rollbar/plugins/rake_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
end

it 'reports error to Rollbar' do
expect(Rollbar).to receive(:error).with(exception,
:use_exception_level_filters => true)
expect(Rollbar).to receive(:error).with(
exception,
:use_exception_level_filters => true
)
expect(application).to receive(:orig_display_error_message).with(exception)

Rollbar::Rake.patch! # Really here Rake is already patched
Expand Down
Loading