rollbar 2.16.2 → 2.22.1

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 (212) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +47 -0
  3. data/.travis.yml +182 -94
  4. data/Appraisals +10 -10
  5. data/Gemfile +45 -13
  6. data/README.md +20 -3
  7. data/Rakefile +0 -0
  8. data/data/rollbar.snippet.js +1 -1
  9. data/docs/configuration.md +15 -0
  10. data/gemfiles/rails30.gemfile +21 -14
  11. data/gemfiles/rails31.gemfile +21 -12
  12. data/gemfiles/rails32.gemfile +18 -8
  13. data/gemfiles/rails40.gemfile +18 -6
  14. data/gemfiles/rails41.gemfile +17 -6
  15. data/gemfiles/rails42.gemfile +24 -14
  16. data/gemfiles/rails50.gemfile +20 -11
  17. data/gemfiles/rails51.gemfile +20 -10
  18. data/gemfiles/rails52.gemfile +65 -0
  19. data/gemfiles/rails60.gemfile +67 -0
  20. data/lib/generators/rollbar/rollbar_generator.rb +1 -1
  21. data/lib/rails/rollbar_runner.rb +17 -2
  22. data/lib/rollbar.rb +2 -3
  23. data/lib/rollbar/capistrano.rb +71 -39
  24. data/lib/rollbar/capistrano3.rb +56 -1
  25. data/lib/rollbar/capistrano_tasks.rb +130 -0
  26. data/lib/rollbar/configuration.rb +95 -7
  27. data/lib/rollbar/delay/active_job.rb +17 -0
  28. data/lib/rollbar/delay/girl_friday.rb +2 -2
  29. data/lib/rollbar/delay/resque.rb +4 -6
  30. data/lib/rollbar/delay/shoryuken.rb +15 -9
  31. data/lib/rollbar/delay/sidekiq.rb +6 -8
  32. data/lib/rollbar/delay/sucker_punch.rb +17 -19
  33. data/lib/rollbar/delay/thread.rb +3 -3
  34. data/lib/rollbar/deploy.rb +90 -0
  35. data/lib/rollbar/encoding/encoder.rb +9 -9
  36. data/lib/rollbar/exception_reporter.rb +19 -5
  37. data/lib/rollbar/item.rb +62 -20
  38. data/lib/rollbar/item/backtrace.rb +4 -4
  39. data/lib/rollbar/item/frame.rb +7 -1
  40. data/lib/rollbar/item/locals.rb +56 -0
  41. data/lib/rollbar/json.rb +5 -51
  42. data/lib/rollbar/language_support.rb +4 -20
  43. data/lib/rollbar/lazy_store.rb +5 -5
  44. data/lib/rollbar/logger.rb +1 -0
  45. data/lib/rollbar/logger_proxy.rb +15 -2
  46. data/lib/rollbar/middleware/js.rb +110 -10
  47. data/lib/rollbar/middleware/js/json_value.rb +26 -0
  48. data/lib/rollbar/middleware/rack.rb +4 -1
  49. data/lib/rollbar/middleware/rails/rollbar.rb +10 -1
  50. data/lib/rollbar/notifier.rb +118 -49
  51. data/lib/rollbar/notifier/trace_with_bindings.rb +65 -0
  52. data/lib/rollbar/plugin.rb +54 -6
  53. data/lib/rollbar/plugins.rb +7 -1
  54. data/lib/rollbar/plugins/active_job.rb +5 -1
  55. data/lib/rollbar/plugins/basic_socket.rb +21 -6
  56. data/lib/rollbar/plugins/delayed_job/job_data.rb +3 -3
  57. data/lib/rollbar/plugins/delayed_job/plugin.rb +3 -3
  58. data/lib/rollbar/plugins/goalie.rb +11 -3
  59. data/lib/rollbar/plugins/rails/controller_methods.rb +17 -4
  60. data/lib/rollbar/plugins/rails/railtie_mixin.rb +7 -3
  61. data/lib/rollbar/plugins/rake.rb +2 -2
  62. data/lib/rollbar/plugins/sidekiq/plugin.rb +10 -6
  63. data/lib/rollbar/rake_tasks.rb +3 -86
  64. data/lib/rollbar/request_data_extractor.rb +35 -21
  65. data/lib/rollbar/rollbar_test.rb +147 -0
  66. data/lib/rollbar/scrubbers.rb +7 -3
  67. data/lib/rollbar/scrubbers/params.rb +38 -20
  68. data/lib/rollbar/scrubbers/url.rb +27 -13
  69. data/lib/rollbar/truncation.rb +9 -2
  70. data/lib/rollbar/truncation/min_body_strategy.rb +2 -3
  71. data/lib/rollbar/truncation/remove_any_key_strategy.rb +123 -0
  72. data/lib/rollbar/truncation/remove_extra_strategy.rb +35 -0
  73. data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
  74. data/lib/rollbar/truncation/strings_strategy.rb +3 -4
  75. data/lib/rollbar/util.rb +75 -45
  76. data/lib/rollbar/util/hash.rb +30 -6
  77. data/lib/rollbar/util/ip_anonymizer.rb +8 -7
  78. data/lib/rollbar/util/ip_obfuscator.rb +1 -1
  79. data/lib/rollbar/version.rb +1 -1
  80. data/lib/tasks/benchmark.rake +103 -0
  81. data/rollbar.gemspec +14 -8
  82. metadata +25 -277
  83. data/gemfiles/ruby_1_8_and_1_9_2.gemfile +0 -49
  84. data/lib/rollbar/json/default.rb +0 -11
  85. data/lib/rollbar/json/oj.rb +0 -16
  86. data/lib/rollbar/tasks/rollbar.cap +0 -47
  87. data/spec/cacert.pem +0 -3988
  88. data/spec/controllers/home_controller_spec.rb +0 -480
  89. data/spec/delay/sidekiq_spec.rb +0 -61
  90. data/spec/delay/sucker_punch_spec.rb +0 -25
  91. data/spec/delayed/backend/test.rb +0 -140
  92. data/spec/delayed/serialization/test.rb +0 -0
  93. data/spec/dummyapp/.gitignore +0 -73
  94. data/spec/dummyapp/Rakefile +0 -7
  95. data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
  96. data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
  97. data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
  98. data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
  99. data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
  100. data/spec/dummyapp/app/helpers/.gitkeep +0 -0
  101. data/spec/dummyapp/app/mailers/.gitkeep +0 -0
  102. data/spec/dummyapp/app/models/.gitkeep +0 -0
  103. data/spec/dummyapp/app/models/book.rb +0 -5
  104. data/spec/dummyapp/app/models/post.rb +0 -9
  105. data/spec/dummyapp/app/models/user.rb +0 -9
  106. data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
  107. data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
  108. data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
  109. data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
  110. data/spec/dummyapp/app/views/home/index.html.erb +0 -4
  111. data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
  112. data/spec/dummyapp/app/views/js/test.html.erb +0 -1
  113. data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
  114. data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
  115. data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
  116. data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
  117. data/spec/dummyapp/app/views/users/index.html.erb +0 -8
  118. data/spec/dummyapp/app/views/users/show.html.erb +0 -3
  119. data/spec/dummyapp/config.ru +0 -4
  120. data/spec/dummyapp/config/application.rb +0 -59
  121. data/spec/dummyapp/config/boot.rb +0 -10
  122. data/spec/dummyapp/config/database.yml +0 -25
  123. data/spec/dummyapp/config/environment.rb +0 -5
  124. data/spec/dummyapp/config/environments/development.rb +0 -37
  125. data/spec/dummyapp/config/environments/production.rb +0 -67
  126. data/spec/dummyapp/config/environments/test.rb +0 -37
  127. data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
  128. data/spec/dummyapp/config/initializers/inflections.rb +0 -15
  129. data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
  130. data/spec/dummyapp/config/initializers/rollbar.rb +0 -26
  131. data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
  132. data/spec/dummyapp/config/initializers/session_store.rb +0 -8
  133. data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
  134. data/spec/dummyapp/config/locales/devise.en.yml +0 -58
  135. data/spec/dummyapp/config/locales/en.yml +0 -5
  136. data/spec/dummyapp/config/routes.rb +0 -17
  137. data/spec/dummyapp/config/secrets.yml +0 -2
  138. data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
  139. data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
  140. data/spec/dummyapp/db/migrate/20161219184410_create_books.rb +0 -10
  141. data/spec/dummyapp/db/migrate/20161219185529_add_username_to_users.rb +0 -5
  142. data/spec/dummyapp/db/schema.rb +0 -41
  143. data/spec/dummyapp/db/seeds.rb +0 -12
  144. data/spec/dummyapp/lib/assets/.gitkeep +0 -0
  145. data/spec/dummyapp/public/404.html +0 -26
  146. data/spec/dummyapp/public/422.html +0 -26
  147. data/spec/dummyapp/public/500.html +0 -25
  148. data/spec/dummyapp/public/favicon.ico +0 -0
  149. data/spec/dummyapp/script/rails +0 -6
  150. data/spec/fixtures/file1 +0 -1
  151. data/spec/fixtures/file2 +0 -1
  152. data/spec/fixtures/payloads/message.json +0 -25
  153. data/spec/fixtures/payloads/sample.trace.json +0 -275
  154. data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
  155. data/spec/fixtures/plugins/dummy1.rb +0 -5
  156. data/spec/fixtures/plugins/dummy2.rb +0 -5
  157. data/spec/generators/rollbar/rollbar_generator_rails30_spec.rb +0 -31
  158. data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -51
  159. data/spec/requests/home_spec.rb +0 -49
  160. data/spec/rollbar/configuration_spec.rb +0 -46
  161. data/spec/rollbar/delay/delayed_job_spec.rb +0 -22
  162. data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
  163. data/spec/rollbar/delay/resque_spec.rb +0 -37
  164. data/spec/rollbar/delay/thread_spec.rb +0 -27
  165. data/spec/rollbar/encoding/encoder_spec.rb +0 -63
  166. data/spec/rollbar/item/backtrace_spec.rb +0 -26
  167. data/spec/rollbar/item/frame_spec.rb +0 -267
  168. data/spec/rollbar/item_spec.rb +0 -736
  169. data/spec/rollbar/json/oj_spec.rb +0 -18
  170. data/spec/rollbar/json_spec.rb +0 -110
  171. data/spec/rollbar/lazy_store_spec.rb +0 -99
  172. data/spec/rollbar/logger_proxy_spec.rb +0 -50
  173. data/spec/rollbar/logger_spec.rb +0 -124
  174. data/spec/rollbar/middleware/js_spec.rb +0 -421
  175. data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
  176. data/spec/rollbar/notifier_spec.rb +0 -56
  177. data/spec/rollbar/plugin_spec.rb +0 -209
  178. data/spec/rollbar/plugins/active_job_spec.rb +0 -38
  179. data/spec/rollbar/plugins/delayed_job/job_data_spec.rb +0 -48
  180. data/spec/rollbar/plugins/delayed_job_spec.rb +0 -129
  181. data/spec/rollbar/plugins/rack_spec.rb +0 -152
  182. data/spec/rollbar/plugins/rails_js_spec.rb +0 -19
  183. data/spec/rollbar/plugins/rake_spec.rb +0 -34
  184. data/spec/rollbar/plugins/resque/failure_spec.rb +0 -36
  185. data/spec/rollbar/plugins/sidekiq_spec.rb +0 -171
  186. data/spec/rollbar/plugins/validations_spec.rb +0 -56
  187. data/spec/rollbar/plugins_spec.rb +0 -68
  188. data/spec/rollbar/request_data_extractor_spec.rb +0 -270
  189. data/spec/rollbar/scrubbers/params_spec.rb +0 -314
  190. data/spec/rollbar/scrubbers/url_spec.rb +0 -136
  191. data/spec/rollbar/scrubbers_spec.rb +0 -31
  192. data/spec/rollbar/sidekig/clear_scope_spec.rb +0 -19
  193. data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
  194. data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
  195. data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
  196. data/spec/rollbar/truncation_spec.rb +0 -27
  197. data/spec/rollbar/util/hash_spec.rb +0 -22
  198. data/spec/rollbar/util/ip_anonymizer_spec.rb +0 -30
  199. data/spec/rollbar/util_spec.rb +0 -80
  200. data/spec/rollbar_bc_spec.rb +0 -380
  201. data/spec/rollbar_spec.rb +0 -1667
  202. data/spec/spec_helper.rb +0 -84
  203. data/spec/support/cause_exception.rb +0 -1
  204. data/spec/support/encoding_helpers.rb +0 -8
  205. data/spec/support/encodings/iso_8859_9 +0 -1
  206. data/spec/support/fixture_helpers.rb +0 -10
  207. data/spec/support/get_ip_raising.rb +0 -7
  208. data/spec/support/helpers.rb +0 -5
  209. data/spec/support/matchers.rb +0 -23
  210. data/spec/support/notifier_helpers.rb +0 -57
  211. data/spec/support/rollbar_api.rb +0 -57
  212. data/spec/support/shared_contexts.rb +0 -12
@@ -10,19 +10,17 @@ module Rollbar
10
10
  end
11
11
 
12
12
  def call(payload)
13
- ::Sidekiq::Client.push @options.merge('args' => [payload])
13
+ raise StandardError, 'Unable to push the job to Sidekiq' if ::Sidekiq::Client.push(@options.merge('args' => [payload])).nil?
14
14
  end
15
15
 
16
16
  include ::Sidekiq::Worker
17
17
 
18
18
  def perform(*args)
19
- begin
20
- Rollbar.process_from_async_handler(*args)
21
- rescue
22
- # Raise the exception so Sidekiq can track the errored job
23
- # and retry it
24
- raise
25
- end
19
+ Rollbar.process_from_async_handler(*args)
20
+ rescue StandardError
21
+ # Raise the exception so Sidekiq can track the errored job
22
+ # and retry it
23
+ raise
26
24
  end
27
25
  end
28
26
  end
@@ -16,11 +16,11 @@ module Rollbar
16
16
  def self.setup
17
17
  major_version = ::SuckerPunch::VERSION.split.first.to_i
18
18
 
19
- if major_version > 1
20
- self.perform_proc = proc { |payload| perform_async(payload) }
21
- else
22
- self.perform_proc = proc { |payload| new.async.perform(payload) }
23
- end
19
+ self.perform_proc = if major_version > 1
20
+ proc { |payload| perform_async(payload) }
21
+ else
22
+ proc { |payload| new.async.perform(payload) }
23
+ end
24
24
 
25
25
  self.ready = true
26
26
  end
@@ -32,20 +32,18 @@ module Rollbar
32
32
  end
33
33
 
34
34
  def perform(*args)
35
- begin
36
- Rollbar.process_from_async_handler(*args)
37
- rescue
38
- # SuckerPunch can configure an exception handler with:
39
- #
40
- # SuckerPunch.exception_handler { # do something here }
41
- #
42
- # This is just passed to Celluloid.exception_handler which will
43
- # push the reiceved block to an array of handlers, by default empty, [].
44
- #
45
- # We reraise the exception here casue it's safe and users could have defined
46
- # their own exception handler for SuckerPunch
47
- raise
48
- end
35
+ Rollbar.process_from_async_handler(*args)
36
+ rescue StandardError
37
+ # SuckerPunch can configure an exception handler with:
38
+ #
39
+ # SuckerPunch.exception_handler { # do something here }
40
+ #
41
+ # This is just passed to Celluloid.exception_handler which will
42
+ # push the reiceved block to an array of handlers, by default empty, [].
43
+ #
44
+ # We reraise the exception here casue it's safe and users could have defined
45
+ # their own exception handler for SuckerPunch
46
+ raise
49
47
  end
50
48
  end
51
49
  end
@@ -1,11 +1,10 @@
1
- require 'thread'
2
1
  require 'timeout'
3
2
 
4
3
  module Rollbar
5
4
  module Delay
6
5
  class Thread
7
6
  EXIT_SIGNAL = :exit
8
- EXIT_TIMEOUT = 3
7
+ EXIT_TIMEOUT = 6
9
8
 
10
9
  Error = Class.new(StandardError)
11
10
  TimeoutError = Class.new(Error)
@@ -29,6 +28,7 @@ module Rollbar
29
28
 
30
29
  def spawn_threads_reaper
31
30
  return if @spawned
31
+
32
32
  @spawned = true
33
33
 
34
34
  @reaper ||= build_reaper_thread
@@ -65,7 +65,7 @@ module Rollbar
65
65
  ::Thread.new do
66
66
  begin
67
67
  Rollbar.process_from_async_handler(payload)
68
- rescue
68
+ rescue StandardError
69
69
  # Here we swallow the exception:
70
70
  # 1. The original report wasn't sent.
71
71
  # 2. An internal error was sent and logged
@@ -0,0 +1,90 @@
1
+ module Rollbar
2
+ # Deploy Tracking API wrapper module
3
+ module Deploy
4
+ ENDPOINT = 'https://api.rollbar.com/api/1/deploy/'.freeze
5
+
6
+ def self.report(opts, access_token, environment, revision)
7
+ return {} unless access_token && !access_token.empty?
8
+
9
+ opts[:status] ||= :started
10
+
11
+ uri = ::URI.parse(::Rollbar::Deploy::ENDPOINT)
12
+
13
+ request_data = {
14
+ :access_token => access_token,
15
+ :environment => environment,
16
+ :revision => revision
17
+ }.merge(opts)
18
+ request_data.delete(:proxy)
19
+ request_data.delete(:dry_run)
20
+
21
+ request = ::Net::HTTP::Post.new(uri.request_uri)
22
+ request.body = ::JSON.dump(request_data)
23
+
24
+ send_request(opts, uri, request)
25
+ end
26
+
27
+ def self.update(opts, access_token, deploy_id, status)
28
+ return {} unless access_token && !access_token.empty?
29
+
30
+ uri = ::URI.parse(
31
+ ::Rollbar::Deploy::ENDPOINT +
32
+ deploy_id.to_s +
33
+ '?access_token=' + access_token
34
+ )
35
+
36
+ request = ::Net::HTTP::Patch.new(uri.request_uri)
37
+ request.body = ::JSON.dump(:status => status.to_s, :comment => opts[:comment])
38
+
39
+ send_request(opts, uri, request)
40
+ end
41
+
42
+ class << self
43
+ private
44
+
45
+ def send_request(opts, uri, request)
46
+ ::Net::HTTP.start(uri.host, uri.port, opts[:proxy], :use_ssl => true) do |http|
47
+ build_result(
48
+ uri,
49
+ request,
50
+ opts[:dry_run] ? nil : http.request(request),
51
+ opts[:dry_run]
52
+ )
53
+ end
54
+ end
55
+
56
+ def build_result(uri, request, response = nil, dry_run = false)
57
+ result = {}
58
+ result.merge!(request_result(uri, request))
59
+ result.merge!(response_result(response)) unless response.nil?
60
+ result[:success] = success?(result, dry_run)
61
+ result
62
+ end
63
+
64
+ def success?(result, dry_run = false)
65
+ return true if dry_run
66
+
67
+ result[:response] &&
68
+ result[:response].is_a?(::Net::HTTPSuccess) &&
69
+ result[:response].code == '200' &&
70
+ (result.key?('err') ? result['err'].to_i.zero? : true)
71
+ end
72
+
73
+ def request_result(uri, request)
74
+ {
75
+ :request_info => uri.inspect + ': ' + request.body,
76
+ :request => request
77
+ }
78
+ end
79
+
80
+ def response_result(response)
81
+ {
82
+ :response => response,
83
+ :response_info => response.code + '; ' +
84
+ response.message + '; ' +
85
+ response.body.delete("\n")
86
+ }.merge(::JSON.parse(response.body, :symbolize_names => true))
87
+ end
88
+ end
89
+ end
90
+ end
@@ -1,9 +1,9 @@
1
1
  module Rollbar
2
2
  module Encoding
3
3
  class Encoder
4
- ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT, ::Encoding::US_ASCII]
5
- ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT, ::Encoding::ISO_8859_1]
6
- ENCODING_OPTIONS = { :invalid => :replace, :undef => :replace, :replace => '' }
4
+ ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT, ::Encoding::US_ASCII].freeze
5
+ ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT, ::Encoding::ISO_8859_1].freeze
6
+ ENCODING_OPTIONS = { :invalid => :replace, :undef => :replace, :replace => '' }.freeze
7
7
  UTF8 = 'UTF-8'.freeze
8
8
  BINARY = 'binary'.freeze
9
9
 
@@ -18,11 +18,11 @@ module Rollbar
18
18
  encoding = value.encoding
19
19
 
20
20
  # This will be most of cases so avoid force anything for them
21
- if encoding == ::Encoding::UTF_8 && value.valid_encoding?
22
- encoded_value = value
23
- else
24
- encoded_value = force_encoding(value).encode(*encoding_args(value))
25
- end
21
+ encoded_value = if encoding == ::Encoding::UTF_8 && value.valid_encoding?
22
+ value
23
+ else
24
+ force_encoding(value).encode(*encoding_args(value))
25
+ end
26
26
 
27
27
  object.is_a?(Symbol) ? encoded_value.to_sym : encoded_value
28
28
  end
@@ -45,7 +45,7 @@ module Rollbar
45
45
  # Seems #codepoints is faster than #valid_encoding?
46
46
  value.force_encoding(encoding).encode(::Encoding::UTF_8).codepoints
47
47
  true
48
- rescue
48
+ rescue StandardError
49
49
  false
50
50
  end
51
51
  end
@@ -1,10 +1,11 @@
1
1
  module Rollbar
2
- module ExceptionReporter
2
+ module ExceptionReporter # :nodoc:
3
3
  def report_exception_to_rollbar(env, exception)
4
- exception_message = exception.respond_to?(:message) ? exception.message : 'No Exception Message'
5
- Rollbar.log_debug "[Rollbar] Reporting exception: #{exception_message}"
4
+ return unless capture_uncaught?
5
+
6
+ log_exception_message(exception)
6
7
 
7
- exception_data = Rollbar.log(Rollbar.configuration.uncaught_exception_level, exception, :use_exception_level_filters => true)
8
+ exception_data = exception_data(exception)
8
9
 
9
10
  if exception_data.is_a?(Hash)
10
11
  env['rollbar.exception_uuid'] = exception_data[:uuid]
@@ -14,8 +15,21 @@ module Rollbar
14
15
  elsif exception_data == 'ignored'
15
16
  Rollbar.log_debug '[Rollbar] Exception not reported because it was ignored'
16
17
  end
17
- rescue => e
18
+ rescue StandardError => e
18
19
  Rollbar.log_warning "[Rollbar] Exception while reporting exception to Rollbar: #{e.message}"
19
20
  end
21
+
22
+ def capture_uncaught?
23
+ Rollbar.configuration.capture_uncaught != false
24
+ end
25
+
26
+ def log_exception_message(exception)
27
+ exception_message = exception.respond_to?(:message) ? exception.message : 'No Exception Message'
28
+ Rollbar.log_debug "[Rollbar] Reporting exception: #{exception_message}"
29
+ end
30
+
31
+ def exception_data(exception)
32
+ Rollbar.log(Rollbar.configuration.uncaught_exception_level, exception, :use_exception_level_filters => true)
33
+ end
20
34
  end
21
35
  end
data/lib/rollbar/item.rb CHANGED
@@ -12,6 +12,7 @@ require 'rollbar/util'
12
12
  require 'rollbar/encoding'
13
13
  require 'rollbar/truncation'
14
14
  require 'rollbar/json'
15
+ require 'rollbar/scrubbers/params'
15
16
 
16
17
  module Rollbar
17
18
  # This class represents the payload to be sent to the API.
@@ -26,12 +27,12 @@ module Rollbar
26
27
  attr_reader :message
27
28
  attr_reader :exception
28
29
  attr_reader :extra
29
-
30
+
30
31
  attr_reader :configuration
31
32
  attr_reader :scope
32
33
  attr_reader :logger
33
34
  attr_reader :notifier
34
-
35
+
35
36
  attr_reader :context
36
37
 
37
38
  def_delegators :payload, :[]
@@ -83,7 +84,8 @@ module Rollbar
83
84
  :server => server_data,
84
85
  :notifier => {
85
86
  :name => 'rollbar-gem',
86
- :version => VERSION
87
+ :version => VERSION,
88
+ :configured_options => configured_options
87
89
  },
88
90
  :body => build_body
89
91
  }
@@ -101,29 +103,58 @@ module Rollbar
101
103
  data
102
104
  end
103
105
 
106
+ def configured_options
107
+ if Gem.loaded_specs['activesupport'] && Gem.loaded_specs['activesupport'].version < Gem::Version.new('4.1')
108
+ # There are too many types that crash ActiveSupport JSON serialization, and not worth
109
+ # the risk just to send this diagnostic object. In versions < 4.1, ActiveSupport hooks
110
+ # Ruby's JSON.generate so deeply there's no workaround.
111
+ 'not serialized in ActiveSupport < 4.1'
112
+ elsif configuration.use_async
113
+ # Currently serialization is performed by each handler, and this invariably
114
+ # means it is actually performed by ActiveSupport.
115
+ #
116
+ # TODO: Since serialization must be done prior to scheduling the job,
117
+ # it should at least be done by rollbar-gem itself. Much work has been done
118
+ # to avoid the bugs in ActiveSupport JSON. The async handlers are currently
119
+ # still subject to all those knnown issues.
120
+ 'not serialized for async/delayed handlers'
121
+ else
122
+ scrub(configuration.configured_options.configured)
123
+ end
124
+ end
125
+
104
126
  def dump
105
127
  # Ensure all keys are strings since we can receive the payload inline or
106
128
  # from an async handler job, which can be serialized.
107
129
  stringified_payload = Util::Hash.deep_stringify_keys(payload)
108
- result = Truncation.truncate(stringified_payload)
130
+ attempts = []
131
+ result = Truncation.truncate(stringified_payload, attempts)
109
132
 
110
133
  return result unless Truncation.truncate?(result)
111
134
 
112
- handle_too_large_payload(stringified_payload, result)
135
+ handle_too_large_payload(stringified_payload, result, attempts)
113
136
 
114
137
  nil
115
138
  end
116
139
 
117
- def handle_too_large_payload(stringified_payload, final_payload)
118
- original_size = Rollbar::JSON.dump(stringified_payload).bytesize
119
- final_size = final_payload.bytesize
140
+ def handle_too_large_payload(stringified_payload, final_payload, attempts)
120
141
  uuid = stringified_payload['data']['uuid']
121
142
  host = stringified_payload['data'].fetch('server', {})['host']
122
143
 
123
- notifier.send_failsafe("Could not send payload due to it being too large after truncating attempts. Original size: #{original_size} Final size: #{final_size}", nil, uuid, host)
144
+ notifier.send_failsafe(
145
+ too_large_payload_string(attempts),
146
+ nil,
147
+ uuid,
148
+ host
149
+ )
124
150
  logger.error("[Rollbar] Payload too large to be sent for UUID #{uuid}: #{Rollbar::JSON.dump(payload)}")
125
151
  end
126
152
 
153
+ def too_large_payload_string(attempts)
154
+ 'Could not send payload due to it being too large after truncating attempts. ' \
155
+ "Original size: #{attempts.first} Attempts: #{attempts.join(', ')} Final size: #{attempts.last}"
156
+ end
157
+
127
158
  def ignored?
128
159
  data = payload['data']
129
160
 
@@ -156,26 +187,37 @@ module Rollbar
156
187
  end
157
188
 
158
189
  def build_extra
159
- if custom_data_method?
160
- Util.deep_merge(custom_data, extra || {})
190
+ if custom_data_method? && !Rollbar::Util.method_in_stack(:custom_data, __FILE__)
191
+ Util.deep_merge(scrub(custom_data), scrub(extra) || {})
161
192
  else
162
- extra
193
+ scrub(extra)
163
194
  end
164
195
  end
165
196
 
197
+ def scrub(data)
198
+ return data unless data.is_a? Hash
199
+
200
+ options = {
201
+ :params => data,
202
+ :config => Rollbar.configuration.scrub_fields,
203
+ :whitelist => Rollbar.configuration.scrub_whitelist
204
+ }
205
+ Rollbar::Scrubbers::Params.call(options)
206
+ end
207
+
166
208
  def custom_data_method?
167
209
  !!configuration.custom_data_method
168
210
  end
169
211
 
170
212
  def custom_data
171
- if configuration.custom_data_method.arity == 3
172
- data = configuration.custom_data_method.call(message, exception, context)
173
- else
174
- data = configuration.custom_data_method.call
175
- end
176
-
213
+ data = if configuration.custom_data_method.arity == 3
214
+ configuration.custom_data_method.call(message, exception, context)
215
+ else
216
+ configuration.custom_data_method.call
217
+ end
218
+
177
219
  Rollbar::Util.deep_copy(data)
178
- rescue => e
220
+ rescue StandardError => e
179
221
  return {} if configuration.safely?
180
222
 
181
223
  report_custom_data_error(e)
@@ -220,7 +262,7 @@ module Rollbar
220
262
  handlers.each do |handler|
221
263
  begin
222
264
  handler.call(transform_options)
223
- rescue => e
265
+ rescue StandardError => e
224
266
  logger.error("[Rollbar] Error calling the `transform` hook: #{e}")
225
267
 
226
268
  break
@@ -32,7 +32,7 @@ module Rollbar
32
32
  end
33
33
  end
34
34
 
35
- alias_method :build, :to_h
35
+ alias build to_h
36
36
 
37
37
  def get_file_lines(filename)
38
38
  files[filename] ||= read_file(filename)
@@ -44,7 +44,7 @@ module Rollbar
44
44
  return unless File.exist?(filename)
45
45
 
46
46
  File.read(filename).split("\n")
47
- rescue
47
+ rescue StandardError
48
48
  nil
49
49
  end
50
50
 
@@ -74,10 +74,10 @@ module Rollbar
74
74
  end
75
75
 
76
76
  def map_frames(current_exception)
77
- exception_backtrace(current_exception).reverse.map do |frame|
77
+ exception_backtrace(current_exception).map do |frame|
78
78
  Rollbar::Item::Frame.new(self, frame,
79
79
  :configuration => configuration).to_h
80
- end
80
+ end.reverse
81
81
  end
82
82
 
83
83
  # Returns the backtrace to be sent to our API. There are 3 options: