rollbar 2.16.2 → 2.22.1

Sign up to get free protection for your applications and to get access to all the features.
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: