rollbar 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +81 -34
  3. data/Gemfile +8 -8
  4. data/gemfiles/rails30.gemfile +10 -12
  5. data/gemfiles/rails31.gemfile +10 -12
  6. data/gemfiles/rails32.gemfile +3 -5
  7. data/gemfiles/rails40.gemfile +2 -4
  8. data/gemfiles/rails41.gemfile +2 -5
  9. data/gemfiles/rails42.gemfile +4 -9
  10. data/gemfiles/rails50.gemfile +7 -9
  11. data/gemfiles/rails51.gemfile +6 -8
  12. data/gemfiles/rails52.gemfile +5 -5
  13. data/gemfiles/rails60.gemfile +3 -4
  14. data/gemfiles/rails61.gemfile +3 -3
  15. data/lib/generators/rollbar/rollbar_generator.rb +18 -14
  16. data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +0 -0
  17. data/lib/rails/rollbar_runner.rb +12 -5
  18. data/lib/rollbar/capistrano.rb +16 -8
  19. data/lib/rollbar/capistrano3.rb +8 -2
  20. data/lib/rollbar/capistrano_tasks.rb +16 -7
  21. data/lib/rollbar/configuration.rb +113 -91
  22. data/lib/rollbar/delay/shoryuken.rb +4 -3
  23. data/lib/rollbar/delay/sidekiq.rb +3 -1
  24. data/lib/rollbar/delay/sucker_punch.rb +1 -2
  25. data/lib/rollbar/delay/thread.rb +3 -2
  26. data/lib/rollbar/deploy.rb +6 -7
  27. data/lib/rollbar/encoding/encoder.rb +7 -3
  28. data/lib/rollbar/exception_reporter.rb +17 -8
  29. data/lib/rollbar/item/backtrace.rb +10 -8
  30. data/lib/rollbar/item/frame.rb +6 -5
  31. data/lib/rollbar/item/locals.rb +3 -1
  32. data/lib/rollbar/item.rb +47 -38
  33. data/lib/rollbar/json.rb +1 -1
  34. data/lib/rollbar/lazy_store.rb +1 -3
  35. data/lib/rollbar/logger.rb +2 -0
  36. data/lib/rollbar/logger_proxy.rb +3 -1
  37. data/lib/rollbar/middleware/js.rb +32 -20
  38. data/lib/rollbar/middleware/rack/builder.rb +3 -3
  39. data/lib/rollbar/middleware/rack/test_session.rb +3 -3
  40. data/lib/rollbar/middleware/rack.rb +4 -4
  41. data/lib/rollbar/middleware/rails/rollbar.rb +9 -6
  42. data/lib/rollbar/middleware/rails/show_exceptions.rb +8 -4
  43. data/lib/rollbar/notifier/trace_with_bindings.rb +4 -2
  44. data/lib/rollbar/notifier.rb +179 -133
  45. data/lib/rollbar/plugin.rb +8 -8
  46. data/lib/rollbar/plugins/active_job.rb +11 -2
  47. data/lib/rollbar/plugins/delayed_job/plugin.rb +10 -3
  48. data/lib/rollbar/plugins/goalie.rb +27 -16
  49. data/lib/rollbar/plugins/rails/controller_methods.rb +18 -14
  50. data/lib/rollbar/plugins/rails/railtie30.rb +2 -1
  51. data/lib/rollbar/plugins/rails/railtie32.rb +2 -1
  52. data/lib/rollbar/plugins/rails/railtie_mixin.rb +2 -2
  53. data/lib/rollbar/plugins/rails.rb +5 -2
  54. data/lib/rollbar/plugins/rake.rb +2 -1
  55. data/lib/rollbar/plugins/sidekiq/plugin.rb +5 -5
  56. data/lib/rollbar/plugins/thread.rb +1 -1
  57. data/lib/rollbar/plugins/validations.rb +3 -1
  58. data/lib/rollbar/rake_tasks.rb +0 -1
  59. data/lib/rollbar/request_data_extractor.rb +38 -17
  60. data/lib/rollbar/rollbar_test.rb +3 -1
  61. data/lib/rollbar/scrubbers/params.rb +13 -7
  62. data/lib/rollbar/scrubbers/url.rb +37 -17
  63. data/lib/rollbar/scrubbers.rb +1 -1
  64. data/lib/rollbar/truncation/remove_any_key_strategy.rb +4 -1
  65. data/lib/rollbar/truncation/remove_extra_strategy.rb +3 -1
  66. data/lib/rollbar/util/hash.rb +14 -7
  67. data/lib/rollbar/util/ip_anonymizer.rb +1 -1
  68. data/lib/rollbar/util.rb +19 -13
  69. data/lib/rollbar/version.rb +1 -1
  70. data/lib/rollbar.rb +12 -7
  71. data/lib/tasks/benchmark.rake +2 -1
  72. data/rollbar.gemspec +3 -1
  73. metadata +3 -3
@@ -15,9 +15,7 @@ module Rollbar
15
15
  # The notifier class. It has the core functionality
16
16
  # for sending reports to the API.
17
17
  class Notifier
18
- attr_accessor :configuration
19
- attr_accessor :last_report
20
- attr_accessor :scope_object
18
+ attr_accessor :configuration, :last_report, :scope_object
21
19
 
22
20
  MUTEX = Mutex.new
23
21
  EXTENSION_REGEXP = /.rollbar\z/.freeze
@@ -34,7 +32,9 @@ module Rollbar
34
32
  self.scope_object = ::Rollbar::LazyStore.new(scope)
35
33
  end
36
34
 
37
- Rollbar::Util.deep_merge(configuration.payload_options, payload_options) if payload_options
35
+ return unless payload_options
36
+
37
+ Rollbar::Util.deep_merge(configuration.payload_options, payload_options)
38
38
  end
39
39
 
40
40
  def reset!
@@ -134,17 +134,8 @@ module Rollbar
134
134
  message, exception, extra, context = extract_arguments(args)
135
135
  use_exception_level_filters = use_exception_level_filters?(extra)
136
136
 
137
- return 'ignored' if ignored?(exception, use_exception_level_filters)
138
-
139
- begin
140
- status = call_before_process(:level => level,
141
- :exception => exception,
142
- :message => message,
143
- :extra => extra)
144
- return 'ignored' if status == 'ignored'
145
- rescue Rollbar::Ignore
146
- return 'ignored'
147
- end
137
+ return 'ignored' if ignored?(exception, use_exception_level_filters) ||
138
+ ignore_before_process?(level, exception, message, extra)
148
139
 
149
140
  level = lookup_exception_level(level, exception,
150
141
  use_exception_level_filters)
@@ -156,6 +147,17 @@ module Rollbar
156
147
  ret
157
148
  end
158
149
 
150
+ def ignore_before_process?(level, exception, message, extra)
151
+ status = call_before_process(:level => level,
152
+ :exception => exception,
153
+ :message => message,
154
+ :extra => extra)
155
+
156
+ status == 'ignored'
157
+ rescue Rollbar::Ignore
158
+ true
159
+ end
160
+
159
161
  def report_with_rescue(level, message, exception, extra, context)
160
162
  report(level, message, exception, extra, context)
161
163
  rescue StandardError, SystemStackError => e
@@ -202,23 +204,20 @@ module Rollbar
202
204
 
203
205
  def enabled?
204
206
  # Require access_token so we don't try to send events when unconfigured.
205
- configuration.enabled && configuration.access_token && !configuration.access_token.empty?
207
+ configuration.enabled &&
208
+ configuration.access_token &&
209
+ !configuration.access_token.empty?
206
210
  end
207
211
 
208
212
  def process_item(item)
209
- if configuration.write_to_file
210
- if configuration.use_async
211
- MUTEX.synchronize do
212
- do_write_item(item)
213
- end
214
- else
215
- do_write_item(item)
216
- end
217
- else
218
- send_item(item)
219
- end
213
+ return send_item(item) unless configuration.write_to_file
214
+
215
+ return do_write_item(item) unless configuration.use_async
216
+
217
+ MUTEX.synchronize { do_write_item(item) }
220
218
  rescue StandardError => e
221
- log_error("[Rollbar] Error processing the item: #{e.class}, #{e.message}. Item: #{item.payload.inspect}")
219
+ log_error '[Rollbar] Error processing the item: ' \
220
+ "#{e.class}, #{e.message}. Item: #{item.payload.inspect}"
222
221
  raise e unless via_failsafe?(item)
223
222
 
224
223
  log_error('[Rollbar] Item has already failed. Not re-raising')
@@ -254,10 +253,7 @@ module Rollbar
254
253
  # The final payload has already been built.
255
254
  send_body(payload)
256
255
  else
257
- item = Item.build_with(payload,
258
- :notifier => self,
259
- :configuration => configuration,
260
- :logger => logger)
256
+ item = build_item_with_payload(payload)
261
257
 
262
258
  process_item(item)
263
259
  end
@@ -269,6 +265,12 @@ module Rollbar
269
265
  end
270
266
  end
271
267
 
268
+ def build_item_with_payload(payload)
269
+ Item.build_with(payload, :notifier => self,
270
+ :configuration => configuration,
271
+ :logger => logger)
272
+ end
273
+
272
274
  def failsafe_initial_data(exception_reason)
273
275
  {
274
276
  :level => 'error',
@@ -300,21 +302,19 @@ module Rollbar
300
302
  'data' => failsafe_data
301
303
  }
302
304
 
303
- begin
304
- item = Item.build_with(failsafe_payload,
305
- :notifier => self,
306
- :configuration => configuration,
307
- :logger => logger)
308
-
309
- process_item(item)
310
- log_and_return_item_data(item)
311
- rescue StandardError => e
312
- log_error "[Rollbar] Error sending failsafe : #{e}"
313
- end
305
+ process_failsafe_item(failsafe_payload)
314
306
 
315
307
  failsafe_payload
316
308
  end
317
309
 
310
+ def process_failsafe_item(failsafe_payload)
311
+ item = build_item_with_payload(failsafe_payload)
312
+ process_item(item)
313
+ log_and_return_item_data(item)
314
+ rescue StandardError => e
315
+ log_error "[Rollbar] Error sending failsafe : #{e}"
316
+ end
317
+
318
318
  def failsafe_add_original_error_data(payload_notifier, original_error)
319
319
  return unless original_error
320
320
 
@@ -328,8 +328,10 @@ module Rollbar
328
328
  end
329
329
 
330
330
  def add_original_message(diagnostic, original_error)
331
- diagnostic[:original_message] = original_error[:message].truncate(FAILSAFE_STRING_LENGTH) if original_error[:message]
332
-
331
+ if original_error[:message]
332
+ diagnostic[:original_message] =
333
+ original_error[:message].truncate(FAILSAFE_STRING_LENGTH)
334
+ end
333
335
  rescue StandardError => e
334
336
  diagnostic[:original_message] = "Failed: #{e.message}"
335
337
  end
@@ -343,7 +345,6 @@ module Rollbar
343
345
  :stack => backtrace && backtrace.join(', ').truncate(FAILSAFE_STRING_LENGTH)
344
346
  }
345
347
  end
346
-
347
348
  rescue StandardError => e
348
349
  diagnostic[:original_error] = "Failed: #{e.message}"
349
350
  end
@@ -351,9 +352,9 @@ module Rollbar
351
352
  def add_configured_options(payload_notifier, original_error)
352
353
  if original_error[:configuration]
353
354
  configured = original_error[:configuration].configured_options.configured
354
- payload_notifier[:configured_options] = ::JSON.generate(configured).truncate(FAILSAFE_STRING_LENGTH)
355
+ payload_notifier[:configured_options] =
356
+ ::JSON.generate(configured).truncate(FAILSAFE_STRING_LENGTH)
355
357
  end
356
-
357
358
  rescue StandardError => e
358
359
  payload_notifier[:configured_options] = "Failed: #{e.message}"
359
360
  end
@@ -390,7 +391,8 @@ module Rollbar
390
391
  end
391
392
 
392
393
  def enable_locals?
393
- configuration.locals[:enabled] && [:app, :all].include?(configuration.send_extra_frame_data)
394
+ configuration.locals[:enabled] &&
395
+ [:app, :all].include?(configuration.send_extra_frame_data)
394
396
  end
395
397
 
396
398
  def enable_locals
@@ -412,13 +414,7 @@ module Rollbar
412
414
  end
413
415
 
414
416
  def call_before_process(options)
415
- options = {
416
- :level => options[:level],
417
- :scope => scope_object,
418
- :exception => options[:exception],
419
- :message => options[:message],
420
- :extra => options[:extra]
421
- }
417
+ options = options_for_handler(options)
422
418
  handlers = configuration.before_process
423
419
 
424
420
  handlers.each do |handler|
@@ -435,24 +431,30 @@ module Rollbar
435
431
  end
436
432
  end
437
433
 
434
+ def options_for_handler(options)
435
+ {
436
+ :level => options[:level],
437
+ :scope => scope_object,
438
+ :exception => options[:exception],
439
+ :message => options[:message],
440
+ :extra => options[:extra]
441
+ }
442
+ end
443
+
438
444
  def extract_arguments(args)
439
- message = nil
440
- exception = nil
441
- extra = nil
442
- context = nil
445
+ message = exception = extra = context = nil
443
446
 
444
447
  args.each do |arg|
445
448
  if arg.is_a?(String)
446
449
  message = arg
447
450
  elsif arg.is_a?(Exception)
448
451
  exception = arg
449
- elsif RUBY_PLATFORM == 'java' && arg.is_a?(java.lang.Throwable)
452
+ elsif java_exception?(arg)
450
453
  exception = arg
451
454
  elsif arg.is_a?(Hash)
452
455
  extra = arg
453
456
 
454
- context = extra[:custom_data_method_context]
455
- extra.delete :custom_data_method_context
457
+ context = extra.delete :custom_data_method_context
456
458
 
457
459
  extra = nil if extra.empty?
458
460
  end
@@ -461,6 +463,10 @@ module Rollbar
461
463
  [message, exception, extra, context]
462
464
  end
463
465
 
466
+ def java_exception?(obj)
467
+ RUBY_PLATFORM == 'java' && obj.is_a?(java.lang.Throwable)
468
+ end
469
+
464
470
  def lookup_exception_level(orig_level, exception, use_exception_level_filters)
465
471
  return orig_level unless use_exception_level_filters
466
472
 
@@ -491,7 +497,9 @@ module Rollbar
491
497
 
492
498
  def report(level, message, exception, extra, context)
493
499
  unless message || exception || extra
494
- log_error '[Rollbar] Tried to send a report with no message, exception or extra data.'
500
+ log_error(
501
+ '[Rollbar] Tried to send a report with no message, exception or extra data.'
502
+ )
495
503
 
496
504
  return 'error'
497
505
  end
@@ -518,37 +526,48 @@ module Rollbar
518
526
  log_info "[Rollbar] Data: #{data}"
519
527
  end
520
528
 
521
- # Reports an internal error in the Rollbar library. This will be reported within the configured
522
- # Rollbar project. We'll first attempt to provide a report including the exception traceback.
523
- # If that fails, we'll fall back to a more static failsafe response.
529
+ # Reports an internal error in the Rollbar library. This will be reported
530
+ # within the configured Rollbar project. We'll first attempt to provide a
531
+ # report including the exception traceback. If that fails, we'll fall back
532
+ # to a more static failsafe response.
524
533
  def report_internal_error(exception, original_error = nil)
525
- log_error '[Rollbar] Reporting internal error encountered while sending data to Rollbar.'
534
+ return if skip_reporting_internal_error(exception)
535
+
536
+ failsafe_message = ''
537
+ log_error(
538
+ '[Rollbar] Reporting internal error encountered while sending data to Rollbar.'
539
+ )
526
540
 
527
541
  configuration.execute_hook(:on_report_internal_error, exception)
528
542
 
529
- begin
530
- item = build_item('error', nil, exception, { :internal => true }, nil)
531
- rescue StandardError => e
532
- send_failsafe('build_item in exception_data', e, original_error)
533
- log_error "[Rollbar] Exception: #{exception}"
534
- return
535
- end
543
+ failsafe_message = 'build_item in exception_data'
544
+ item = build_item('error', nil, exception, { :internal => true }, nil)
536
545
 
537
- begin
538
- process_item(item)
539
- rescue StandardError => e
540
- send_failsafe('error in process_item', e, original_error)
541
- log_error "[Rollbar] Item: #{item}"
542
- return
543
- end
546
+ failsafe_message = 'error in process_item'
547
+ process_item(item)
544
548
 
545
- begin
546
- log_instance_link(item['data'])
547
- rescue StandardError => e
548
- send_failsafe('error logging instance link', e, original_error)
549
- log_error "[Rollbar] Item: #{item}"
550
- return
549
+ failsafe_message = 'error logging instance link'
550
+ log_instance_link(item['data'])
551
+ rescue StandardError => e
552
+ send_failsafe(failsafe_message, e, original_error)
553
+ log_error(item ? "[Rollbar] Item: #{item}" : "[Rollbar] Exception: #{exception}")
554
+ end
555
+
556
+ def skip_reporting_internal_error(exception)
557
+ return true if configuration.ignore_internal_errors == true
558
+
559
+ configuration.ignore_internal_errors.each do |error_name|
560
+ begin
561
+ error_cls = error_name.split('::').reduce(Module, :const_get)
562
+ return true if exception.class <= error_cls
563
+ rescue NameError
564
+ # Ignore errors and continue matching.
565
+ # It's possible for a class name in the list to not be resolvable,
566
+ # and this is ok.
567
+ end
551
568
  end
569
+
570
+ false
552
571
  end
553
572
 
554
573
  ## Payload building functions
@@ -579,7 +598,8 @@ module Rollbar
579
598
 
580
599
  headers = { 'X-Rollbar-Access-Token' => configuration.access_token }
581
600
  options = http_proxy_for_em(uri)
582
- req = EventMachine::HttpRequest.new(uri.to_s, options).post(:body => body, :head => headers)
601
+ req = EventMachine::HttpRequest.new(uri.to_s, options).post(:body => body,
602
+ :head => headers)
583
603
 
584
604
  eventmachine_callback(req)
585
605
  eventmachine_errback(req)
@@ -590,7 +610,8 @@ module Rollbar
590
610
  if req.response_header.status == 200
591
611
  log_info '[Rollbar] Success'
592
612
  else
593
- log_warning "[Rollbar] Got unexpected status code from Rollbar.io api: #{req.response_header.status}"
613
+ log_warning '[Rollbar] Got unexpected status code from Rollbar.io api: ' \
614
+ "#{req.response_header.status}"
594
615
  log_info "[Rollbar] Response: #{req.response}"
595
616
  end
596
617
  end
@@ -598,7 +619,9 @@ module Rollbar
598
619
 
599
620
  def eventmachine_errback(req)
600
621
  req.errback do
601
- log_warning "[Rollbar] Call to API failed, status code: #{req.response_header.status}"
622
+ log_warning(
623
+ "[Rollbar] Call to API failed, status code: #{req.response_header.status}"
624
+ )
602
625
  log_info "[Rollbar] Error's response: #{req.response}"
603
626
  end
604
627
  end
@@ -626,33 +649,44 @@ module Rollbar
626
649
  end
627
650
 
628
651
  def do_post(uri, body, access_token)
629
- proxy = http_proxy(uri)
630
- http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password)
631
-
632
- http.open_timeout = configuration.open_timeout
633
- http.read_timeout = configuration.request_timeout
634
-
635
- if uri.scheme == 'https'
636
- http.use_ssl = true
637
- http.verify_mode = ssl_verify_mode
638
- end
652
+ http = init_http(uri)
639
653
 
640
654
  request = Net::HTTP::Post.new(uri.request_uri)
641
655
 
642
656
  request.body = pack_ruby260_bytes(body)
643
657
 
644
658
  # Ensure the payload token will be used if the option is set.
645
- unless (configuration.use_payload_access_token)
659
+ unless configuration.use_payload_access_token
646
660
  request.add_field('X-Rollbar-Access-Token', access_token)
647
661
  end
648
662
 
649
663
  handle_net_retries { http.request(request) }
650
664
  end
651
665
 
666
+ def init_http(uri)
667
+ proxy = http_proxy(uri)
668
+ http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user,
669
+ proxy.password)
670
+
671
+ init_http_timeouts(http)
672
+
673
+ if uri.scheme == 'https'
674
+ http.use_ssl = true
675
+ http.verify_mode = ssl_verify_mode
676
+ end
677
+
678
+ http
679
+ end
680
+
681
+ def init_http_timeouts(http)
682
+ http.open_timeout = configuration.open_timeout
683
+ http.read_timeout = configuration.request_timeout
684
+ end
685
+
652
686
  def pack_ruby260_bytes(body)
653
687
  # Ruby 2.6.0 shipped with a bug affecting multi-byte body for Net::HTTP.
654
688
  # Fix (committed one day after 2.6.0p0 shipped) is here:
655
- # https://github.com/ruby/ruby/commit/1680a13a926b17661329beec1ded6b32aad16c1b#diff-00a99d8c71daaf5fc60a050da41f7261
689
+ # ruby/ruby/commit/1680a13a926b17661329beec1ded6b32aad16c1b
656
690
  #
657
691
  # We work around this by repacking the body as single byte chars if needed.
658
692
  if RUBY_VERSION == '2.6.0' && multibyte?(body)
@@ -719,7 +753,9 @@ module Rollbar
719
753
  if response.code == '200'
720
754
  log_info '[Rollbar] Success'
721
755
  else
722
- log_warning "[Rollbar] Got unexpected status code from Rollbar api: #{response.code}"
756
+ log_warning(
757
+ "[Rollbar] Got unexpected status code from Rollbar api: #{response.code}"
758
+ )
723
759
  log_info "[Rollbar] Response: #{response.body}"
724
760
  configuration.execute_hook(:on_error_response, response)
725
761
  end
@@ -739,11 +775,7 @@ module Rollbar
739
775
  body = item.dump
740
776
  return unless body
741
777
 
742
- file_name = if configuration.files_with_pid_name_enabled
743
- configuration.filepath.gsub(EXTENSION_REGEXP, "_#{Process.pid}\\0")
744
- else
745
- configuration.filepath
746
- end
778
+ file_name = file_name_with_pid(configuration)
747
779
 
748
780
  begin
749
781
  @file ||= File.open(file_name, 'a')
@@ -758,11 +790,22 @@ module Rollbar
758
790
  end
759
791
  end
760
792
 
793
+ def file_name_with_pid(configuration)
794
+ if configuration.files_with_pid_name_enabled
795
+ configuration.filepath.gsub(EXTENSION_REGEXP, "_#{Process.pid}\\0")
796
+ else
797
+ configuration.filepath
798
+ end
799
+ end
800
+
761
801
  def update_file(file, file_name)
762
802
  return unless configuration.files_processed_enabled
763
803
 
764
804
  time_now = Time.now
765
- return if configuration.files_processed_duration > time_now - file.birthtime && file.size < configuration.files_processed_size
805
+ if configuration.files_processed_duration > time_now - file.birthtime &&
806
+ file.size < configuration.files_processed_size
807
+ return
808
+ end
766
809
 
767
810
  new_file_name = file_name.gsub(EXTENSION_REGEXP, "_processed_#{time_now.to_i}\\0")
768
811
  File.rename(file, new_file_name)
@@ -771,31 +814,30 @@ module Rollbar
771
814
  end
772
815
 
773
816
  def failsafe_reason(message, exception)
774
- body = ''
817
+ return failsafe_exception_reason(message, exception) if exception
775
818
 
776
- if exception
777
- begin
778
- backtrace = exception.backtrace || []
779
- nearest_frame = backtrace[0]
819
+ message.to_s
820
+ rescue StandardError
821
+ log_error('[Rollbar] Error building failsafe message')
822
+ ''
823
+ end
780
824
 
781
- exception_info = exception.class.name
782
- # #to_s and #message defaults to class.to_s. Add message only if add valuable info.
783
- exception_info += %[: "#{exception.message}"] if exception.message != exception.class.to_s
784
- exception_info += " in #{nearest_frame}" if nearest_frame
825
+ def failsafe_exception_reason(message, exception)
826
+ backtrace = exception.backtrace || []
827
+ nearest_frame = backtrace[0]
785
828
 
786
- body += "#{exception_info}: #{message}"
787
- rescue StandardError
788
- log_error('[Rollbar] Error building failsafe exception message')
789
- end
790
- else
791
- begin
792
- body += message.to_s
793
- rescue StandardError
794
- log_error('[Rollbar] Error building failsafe message')
795
- end
829
+ exception_info = exception.class.name
830
+ # #to_s and #message defaults to class.to_s.
831
+ # Add message only if add valuable info.
832
+ if exception.message != exception.class.to_s
833
+ exception_info += %[: "#{exception.message}"]
796
834
  end
835
+ exception_info += " in #{nearest_frame}" if nearest_frame
797
836
 
798
- body
837
+ "#{exception_info}: #{message}"
838
+ rescue StandardError
839
+ log_error('[Rollbar] Error building failsafe exception message')
840
+ ''
799
841
  end
800
842
 
801
843
  def failsafe_body(reason)
@@ -828,7 +870,8 @@ module Rollbar
828
870
  configuration.async_handler.call(payload)
829
871
  rescue StandardError
830
872
  if configuration.failover_handlers.empty?
831
- log_error '[Rollbar] Async handler failed, and there are no failover handlers configured. See the docs for "failover_handlers"'
873
+ log_error '[Rollbar] Async handler failed, and there are no failover ' \
874
+ 'handlers configured. See the docs for "failover_handlers"'
832
875
  return
833
876
  end
834
877
 
@@ -846,7 +889,8 @@ module Rollbar
846
889
  rescue StandardError
847
890
  next unless handler == failover_handlers.last
848
891
 
849
- log_error "[Rollbar] All failover handlers failed while processing item: #{Rollbar::JSON.dump(item.payload)}"
892
+ log_error '[Rollbar] All failover handlers failed while processing ' \
893
+ "item: #{Rollbar::JSON.dump(item.payload)}"
850
894
  end
851
895
  end
852
896
  end
@@ -857,7 +901,9 @@ module Rollbar
857
901
  return unless data[:uuid]
858
902
 
859
903
  uuid_url = Util.uuid_rollbar_url(data, configuration)
860
- log_info "[Rollbar] Details: #{uuid_url} (only available if report was successful)"
904
+ log_info(
905
+ "[Rollbar] Details: #{uuid_url} (only available if report was successful)"
906
+ )
861
907
  end
862
908
 
863
909
  def via_failsafe?(item)
@@ -4,12 +4,8 @@ module Rollbar
4
4
  # On Rollbar initialization, all plugins will be saved in memory and those that
5
5
  # satisfy the dependencies will be loaded
6
6
  class Plugin
7
- attr_reader :name
8
- attr_reader :dependencies
9
- attr_reader :callables
10
- attr_reader :revert_callables
11
- attr_accessor :on_demand
12
- attr_accessor :loaded
7
+ attr_reader :name, :dependencies, :callables, :revert_callables
8
+ attr_accessor :on_demand, :loaded
13
9
 
14
10
  private :loaded=
15
11
 
@@ -116,11 +112,15 @@ module Rollbar
116
112
  end
117
113
 
118
114
  def log_loading_error(error)
119
- Rollbar.log_error("Error trying to load plugin '#{name}': #{error.class}, #{error.message}")
115
+ Rollbar.log_error(
116
+ "Error trying to load plugin '#{name}': #{error.class}, #{error.message}"
117
+ )
120
118
  end
121
119
 
122
120
  def log_unloading_error(error)
123
- Rollbar.log_error("Error trying to unload plugin '#{name}': #{error.class}, #{error.message}")
121
+ Rollbar.log_error(
122
+ "Error trying to unload plugin '#{name}': #{error.class}, #{error.message}"
123
+ )
124
124
  end
125
125
  end
126
126
  end
@@ -3,11 +3,17 @@ module Rollbar
3
3
  module ActiveJob
4
4
  def self.included(base)
5
5
  base.send :rescue_from, Exception do |exception|
6
+ args = if self.class.respond_to?(:log_arguments?) && !self.class.log_arguments?
7
+ arguments.map(&Rollbar::Scrubbers.method(:scrub_value))
8
+ else
9
+ arguments
10
+ end
11
+
6
12
  Rollbar.error(exception,
7
13
  :job => self.class.name,
8
14
  :job_id => job_id,
9
15
  :use_exception_level_filters => true,
10
- :arguments => arguments)
16
+ :arguments => args)
11
17
  raise exception
12
18
  end
13
19
  end
@@ -17,6 +23,9 @@ end
17
23
  if defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
18
24
  ActiveSupport.on_load(:action_mailer) do
19
25
  # Automatically add to ActionMailer::DeliveryJob
20
- ActionMailer::DeliveryJob.send(:include, Rollbar::ActiveJob) if defined?(ActionMailer::DeliveryJob)
26
+ if defined?(ActionMailer::DeliveryJob)
27
+ ActionMailer::DeliveryJob.send(:include,
28
+ Rollbar::ActiveJob)
29
+ end
21
30
  end
22
31
  end
@@ -15,9 +15,15 @@ module Rollbar
15
15
 
16
16
  # DelayedJob < 4.1 doesn't provide job#error
17
17
  if job.class.method_defined? :error
18
- ::Rollbar.scope(:request => data).error(job.error, :use_exception_level_filters => true) if job.error
18
+ if job.error
19
+ ::Rollbar.scope(:request => data)
20
+ .error(job.error, :use_exception_level_filters => true)
21
+ end
19
22
  elsif job.last_error
20
- ::Rollbar.scope(:request => data).error("Job has failed and won't be retried anymore: " + job.last_error, :use_exception_level_filters => true)
23
+ ::Rollbar.scope(:request => data).error(
24
+ "Job has failed and won't be retried anymore: #{job.last_error}",
25
+ :use_exception_level_filters => true
26
+ )
21
27
  end
22
28
  end
23
29
  end
@@ -56,7 +62,8 @@ module Rollbar
56
62
 
57
63
  data = build_job_data(job)
58
64
 
59
- ::Rollbar.scope(:request => data).error(e, :use_exception_level_filters => true)
65
+ ::Rollbar.scope(:request => data)
66
+ .error(e, :use_exception_level_filters => true)
60
67
  end
61
68
 
62
69
  def self.skip_report?(job)