rollbar 2.26.0 → 3.4.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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/pull_request_template.md +34 -0
  3. data/.github/workflows/ci.yml +104 -0
  4. data/.rubocop.yml +52 -36
  5. data/Gemfile +25 -29
  6. data/README.md +32 -8
  7. data/data/rollbar.snippet.js +1 -1
  8. data/docs/configuration.md +7 -0
  9. data/gemfiles/rails30.gemfile +17 -35
  10. data/gemfiles/rails31.gemfile +20 -37
  11. data/gemfiles/rails32.gemfile +13 -31
  12. data/gemfiles/rails40.gemfile +12 -32
  13. data/gemfiles/rails41.gemfile +11 -31
  14. data/gemfiles/rails42.gemfile +11 -35
  15. data/gemfiles/rails50.gemfile +14 -32
  16. data/gemfiles/rails51.gemfile +13 -31
  17. data/gemfiles/rails52.gemfile +10 -19
  18. data/gemfiles/rails60.gemfile +10 -25
  19. data/gemfiles/rails61.gemfile +52 -0
  20. data/gemfiles/rails70.gemfile +52 -0
  21. data/lib/generators/rollbar/rollbar_generator.rb +18 -14
  22. data/lib/rails/rollbar_runner.rb +8 -19
  23. data/lib/rollbar/capistrano.rb +17 -9
  24. data/lib/rollbar/capistrano3.rb +8 -2
  25. data/lib/rollbar/capistrano_tasks.rb +44 -8
  26. data/lib/rollbar/configuration.rb +122 -88
  27. data/lib/rollbar/delay/shoryuken.rb +4 -3
  28. data/lib/rollbar/delay/sidekiq.rb +3 -1
  29. data/lib/rollbar/delay/sucker_punch.rb +1 -2
  30. data/lib/rollbar/delay/thread.rb +3 -2
  31. data/lib/rollbar/deploy.rb +6 -7
  32. data/lib/rollbar/encoding/encoder.rb +7 -3
  33. data/lib/rollbar/encoding.rb +2 -7
  34. data/lib/rollbar/exception_reporter.rb +17 -8
  35. data/lib/rollbar/item/backtrace.rb +10 -8
  36. data/lib/rollbar/item/frame.rb +6 -5
  37. data/lib/rollbar/item/locals.rb +5 -2
  38. data/lib/rollbar/item.rb +60 -38
  39. data/lib/rollbar/json.rb +1 -1
  40. data/lib/rollbar/language_support.rb +0 -6
  41. data/lib/rollbar/lazy_store.rb +3 -7
  42. data/lib/rollbar/logger.rb +2 -0
  43. data/lib/rollbar/logger_proxy.rb +3 -1
  44. data/lib/rollbar/middleware/js/json_value.rb +15 -5
  45. data/lib/rollbar/middleware/js.rb +59 -37
  46. data/lib/rollbar/middleware/rack/builder.rb +3 -3
  47. data/lib/rollbar/middleware/rack/test_session.rb +3 -3
  48. data/lib/rollbar/middleware/rack.rb +4 -4
  49. data/lib/rollbar/middleware/rails/rollbar.rb +9 -6
  50. data/lib/rollbar/middleware/rails/show_exceptions.rb +8 -4
  51. data/lib/rollbar/notifier/trace_with_bindings.rb +13 -3
  52. data/lib/rollbar/notifier.rb +180 -136
  53. data/lib/rollbar/plugin.rb +8 -8
  54. data/lib/rollbar/plugins/active_job.rb +15 -2
  55. data/lib/rollbar/plugins/delayed_job/plugin.rb +14 -3
  56. data/lib/rollbar/plugins/goalie.rb +27 -16
  57. data/lib/rollbar/plugins/rails/controller_methods.rb +18 -14
  58. data/lib/rollbar/plugins/rails/railtie30.rb +2 -1
  59. data/lib/rollbar/plugins/rails/railtie32.rb +2 -1
  60. data/lib/rollbar/plugins/rails/railtie_mixin.rb +2 -2
  61. data/lib/rollbar/plugins/rails.rb +5 -2
  62. data/lib/rollbar/plugins/rake.rb +2 -1
  63. data/lib/rollbar/plugins/sidekiq/plugin.rb +39 -21
  64. data/lib/rollbar/plugins/sidekiq.rb +1 -1
  65. data/lib/rollbar/plugins/thread.rb +8 -7
  66. data/lib/rollbar/plugins/validations.rb +3 -1
  67. data/lib/rollbar/rake_tasks.rb +1 -2
  68. data/lib/rollbar/request_data_extractor.rb +48 -19
  69. data/lib/rollbar/rollbar_test.rb +9 -118
  70. data/lib/rollbar/scrubbers/params.rb +13 -7
  71. data/lib/rollbar/scrubbers/url.rb +56 -17
  72. data/lib/rollbar/scrubbers.rb +1 -1
  73. data/lib/rollbar/truncation/remove_any_key_strategy.rb +4 -1
  74. data/lib/rollbar/truncation/remove_extra_strategy.rb +3 -1
  75. data/lib/rollbar/util/hash.rb +14 -7
  76. data/lib/rollbar/util/ip_anonymizer.rb +1 -1
  77. data/lib/rollbar/util.rb +19 -13
  78. data/lib/rollbar/version.rb +1 -1
  79. data/lib/rollbar.rb +12 -7
  80. data/lib/tasks/benchmark.rake +2 -1
  81. data/rollbar.gemspec +5 -3
  82. metadata +17 -12
  83. data/.travis.yml +0 -284
  84. data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
  85. /data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +0 -0
@@ -11,29 +11,40 @@ Rollbar.plugins.define('goalie') do
11
11
  begin
12
12
  controller = env['action_controller.instance']
13
13
  request_data = begin
14
- controller.rollbar_request_data
15
- rescue StandardError
16
- nil
17
- end
14
+ controller.rollbar_request_data
15
+ rescue StandardError
16
+ nil
17
+ end
18
18
  person_data = begin
19
- controller.rollbar_person_data
20
- rescue StandardError
21
- nil
22
- end
23
- exception_data = Rollbar.scope(:request => request_data, :person => person_data).error(exception, :use_exception_level_filters => true)
19
+ controller.rollbar_person_data
20
+ rescue StandardError
21
+ nil
22
+ end
23
+ exception_data = Rollbar.scope(
24
+ :request => request_data,
25
+ :person => person_data
26
+ ).error(exception, :use_exception_level_filters => true)
24
27
  rescue StandardError => e
25
- Rollbar.log_warning "[Rollbar] Exception while reporting exception to Rollbar: #{e}"
28
+ message = "[Rollbar] Exception while reporting exception to Rollbar: #{e}"
29
+ Rollbar.log_warning(message)
26
30
  end
27
31
 
28
32
  # if an exception was reported, save uuid in the env
29
33
  # so it can be displayed to the user on the error page
30
- if exception_data.is_a?(Hash)
34
+ case exception_data
35
+ when Hash
31
36
  env['rollbar.exception_uuid'] = exception_data[:uuid]
32
- Rollbar.log_info "[Rollbar] Exception uuid saved in env: #{exception_data[:uuid]}"
33
- elsif exception_data == 'disabled'
34
- Rollbar.log_info '[Rollbar] Exception not reported because Rollbar is disabled'
35
- elsif exception_data == 'ignored'
36
- Rollbar.log_info '[Rollbar] Exception not reported because it was ignored'
37
+ Rollbar.log_info(
38
+ "[Rollbar] Exception uuid saved in env: #{exception_data[:uuid]}"
39
+ )
40
+ when 'disabled'
41
+ Rollbar.log_info(
42
+ '[Rollbar] Exception not reported because Rollbar is disabled'
43
+ )
44
+ when 'ignored'
45
+ Rollbar.log_info(
46
+ '[Rollbar] Exception not reported because it was ignored'
47
+ )
37
48
  end
38
49
 
39
50
  # now continue as normal
@@ -7,30 +7,34 @@ module Rollbar
7
7
  include RequestDataExtractor
8
8
 
9
9
  def rollbar_person_data
10
- (user = send(Rollbar.configuration.person_method)) unless Rollbar::Util.method_in_stack_twice(:rollbar_person_data, __FILE__)
10
+ user = nil
11
+ unless Rollbar::Util.method_in_stack_twice(:rollbar_person_data, __FILE__)
12
+ user = send(Rollbar.configuration.person_method)
13
+ end
14
+
11
15
  # include id, username, email if non-empty
12
16
  if user
13
17
  {
14
18
  :id => (begin
15
- user.send(Rollbar.configuration.person_id_method)
16
- rescue StandardError
17
- nil
18
- end),
19
+ user.send(Rollbar.configuration.person_id_method)
20
+ rescue StandardError
21
+ nil
22
+ end),
19
23
  :username => (begin
20
- user.send(Rollbar.configuration.person_username_method)
21
- rescue StandardError
22
- nil
23
- end),
24
+ user.send(Rollbar.configuration.person_username_method)
25
+ rescue StandardError
26
+ nil
27
+ end),
24
28
  :email => (begin
25
- user.send(Rollbar.configuration.person_email_method)
26
- rescue StandardError
27
- nil
28
- end)
29
+ user.send(Rollbar.configuration.person_email_method)
30
+ rescue StandardError
31
+ nil
32
+ end)
29
33
  }
30
34
  else
31
35
  {}
32
36
  end
33
- rescue NoMethodError, NameError
37
+ rescue NameError
34
38
  {}
35
39
  end
36
40
 
@@ -11,7 +11,8 @@ module Rollbar
11
11
 
12
12
  app.config.middleware.insert_after ActionDispatch::ShowExceptions,
13
13
  Rollbar::Middleware::Rails::RollbarMiddleware
14
- ActionDispatch::ShowExceptions.send(:include, Rollbar::Middleware::Rails::ShowExceptions)
14
+ ActionDispatch::ShowExceptions.send(:include,
15
+ Rollbar::Middleware::Rails::ShowExceptions)
15
16
  end
16
17
  end
17
18
  end
@@ -11,7 +11,8 @@ module Rollbar
11
11
 
12
12
  app.config.middleware.insert_after ActionDispatch::DebugExceptions,
13
13
  Rollbar::Middleware::Rails::RollbarMiddleware
14
- ActionDispatch::DebugExceptions.send(:include, Rollbar::Middleware::Rails::ShowExceptions)
14
+ ActionDispatch::DebugExceptions.send(:include,
15
+ Rollbar::Middleware::Rails::ShowExceptions)
15
16
  end
16
17
  end
17
18
  end
@@ -16,9 +16,9 @@ module Rollbar
16
16
  config.framework = "Rails: #{::Rails::VERSION::STRING}"
17
17
  config.filepath ||= begin
18
18
  if ::Rails.application.class.respond_to?(:module_parent_name)
19
- ::Rails.application.class.module_parent_name + '.rollbar'
19
+ "#{::Rails.application.class.module_parent_name}.rollbar"
20
20
  else
21
- ::Rails.application.class.parent_name + '.rollbar'
21
+ "#{::Rails.application.class.parent_name}.rollbar"
22
22
  end
23
23
  end
24
24
  end
@@ -39,7 +39,8 @@ Rollbar.plugins.define('rails-rollbar.js') do
39
39
  end
40
40
 
41
41
  def after_secure_headers(&block)
42
- Rollbar::Railtie.initializer('rollbar.js.frameworks.rails', :after => 'secure_headers.middleware', &block)
42
+ Rollbar::Railtie.initializer('rollbar.js.frameworks.rails',
43
+ :after => 'secure_headers.middleware', &block)
43
44
  end
44
45
 
45
46
  def plugin_execute_proc_body(plugin)
@@ -52,7 +53,8 @@ Rollbar.plugins.define('rails-rollbar.js') do
52
53
  :options => Rollbar.configuration.js_options,
53
54
  :enabled => Rollbar.configuration.js_enabled
54
55
  }
55
- ::Rails.configuration.middleware.use(::Rollbar::Middleware::Js, config)
56
+ ::Rails.configuration.middleware.use(::Rollbar::Middleware::Js,
57
+ config)
56
58
  end
57
59
  end
58
60
  end
@@ -62,6 +64,7 @@ Rollbar.plugins.define('rails-rollbar.js') do
62
64
  begin
63
65
  require 'secure_headers'
64
66
  rescue LoadError
67
+ # Skip loading
65
68
  end
66
69
 
67
70
  defined?(::SecureHeaders::Middleware)
@@ -40,7 +40,8 @@ Rollbar.plugins.define('rake') do
40
40
  end
41
41
 
42
42
  def self.skip_patch
43
- warn('[Rollbar] Rollbar is disabled for Rake tasks since your Rake version is under 0.9.x. Please upgrade to 0.9.x or higher.')
43
+ warn('[Rollbar] Rollbar is disabled for Rake tasks since your Rake ' \
44
+ 'version is under 0.9.x. Please upgrade to 0.9.x or higher.')
44
45
  end
45
46
 
46
47
  def self.patch?
@@ -4,21 +4,39 @@ module Rollbar
4
4
  class Sidekiq
5
5
  PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class].freeze
6
6
 
7
- class ClearScope
8
- def call(_worker, _msg, _queue)
9
- Rollbar.reset_notifier!
7
+ class ResetScope
8
+ def call(_worker, msg, _queue, &block)
9
+ Rollbar.reset_notifier! # clears scope
10
10
 
11
- yield
11
+ return yield unless Rollbar.configuration.sidekiq_use_scoped_block
12
+
13
+ Rollbar.scoped(Rollbar::Sidekiq.job_scope(msg), &block)
12
14
  end
13
15
  end
14
16
 
15
- def self.handle_exception(ctx_hash, e)
16
- job_hash = ctx_hash && (ctx_hash[:job] || ctx_hash)
17
- return if skip_report?(job_hash, e)
17
+ def self.handle_exception(msg, e)
18
+ return if skip_report?(msg, e)
19
+
20
+ Rollbar.scope(job_scope(msg)).error(e, :use_exception_level_filters => true)
21
+ end
22
+
23
+ def self.skip_report?(msg, _e)
24
+ job_hash = job_hash_from_msg(msg)
25
+
26
+ return false if job_hash.nil?
27
+
28
+ # when rollbar middleware catches, sidekiq's retry_job processor hasn't set
29
+ # the retry_count for the current job yet, so adding 1 gives the actual retry count
30
+ actual_retry_count = job_hash.fetch('retry_count', -1) + 1
31
+ job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
32
+ end
18
33
 
34
+ def self.job_scope(msg)
19
35
  scope = {
20
36
  :framework => "Sidekiq: #{::Sidekiq::VERSION}"
21
37
  }
38
+ job_hash = job_hash_from_msg(msg)
39
+
22
40
  unless job_hash.nil?
23
41
  params = job_hash.reject { |k| PARAM_BLACKLIST.include?(k) }
24
42
  scope[:request] = { :params => scrub_params(params) }
@@ -26,34 +44,34 @@ module Rollbar
26
44
  scope[:queue] = params['queue']
27
45
  end
28
46
 
29
- Rollbar.scope(scope).error(e, :use_exception_level_filters => true)
47
+ scope
30
48
  end
31
49
 
32
50
  def self.scrub_params(params)
33
51
  options = {
34
52
  :params => params,
35
- :config => Rollbar.configuration.scrub_fields
53
+ :config => Rollbar.configuration.scrub_fields,
54
+ :whitelist => Rollbar.configuration.scrub_whitelist
36
55
  }
37
56
 
38
57
  Rollbar::Scrubbers::Params.call(options)
39
58
  end
40
59
 
41
- def self.skip_report?(job_hash, _e)
42
- return false if job_hash.nil?
60
+ # see https://github.com/mperham/sidekiq/wiki/Middleware#server-middleware
61
+ def call(_worker, msg, _queue, &block)
62
+ Rollbar.reset_notifier! # clears scope
43
63
 
44
- # when rollbar middleware catches, sidekiq's retry_job processor hasn't set
45
- # the retry_count for the current job yet, so adding 1 gives the actual retry count
46
- actual_retry_count = job_hash.fetch('retry_count', -1) + 1
47
- job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
48
- end
49
-
50
- def call(_worker, msg, _queue)
51
- Rollbar.reset_notifier!
64
+ return yield unless Rollbar.configuration.sidekiq_use_scoped_block
52
65
 
53
- yield
54
- rescue Exception => e
66
+ Rollbar.scoped(Rollbar::Sidekiq.job_scope(msg), &block)
67
+ rescue Exception => e # rubocop:disable Lint/RescueException
55
68
  Rollbar::Sidekiq.handle_exception(msg, e)
56
69
  raise
57
70
  end
71
+
72
+ def self.job_hash_from_msg(msg)
73
+ msg && (msg[:job] || msg)
74
+ end
75
+ private_class_method :job_hash_from_msg
58
76
  end
59
77
  end
@@ -9,7 +9,7 @@ Rollbar.plugins.define('sidekiq >= 3') do
9
9
 
10
10
  Sidekiq.configure_server do |config|
11
11
  config.server_middleware do |chain|
12
- chain.add Rollbar::Sidekiq::ClearScope
12
+ chain.add Rollbar::Sidekiq::ResetScope
13
13
  end
14
14
 
15
15
  config.error_handlers << proc do |e, context|
@@ -1,13 +1,14 @@
1
1
  Rollbar.plugins.define('thread') do
2
- execute do
3
- Thread.class_eval do
4
- def initialize_with_rollbar(*args, &block)
2
+ module Rollbar
3
+ module ThreadPlugin
4
+ def initialize(*args)
5
5
  self[:_rollbar_notifier] ||= Rollbar.notifier.scope
6
- initialize_without_rollbar(*args, &block)
6
+ super
7
7
  end
8
-
9
- alias_method :initialize_without_rollbar, :initialize
10
- alias_method :initialize, :initialize_with_rollbar
11
8
  end
12
9
  end
10
+
11
+ execute do
12
+ Thread.send(:prepend, Rollbar::ThreadPlugin)
13
+ end
13
14
  end
@@ -17,7 +17,9 @@ Rollbar.plugins.define('active_model') do
17
17
  module ActiveRecordExtension
18
18
  def report_validation_errors_to_rollbar
19
19
  errors.full_messages.each do |error|
20
- Rollbar.log_info "[Rollbar] Reporting form validation error: #{error} for #{self}"
20
+ Rollbar.log_info(
21
+ "[Rollbar] Reporting form validation error: #{error} for #{self}"
22
+ )
21
23
  Rollbar.warning("Form Validation Error: #{error} for #{self}")
22
24
  end
23
25
  end
@@ -1,6 +1,5 @@
1
-
2
1
  namespace :rollbar do
3
- desc 'Verify your gem installation by sending a test exception to Rollbar'
2
+ desc 'Verify your gem installation by sending a test message to Rollbar'
4
3
  task :test => [:environment] do
5
4
  rollbar_dir = Gem.loaded_specs['rollbar'].full_gem_path
6
5
  require "#{rollbar_dir}/lib/rollbar/rollbar_test"
@@ -19,10 +19,10 @@ module Rollbar
19
19
  else
20
20
  controller = env['action_controller.instance']
21
21
  person_data = begin
22
- controller.rollbar_person_data
23
- rescue StandardError
24
- {}
25
- end
22
+ controller.rollbar_person_data
23
+ rescue StandardError
24
+ {}
25
+ end
26
26
  end
27
27
 
28
28
  person_data
@@ -34,7 +34,8 @@ module Rollbar
34
34
 
35
35
  get_params = scrub_params(rollbar_get_params(rack_req), sensitive_params)
36
36
  post_params = scrub_params(rollbar_post_params(rack_req), sensitive_params)
37
- raw_body_params = scrub_params(mergeable_raw_body_params(rack_req), sensitive_params)
37
+ raw_body_params = scrub_params(mergeable_raw_body_params(rack_req),
38
+ sensitive_params)
38
39
  cookies = scrub_params(rollbar_request_cookies(rack_req), sensitive_params)
39
40
  session = scrub_params(rollbar_request_session(env), sensitive_params)
40
41
  route_params = scrub_params(rollbar_route_params(env), sensitive_params)
@@ -54,7 +55,10 @@ module Rollbar
54
55
  :method => rollbar_request_method(env)
55
56
  }
56
57
 
57
- data[:request_id] = env['action_dispatch.request_id'] if env['action_dispatch.request_id']
58
+ if env['action_dispatch.request_id']
59
+ data[:request_id] =
60
+ env['action_dispatch.request_id']
61
+ end
58
62
 
59
63
  data
60
64
  end
@@ -87,9 +91,10 @@ module Rollbar
87
91
  def mergeable_raw_body_params(rack_req)
88
92
  raw_body_params = rollbar_raw_body_params(rack_req)
89
93
 
90
- if raw_body_params.is_a?(Hash)
94
+ case raw_body_params
95
+ when Hash
91
96
  raw_body_params
92
- elsif raw_body_params.is_a?(Array)
97
+ when Array
93
98
  { 'body.multi' => raw_body_params }
94
99
  else
95
100
  { 'body.value' => raw_body_params }
@@ -109,13 +114,17 @@ module Rollbar
109
114
  { name => Rollbar::Scrubbers.scrub_value(env[header]) }
110
115
  elsif name == 'X-Forwarded-For' && !Rollbar.configuration.collect_user_ip
111
116
  {}
112
- elsif name == 'X-Forwarded-For' && Rollbar.configuration.collect_user_ip && Rollbar.configuration.anonymize_user_ip
117
+ elsif name == 'X-Forwarded-For' &&
118
+ Rollbar.configuration.collect_user_ip &&
119
+ Rollbar.configuration.anonymize_user_ip
113
120
  ips = env[header].sub(' ', '').split(',')
114
121
  ips = ips.map { |ip| Rollbar::Util::IPAnonymizer.anonymize_ip(ip) }
115
122
  { name => ips.join(', ') }
116
123
  elsif name == 'X-Real-Ip' && !Rollbar.configuration.collect_user_ip
117
124
  {}
118
- elsif name == 'X-Real-Ip' && Rollbar.configuration.collect_user_ip && Rollbar.configuration.anonymize_user_ip
125
+ elsif name == 'X-Real-Ip' &&
126
+ Rollbar.configuration.collect_user_ip &&
127
+ Rollbar.configuration.anonymize_user_ip
119
128
  { name => Rollbar::Util::IPAnonymizer.anonymize_ip(env[header]) }
120
129
  else
121
130
  { name => env[header] }
@@ -131,15 +140,15 @@ module Rollbar
131
140
  host = host.split(',').first.strip unless host.empty?
132
141
 
133
142
  path = env['ORIGINAL_FULLPATH'] || env['REQUEST_URI']
134
- unless path.nil? || path.empty?
135
- path = '/' + path.to_s if path.to_s.slice(0, 1) != '/'
136
- end
143
+ query = env['QUERY_STRING'].to_s.empty? ? nil : "?#{env['QUERY_STRING']}"
144
+ path ||= "#{env['SCRIPT_NAME']}#{env['PATH_INFO']}#{query}"
145
+ path = "/#{path}" if !(path.nil? || path.empty?) && (path.to_s.slice(0, 1) != '/')
137
146
 
138
147
  port = env['HTTP_X_FORWARDED_PORT']
139
148
  if port && !(!scheme.nil? && scheme.casecmp('http').zero? && port.to_i == 80) && \
140
149
  !(!scheme.nil? && scheme.casecmp('https').zero? && port.to_i == 443) && \
141
150
  !(host.include? ':')
142
- host = host + ':' + port
151
+ host = "#{host}:#{port}"
143
152
  end
144
153
 
145
154
  [scheme, '://', host, path].join
@@ -148,7 +157,11 @@ module Rollbar
148
157
  def rollbar_user_ip(env)
149
158
  return nil unless Rollbar.configuration.collect_user_ip
150
159
 
151
- user_ip_string = (env['action_dispatch.remote_ip'] || env['HTTP_X_REAL_IP'] || x_forwarded_for_client(env['HTTP_X_FORWARDED_FOR']) || env['REMOTE_ADDR']).to_s
160
+ user_ip_string = (user_ip_at_configured_key(env) ||
161
+ env['action_dispatch.remote_ip'] ||
162
+ env['HTTP_X_REAL_IP'] ||
163
+ x_forwarded_for_client(env['HTTP_X_FORWARDED_FOR']) ||
164
+ env['REMOTE_ADDR']).to_s
152
165
 
153
166
  user_ip_string = Rollbar::Util::IPAnonymizer.anonymize_ip(user_ip_string)
154
167
 
@@ -157,6 +170,12 @@ module Rollbar
157
170
  nil
158
171
  end
159
172
 
173
+ def user_ip_at_configured_key(env)
174
+ return nil unless Rollbar.configuration.user_ip_rack_env_key
175
+
176
+ env[Rollbar.configuration.user_ip_rack_env_key]
177
+ end
178
+
160
179
  def x_forwarded_for_client(header_value)
161
180
  return nil unless header_value
162
181
 
@@ -195,7 +214,7 @@ module Rollbar
195
214
  return {} unless correct_method
196
215
  return {} unless json_request?(rack_req)
197
216
 
198
- raw_body = rack_req.body.read
217
+ raw_body = read_raw_body(rack_req.body)
199
218
  begin
200
219
  Rollbar::JSON.load(raw_body)
201
220
  rescue StandardError
@@ -203,8 +222,15 @@ module Rollbar
203
222
  end
204
223
  rescue StandardError
205
224
  {}
206
- ensure
207
- rack_req.body.rewind
225
+ end
226
+
227
+ def read_raw_body(body)
228
+ return {} unless body.respond_to?(:rewind)
229
+
230
+ body.rewind
231
+ raw_body = body.read
232
+ body.rewind
233
+ raw_body
208
234
  end
209
235
 
210
236
  def json_request?(rack_req)
@@ -247,7 +273,10 @@ module Rollbar
247
273
  end
248
274
 
249
275
  def sensitive_headers_list
250
- return [] unless Rollbar.configuration.scrub_headers && Rollbar.configuration.scrub_headers.is_a?(Array)
276
+ unless Rollbar.configuration.scrub_headers &&
277
+ Rollbar.configuration.scrub_headers.is_a?(Array)
278
+ return []
279
+ end
251
280
 
252
281
  # Normalize into the expected matching format
253
282
  Rollbar.configuration.scrub_headers.map do |header|
@@ -1,48 +1,16 @@
1
1
  require 'rollbar'
2
- begin
3
- require 'rack/mock'
4
- rescue LoadError
5
- puts 'Cannot load rack/mock'
6
- end
7
- require 'logger'
8
2
 
9
- # Module to inject into the Rails controllers or rack apps
10
3
  module RollbarTest # :nodoc:
11
- def test_rollbar
12
- puts 'Raising RollbarTestingException to simulate app failure.'
13
-
14
- raise RollbarTestingException.new, ::RollbarTest.success_message
15
- end
16
-
17
4
  def self.run
18
5
  return unless confirmed_token?
19
6
 
20
- configure_rails if defined?(Rails)
21
-
22
- puts 'Testing manual report...'
23
- Rollbar.error('Test error from rollbar:test')
24
-
25
- return unless defined?(Rack::MockRequest)
26
-
27
- protocol, app = setup_app
28
-
29
- puts 'Processing...'
30
- env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify", 'REMOTE_ADDR' => '127.0.0.1')
31
- status, = app.call(env)
32
-
33
- puts error_message unless status.to_i == 500
34
- end
35
-
36
- def self.configure_rails
37
- Rails.logger = if defined?(ActiveSupport::TaggedLogging)
38
- ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
39
- else
40
- Logger.new(STDOUT)
41
- end
7
+ puts 'Test sending to Rollbar...'
8
+ result = Rollbar.info('Test message from rollbar:test')
42
9
 
43
- Rails.logger.level = Logger::DEBUG
44
- Rollbar.preconfigure do |config|
45
- config.logger = Rails.logger
10
+ if result == 'error'
11
+ puts error_message
12
+ else
13
+ puts success_message
46
14
  end
47
15
  end
48
16
 
@@ -54,94 +22,17 @@ module RollbarTest # :nodoc:
54
22
  false
55
23
  end
56
24
 
57
- def self.authlogic_config
58
- # from http://stackoverflow.com/questions/5270835/authlogic-activation-problems
59
- return unless defined?(Authlogic)
60
-
61
- Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
62
- end
63
-
64
- def self.setup_app
65
- puts 'Setting up the test app.'
66
-
67
- if defined?(Rails)
68
- app = rails_app
69
-
70
- draw_rails_route(app)
71
-
72
- authlogic_config
73
-
74
- [rails_protocol(app), app]
75
- else
76
- ['http', rack_app]
77
- end
78
- end
79
-
80
- def self.rails_app
81
- # The setup below is needed for Rails 5.x, but not for Rails 4.x and below.
82
- # (And fails on Rails 4.x in various ways depending on the exact version.)
83
- return Rails.application if Rails.version < '5.0.0'
84
-
85
- # Spring now runs by default in development on all new Rails installs. This causes
86
- # the new `/verify` route to not get picked up if `config.cache_classes == false`
87
- # which is also a default in development env.
88
- #
89
- # `config.cache_classes` needs to be set, but the only possible time is at app load,
90
- # so here we clone the default app with an updated config.
91
- #
92
- config = Rails.application.config
93
- config.cache_classes = true
94
-
95
- # Make a copy of the app, so the config can be updated.
96
- Rails.application.class.name.constantize.new(:config => config)
97
- end
98
-
99
- def self.draw_rails_route(app)
100
- app.routes_reloader.execute_if_updated
101
- app.routes.draw do
102
- get 'verify' => 'rollbar_test#verify', :as => 'verify'
103
- end
104
- end
105
-
106
- def self.rails_protocol(app)
107
- defined?(app.config.force_ssl && app.config.force_ssl) ? 'https' : 'http'
108
- end
109
-
110
- def self.rack_app
111
- Class.new do
112
- include RollbarTest
113
-
114
- def self.call(_env)
115
- new.test_rollbar
116
- end
117
- end
118
- end
119
-
120
25
  def self.token_error_message
121
26
  'Rollbar needs an access token configured. Check the README for instructions.'
122
27
  end
123
28
 
124
29
  def self.error_message
125
- 'Test failed! You may have a configuration issue, or you could be using a gem that\'s blocking the test. Contact support@rollbar.com if you need help troubleshooting.'
30
+ 'Test failed! You may have a configuration issue, or you could be using a ' \
31
+ 'gem that\'s blocking the test. Contact support@rollbar.com if you need ' \
32
+ 'help troubleshooting.'
126
33
  end
127
34
 
128
35
  def self.success_message
129
36
  'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
130
37
  end
131
38
  end
132
-
133
- class RollbarTestingException < RuntimeError; end
134
-
135
- if defined?(Rails)
136
- class RollbarTestController < ActionController::Base # :nodoc:
137
- include RollbarTest
138
-
139
- def verify
140
- test_rollbar
141
- end
142
-
143
- def logger
144
- nil
145
- end
146
- end
147
- end