rollbar 2.19.1 → 2.27.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.
- checksums.yaml +5 -5
- data/.github/pull_request_template.md +25 -0
- data/.rubocop.yml +168 -0
- data/.travis.yml +63 -34
- data/Appraisals +10 -10
- data/Gemfile +35 -14
- data/README.md +5 -2
- data/Rakefile +0 -0
- data/data/rollbar.snippet.js +1 -1
- data/docs/configuration.md +17 -0
- data/gemfiles/rails30.gemfile +10 -10
- data/gemfiles/rails31.gemfile +10 -9
- data/gemfiles/rails32.gemfile +10 -9
- data/gemfiles/rails40.gemfile +10 -9
- data/gemfiles/rails41.gemfile +10 -9
- data/gemfiles/rails42.gemfile +12 -9
- data/gemfiles/rails50.gemfile +21 -14
- data/gemfiles/rails51.gemfile +21 -14
- data/gemfiles/rails52.gemfile +15 -12
- data/gemfiles/rails60.gemfile +67 -0
- data/lib/generators/rollbar/rollbar_generator.rb +1 -1
- data/lib/rails/rollbar_runner.rb +4 -2
- data/lib/rollbar/capistrano.rb +1 -1
- data/lib/rollbar/capistrano3.rb +6 -3
- data/lib/rollbar/capistrano_tasks.rb +29 -21
- data/lib/rollbar/configuration.rb +86 -16
- data/lib/rollbar/delay/girl_friday.rb +4 -8
- data/lib/rollbar/delay/resque.rb +3 -6
- data/lib/rollbar/delay/sidekiq.rb +4 -10
- data/lib/rollbar/delay/sucker_punch.rb +16 -19
- data/lib/rollbar/delay/thread.rb +16 -2
- data/lib/rollbar/deploy.rb +52 -29
- data/lib/rollbar/encoding/encoder.rb +17 -10
- data/lib/rollbar/exception_reporter.rb +19 -5
- data/lib/rollbar/item/backtrace.rb +13 -3
- data/lib/rollbar/item/frame.rb +9 -1
- data/lib/rollbar/item/locals.rb +100 -0
- data/lib/rollbar/item.rb +56 -17
- data/lib/rollbar/json.rb +6 -51
- data/lib/rollbar/language_support.rb +4 -20
- data/lib/rollbar/lazy_store.rb +5 -5
- data/lib/rollbar/logger.rb +1 -0
- data/lib/rollbar/logger_proxy.rb +6 -2
- data/lib/rollbar/middleware/js.rb +28 -18
- data/lib/rollbar/middleware/rack.rb +4 -1
- data/lib/rollbar/middleware/rails/rollbar.rb +10 -1
- data/lib/rollbar/notifier/trace_with_bindings.rb +65 -0
- data/lib/rollbar/notifier.rb +225 -89
- data/lib/rollbar/plugin.rb +54 -6
- data/lib/rollbar/plugins/active_job.rb +6 -2
- data/lib/rollbar/plugins/basic_socket.rb +21 -6
- data/lib/rollbar/plugins/delayed_job/job_data.rb +3 -3
- data/lib/rollbar/plugins/delayed_job/plugin.rb +13 -3
- data/lib/rollbar/plugins/error_context.rb +11 -0
- data/lib/rollbar/plugins/goalie.rb +11 -3
- data/lib/rollbar/plugins/rails/controller_methods.rb +15 -3
- data/lib/rollbar/plugins/rake.rb +2 -2
- data/lib/rollbar/plugins/sidekiq/plugin.rb +5 -4
- data/lib/rollbar/plugins.rb +7 -1
- data/lib/rollbar/rake_tasks.rb +4 -148
- data/lib/rollbar/request_data_extractor.rb +31 -21
- data/lib/rollbar/rollbar_test.rb +36 -0
- data/lib/rollbar/scrubbers/params.rb +19 -18
- data/lib/rollbar/scrubbers/url.rb +18 -9
- data/lib/rollbar/scrubbers.rb +3 -3
- data/lib/rollbar/truncation/frames_strategy.rb +1 -1
- data/lib/rollbar/truncation/min_body_strategy.rb +2 -3
- data/lib/rollbar/truncation/mixin.rb +1 -1
- data/lib/rollbar/truncation/remove_any_key_strategy.rb +123 -0
- data/lib/rollbar/truncation/remove_extra_strategy.rb +35 -0
- data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
- data/lib/rollbar/truncation/strings_strategy.rb +6 -5
- data/lib/rollbar/truncation.rb +9 -2
- data/lib/rollbar/util/hash.rb +15 -0
- data/lib/rollbar/util/ip_anonymizer.rb +8 -7
- data/lib/rollbar/util/ip_obfuscator.rb +1 -1
- data/lib/rollbar/util.rb +6 -2
- data/lib/rollbar/version.rb +1 -1
- data/lib/rollbar.rb +2 -3
- data/lib/tasks/benchmark.rake +103 -0
- data/rollbar.gemspec +13 -5
- data/spec/support/rollbar_api.rb +67 -0
- metadata +21 -23
- data/gemfiles/ruby_1_8_and_1_9_2.gemfile +0 -49
- data/lib/rollbar/json/default.rb +0 -11
- data/lib/rollbar/json/oj.rb +0 -16
@@ -14,5 +14,9 @@ module Rollbar
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
if defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
|
18
|
+
ActiveSupport.on_load(:action_mailer) do
|
19
|
+
# Automatically add to ActionMailer::DeliveryJob
|
20
|
+
ActionMailer::DeliveryJob.send(:include, Rollbar::ActiveJob) if defined?(ActionMailer::DeliveryJob)
|
21
|
+
end
|
22
|
+
end
|
@@ -1,16 +1,31 @@
|
|
1
1
|
Rollbar.plugins.define('basic_socket') do
|
2
|
+
load_on_demand
|
3
|
+
|
2
4
|
dependency { !configuration.disable_core_monkey_patch }
|
3
5
|
|
4
6
|
# Needed to avoid active_support (< 4.1.0) bug serializing JSONs
|
5
|
-
dependency
|
7
|
+
dependency do
|
8
|
+
defined?(ActiveSupport::VERSION::STRING) &&
|
9
|
+
Gem::Version.new(ActiveSupport::VERSION::STRING) < Gem::Version.new('4.1.0')
|
10
|
+
end
|
6
11
|
|
7
12
|
execute do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
class BasicSocket # :nodoc:
|
14
|
+
def new_as_json(_options = nil)
|
15
|
+
{
|
16
|
+
:value => inspect
|
17
|
+
}
|
13
18
|
end
|
19
|
+
# alias_method is recommended over alias when aliasing at runtime.
|
20
|
+
# https://github.com/rubocop-hq/ruby-style-guide#alias-method
|
21
|
+
alias_method :original_as_json, :as_json # rubocop:disable Style/Alias
|
22
|
+
alias_method :as_json, :new_as_json # rubocop:disable Style/Alias
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
revert do
|
27
|
+
class BasicSocket # :nodoc:
|
28
|
+
alias_method :as_json, :original_as_json # rubocop:disable Style/Alias
|
14
29
|
end
|
15
30
|
end
|
16
31
|
end
|
@@ -10,7 +10,7 @@ module Rollbar
|
|
10
10
|
def to_hash
|
11
11
|
job_data = extract_job_data
|
12
12
|
|
13
|
-
handler_parent = job_data['job']
|
13
|
+
handler_parent = job_data['job'] || job_data
|
14
14
|
handler_parent['handler'] = handler_data
|
15
15
|
|
16
16
|
job_data
|
@@ -32,7 +32,7 @@ module Rollbar
|
|
32
32
|
return payload_object unless payload_object.respond_to?(:object)
|
33
33
|
|
34
34
|
object_data(payload_object.object)
|
35
|
-
rescue
|
35
|
+
rescue StandardError
|
36
36
|
{}
|
37
37
|
end
|
38
38
|
|
@@ -42,7 +42,7 @@ module Rollbar
|
|
42
42
|
:args => job.payload_object.args,
|
43
43
|
:object => object.is_a?(Class) ? object.name : object.to_s
|
44
44
|
}
|
45
|
-
rescue
|
45
|
+
rescue StandardError
|
46
46
|
{}
|
47
47
|
end
|
48
48
|
end
|
@@ -9,10 +9,16 @@ module Rollbar
|
|
9
9
|
|
10
10
|
class RollbarPlugin < ::Delayed::Plugin
|
11
11
|
callbacks do |lifecycle|
|
12
|
-
lifecycle.around(:invoke_job, &Delayed
|
12
|
+
lifecycle.around(:invoke_job, &Delayed.invoke_job_callback)
|
13
13
|
lifecycle.after(:failure) do |_, job, _, _|
|
14
14
|
data = Rollbar::Delayed.build_job_data(job)
|
15
|
-
|
15
|
+
|
16
|
+
# DelayedJob < 4.1 doesn't provide job#error
|
17
|
+
if job.class.method_defined? :error
|
18
|
+
::Rollbar.scope(:request => data).error(job.error, :use_exception_level_filters => true) if job.error
|
19
|
+
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)
|
21
|
+
end
|
16
22
|
end
|
17
23
|
end
|
18
24
|
end
|
@@ -37,7 +43,7 @@ module Rollbar
|
|
37
43
|
proc do |job, *args, &block|
|
38
44
|
begin
|
39
45
|
block.call(job, *args)
|
40
|
-
rescue => e
|
46
|
+
rescue StandardError => e
|
41
47
|
report(e, job)
|
42
48
|
|
43
49
|
raise e
|
@@ -54,6 +60,10 @@ module Rollbar
|
|
54
60
|
end
|
55
61
|
|
56
62
|
def self.skip_report?(job)
|
63
|
+
handler = ::Rollbar.configuration.async_skip_report_handler
|
64
|
+
|
65
|
+
return handler.call(job) if handler.respond_to?(:call)
|
66
|
+
|
57
67
|
job.attempts < ::Rollbar.configuration.dj_threshold
|
58
68
|
end
|
59
69
|
|
@@ -10,10 +10,18 @@ Rollbar.plugins.define('goalie') do
|
|
10
10
|
|
11
11
|
begin
|
12
12
|
controller = env['action_controller.instance']
|
13
|
-
request_data =
|
14
|
-
|
13
|
+
request_data = begin
|
14
|
+
controller.rollbar_request_data
|
15
|
+
rescue StandardError
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
person_data = begin
|
19
|
+
controller.rollbar_person_data
|
20
|
+
rescue StandardError
|
21
|
+
nil
|
22
|
+
end
|
15
23
|
exception_data = Rollbar.scope(:request => request_data, :person => person_data).error(exception, :use_exception_level_filters => true)
|
16
|
-
rescue => e
|
24
|
+
rescue StandardError => e
|
17
25
|
Rollbar.log_warning "[Rollbar] Exception while reporting exception to Rollbar: #{e}"
|
18
26
|
end
|
19
27
|
|
@@ -11,9 +11,21 @@ module Rollbar
|
|
11
11
|
# include id, username, email if non-empty
|
12
12
|
if user
|
13
13
|
{
|
14
|
-
:id => (
|
15
|
-
|
16
|
-
|
14
|
+
:id => (begin
|
15
|
+
user.send(Rollbar.configuration.person_id_method)
|
16
|
+
rescue StandardError
|
17
|
+
nil
|
18
|
+
end),
|
19
|
+
:username => (begin
|
20
|
+
user.send(Rollbar.configuration.person_username_method)
|
21
|
+
rescue StandardError
|
22
|
+
nil
|
23
|
+
end),
|
24
|
+
:email => (begin
|
25
|
+
user.send(Rollbar.configuration.person_email_method)
|
26
|
+
rescue StandardError
|
27
|
+
nil
|
28
|
+
end)
|
17
29
|
}
|
18
30
|
else
|
19
31
|
{}
|
data/lib/rollbar/plugins/rake.rb
CHANGED
@@ -2,10 +2,10 @@ require 'rollbar/scrubbers/params'
|
|
2
2
|
|
3
3
|
module Rollbar
|
4
4
|
class Sidekiq
|
5
|
-
PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class]
|
5
|
+
PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class].freeze
|
6
6
|
|
7
7
|
class ClearScope
|
8
|
-
def call(
|
8
|
+
def call(_worker, _msg, _queue)
|
9
9
|
Rollbar.reset_notifier!
|
10
10
|
|
11
11
|
yield
|
@@ -38,15 +38,16 @@ module Rollbar
|
|
38
38
|
Rollbar::Scrubbers::Params.call(options)
|
39
39
|
end
|
40
40
|
|
41
|
-
def self.skip_report?(job_hash,
|
41
|
+
def self.skip_report?(job_hash, _e)
|
42
42
|
return false if job_hash.nil?
|
43
|
+
|
43
44
|
# when rollbar middleware catches, sidekiq's retry_job processor hasn't set
|
44
45
|
# the retry_count for the current job yet, so adding 1 gives the actual retry count
|
45
46
|
actual_retry_count = job_hash.fetch('retry_count', -1) + 1
|
46
47
|
job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
|
47
48
|
end
|
48
49
|
|
49
|
-
def call(
|
50
|
+
def call(_worker, msg, _queue)
|
50
51
|
Rollbar.reset_notifier!
|
51
52
|
|
52
53
|
yield
|
data/lib/rollbar/plugins.rb
CHANGED
data/lib/rollbar/rake_tasks.rb
CHANGED
@@ -1,154 +1,10 @@
|
|
1
|
-
require 'rollbar'
|
2
|
-
begin
|
3
|
-
require 'rack/mock'
|
4
|
-
rescue LoadError
|
5
|
-
puts 'Cannot load rack/mock'
|
6
|
-
end
|
7
|
-
require 'logger'
|
8
1
|
|
9
2
|
namespace :rollbar do
|
10
|
-
desc 'Verify your gem installation by sending a test
|
3
|
+
desc 'Verify your gem installation by sending a test message to Rollbar'
|
11
4
|
task :test => [:environment] do
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
# Module to inject into the Rails controllers or rack apps
|
17
|
-
module RollbarTest # :nodoc:
|
18
|
-
def test_rollbar
|
19
|
-
puts 'Raising RollbarTestingException to simulate app failure.'
|
20
|
-
|
21
|
-
raise RollbarTestingException.new, ::RollbarTest.success_message
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.run
|
25
|
-
return unless confirmed_token?
|
26
|
-
|
27
|
-
configure_rails if defined?(Rails)
|
28
|
-
|
29
|
-
puts 'Testing manual report...'
|
30
|
-
Rollbar.error('Test error from rollbar:test')
|
31
|
-
|
32
|
-
return unless defined?(Rack::MockRequest)
|
33
|
-
|
34
|
-
protocol, app = setup_app
|
35
|
-
|
36
|
-
puts 'Processing...'
|
37
|
-
env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify", 'REMOTE_ADDR' => '127.0.0.1')
|
38
|
-
status, = app.call(env)
|
39
|
-
|
40
|
-
puts error_message unless status.to_i == 500
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.configure_rails
|
44
|
-
Rails.logger = if defined?(ActiveSupport::TaggedLogging)
|
45
|
-
ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
|
46
|
-
else
|
47
|
-
Logger.new(STDOUT)
|
48
|
-
end
|
49
|
-
|
50
|
-
Rails.logger.level = Logger::DEBUG
|
51
|
-
Rollbar.preconfigure do |config|
|
52
|
-
config.logger = Rails.logger
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.confirmed_token?
|
57
|
-
return true if Rollbar.configuration.access_token
|
58
|
-
|
59
|
-
puts token_error_message
|
60
|
-
|
61
|
-
false
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.authlogic_config
|
65
|
-
# from http://stackoverflow.com/questions/5270835/authlogic-activation-problems
|
66
|
-
return unless defined?(Authlogic)
|
67
|
-
|
68
|
-
Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.setup_app
|
72
|
-
puts 'Setting up the test app.'
|
5
|
+
rollbar_dir = Gem.loaded_specs['rollbar'].full_gem_path
|
6
|
+
require "#{rollbar_dir}/lib/rollbar/rollbar_test"
|
73
7
|
|
74
|
-
|
75
|
-
app = rails_app
|
76
|
-
|
77
|
-
draw_rails_route(app)
|
78
|
-
|
79
|
-
authlogic_config
|
80
|
-
|
81
|
-
[rails_protocol(app), app]
|
82
|
-
else
|
83
|
-
['http', rack_app]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.rails_app
|
88
|
-
# The setup below is needed for Rails 5.x, but not for Rails 4.x and below.
|
89
|
-
# (And fails on Rails 4.x in various ways depending on the exact version.)
|
90
|
-
return Rails.application if Rails.version < '5.0.0'
|
91
|
-
|
92
|
-
# Spring now runs by default in development on all new Rails installs. This causes
|
93
|
-
# the new `/verify` route to not get picked up if `config.cache_classes == false`
|
94
|
-
# which is also a default in development env.
|
95
|
-
#
|
96
|
-
# `config.cache_classes` needs to be set, but the only possible time is at app load,
|
97
|
-
# so here we clone the default app with an updated config.
|
98
|
-
#
|
99
|
-
config = Rails.application.config
|
100
|
-
config.cache_classes = true
|
101
|
-
|
102
|
-
# Make a copy of the app, so the config can be updated.
|
103
|
-
Rails.application.class.name.constantize.new(:config => config)
|
104
|
-
end
|
105
|
-
|
106
|
-
def self.draw_rails_route(app)
|
107
|
-
app.routes_reloader.execute_if_updated
|
108
|
-
app.routes.draw do
|
109
|
-
get 'verify' => 'rollbar_test#verify', :as => 'verify'
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.rails_protocol(app)
|
114
|
-
defined?(app.config.force_ssl && app.config.force_ssl) ? 'https' : 'http'
|
115
|
-
end
|
116
|
-
|
117
|
-
def self.rack_app
|
118
|
-
Class.new do
|
119
|
-
include RollbarTest
|
120
|
-
|
121
|
-
def self.call(_env)
|
122
|
-
new.test_rollbar
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def self.token_error_message
|
128
|
-
'Rollbar needs an access token configured. Check the README for instructions.'
|
129
|
-
end
|
130
|
-
|
131
|
-
def self.error_message
|
132
|
-
'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.'
|
133
|
-
end
|
134
|
-
|
135
|
-
def self.success_message
|
136
|
-
'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
class RollbarTestingException < RuntimeError; end
|
141
|
-
|
142
|
-
if defined?(Rails)
|
143
|
-
class RollbarTestController < ActionController::Base # :nodoc:
|
144
|
-
include RollbarTest
|
145
|
-
|
146
|
-
def verify
|
147
|
-
test_rollbar
|
148
|
-
end
|
149
|
-
|
150
|
-
def logger
|
151
|
-
nil
|
152
|
-
end
|
8
|
+
RollbarTest.run
|
153
9
|
end
|
154
10
|
end
|
@@ -10,15 +10,19 @@ require 'rollbar/json'
|
|
10
10
|
|
11
11
|
module Rollbar
|
12
12
|
module RequestDataExtractor
|
13
|
-
ALLOWED_HEADERS_REGEX = /^HTTP_|^CONTENT_TYPE$|^CONTENT_LENGTH
|
14
|
-
ALLOWED_BODY_PARSEABLE_METHODS = %w
|
13
|
+
ALLOWED_HEADERS_REGEX = /^HTTP_|^CONTENT_TYPE$|^CONTENT_LENGTH$/.freeze
|
14
|
+
ALLOWED_BODY_PARSEABLE_METHODS = %w[POST PUT PATCH DELETE].freeze
|
15
15
|
|
16
16
|
def extract_person_data_from_controller(env)
|
17
|
-
if env.
|
17
|
+
if env.key?('rollbar.person_data')
|
18
18
|
person_data = env['rollbar.person_data'] || {}
|
19
19
|
else
|
20
20
|
controller = env['action_controller.instance']
|
21
|
-
person_data =
|
21
|
+
person_data = begin
|
22
|
+
controller.rollbar_person_data
|
23
|
+
rescue StandardError
|
24
|
+
{}
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
person_data
|
@@ -50,9 +54,7 @@ module Rollbar
|
|
50
54
|
:method => rollbar_request_method(env)
|
51
55
|
}
|
52
56
|
|
53
|
-
if env['action_dispatch.request_id']
|
54
|
-
data[:request_id] = env['action_dispatch.request_id']
|
55
|
-
end
|
57
|
+
data[:request_id] = env['action_dispatch.request_id'] if env['action_dispatch.request_id']
|
56
58
|
|
57
59
|
data
|
58
60
|
end
|
@@ -108,7 +110,7 @@ module Rollbar
|
|
108
110
|
elsif name == 'X-Forwarded-For' && !Rollbar.configuration.collect_user_ip
|
109
111
|
{}
|
110
112
|
elsif name == 'X-Forwarded-For' && Rollbar.configuration.collect_user_ip && Rollbar.configuration.anonymize_user_ip
|
111
|
-
ips = env[header].sub(
|
113
|
+
ips = env[header].sub(' ', '').split(',')
|
112
114
|
ips = ips.map { |ip| Rollbar::Util::IPAnonymizer.anonymize_ip(ip) }
|
113
115
|
{ name => ips.join(', ') }
|
114
116
|
elsif name == 'X-Real-Ip' && !Rollbar.configuration.collect_user_ip
|
@@ -129,13 +131,14 @@ module Rollbar
|
|
129
131
|
host = host.split(',').first.strip unless host.empty?
|
130
132
|
|
131
133
|
path = env['ORIGINAL_FULLPATH'] || env['REQUEST_URI']
|
134
|
+
path ||= "#{env['SCRIPT_NAME']}#{env['PATH_INFO']}#{"?#{env['QUERY_STRING']}" unless env['QUERY_STRING'].to_s.empty?}"
|
132
135
|
unless path.nil? || path.empty?
|
133
136
|
path = '/' + path.to_s if path.to_s.slice(0, 1) != '/'
|
134
137
|
end
|
135
138
|
|
136
139
|
port = env['HTTP_X_FORWARDED_PORT']
|
137
|
-
if port && !(!scheme.nil? && scheme.
|
138
|
-
!(!scheme.nil? && scheme.
|
140
|
+
if port && !(!scheme.nil? && scheme.casecmp('http').zero? && port.to_i == 80) && \
|
141
|
+
!(!scheme.nil? && scheme.casecmp('https').zero? && port.to_i == 443) && \
|
139
142
|
!(host.include? ':')
|
140
143
|
host = host + ':' + port
|
141
144
|
end
|
@@ -145,12 +148,13 @@ module Rollbar
|
|
145
148
|
|
146
149
|
def rollbar_user_ip(env)
|
147
150
|
return nil unless Rollbar.configuration.collect_user_ip
|
151
|
+
|
148
152
|
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
|
149
153
|
|
150
154
|
user_ip_string = Rollbar::Util::IPAnonymizer.anonymize_ip(user_ip_string)
|
151
155
|
|
152
156
|
Rollbar::Util::IPObfuscator.obfuscate_ip(user_ip_string)
|
153
|
-
rescue
|
157
|
+
rescue StandardError
|
154
158
|
nil
|
155
159
|
end
|
156
160
|
|
@@ -176,13 +180,13 @@ module Rollbar
|
|
176
180
|
|
177
181
|
def rollbar_get_params(rack_req)
|
178
182
|
rack_req.GET
|
179
|
-
rescue
|
183
|
+
rescue StandardError
|
180
184
|
{}
|
181
185
|
end
|
182
186
|
|
183
187
|
def rollbar_post_params(rack_req)
|
184
188
|
rack_req.POST
|
185
|
-
rescue
|
189
|
+
rescue StandardError
|
186
190
|
{}
|
187
191
|
end
|
188
192
|
|
@@ -195,18 +199,19 @@ module Rollbar
|
|
195
199
|
raw_body = rack_req.body.read
|
196
200
|
begin
|
197
201
|
Rollbar::JSON.load(raw_body)
|
198
|
-
rescue
|
202
|
+
rescue StandardError
|
199
203
|
raw_body
|
200
204
|
end
|
201
|
-
rescue
|
205
|
+
rescue StandardError
|
202
206
|
{}
|
203
207
|
ensure
|
204
208
|
rack_req.body.rewind
|
205
209
|
end
|
206
210
|
|
207
211
|
def json_request?(rack_req)
|
208
|
-
|
209
|
-
|
212
|
+
json_regex = /\bjson\b/
|
213
|
+
|
214
|
+
!!(rack_req.env['CONTENT_TYPE'] =~ json_regex)
|
210
215
|
end
|
211
216
|
|
212
217
|
def rollbar_route_params(env)
|
@@ -219,7 +224,7 @@ module Rollbar
|
|
219
224
|
# route params (if any)and format (if defined)
|
220
225
|
::Rails.application.routes.recognize_path(env['PATH_INFO'],
|
221
226
|
environment)
|
222
|
-
rescue
|
227
|
+
rescue StandardError
|
223
228
|
{}
|
224
229
|
end
|
225
230
|
end
|
@@ -228,13 +233,13 @@ module Rollbar
|
|
228
233
|
session = env.fetch('rack.session', {})
|
229
234
|
|
230
235
|
session.to_hash
|
231
|
-
rescue
|
236
|
+
rescue StandardError
|
232
237
|
{}
|
233
238
|
end
|
234
239
|
|
235
240
|
def rollbar_request_cookies(rack_req)
|
236
241
|
rack_req.cookies
|
237
|
-
rescue
|
242
|
+
rescue StandardError
|
238
243
|
{}
|
239
244
|
end
|
240
245
|
|
@@ -243,7 +248,12 @@ module Rollbar
|
|
243
248
|
end
|
244
249
|
|
245
250
|
def sensitive_headers_list
|
246
|
-
Rollbar.configuration.scrub_headers
|
251
|
+
return [] unless Rollbar.configuration.scrub_headers && Rollbar.configuration.scrub_headers.is_a?(Array)
|
252
|
+
|
253
|
+
# Normalize into the expected matching format
|
254
|
+
Rollbar.configuration.scrub_headers.map do |header|
|
255
|
+
header.split(/[-_]/).map(&:capitalize).join('-').gsub(/^Http-/, '')
|
256
|
+
end
|
247
257
|
end
|
248
258
|
end
|
249
259
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rollbar'
|
2
|
+
|
3
|
+
module RollbarTest # :nodoc:
|
4
|
+
def self.run
|
5
|
+
return unless confirmed_token?
|
6
|
+
|
7
|
+
puts 'Test sending to Rollbar...'
|
8
|
+
result = Rollbar.info('Test message from rollbar:test')
|
9
|
+
|
10
|
+
if result == 'error'
|
11
|
+
puts error_message
|
12
|
+
else
|
13
|
+
puts success_message
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.confirmed_token?
|
18
|
+
return true if Rollbar.configuration.access_token
|
19
|
+
|
20
|
+
puts token_error_message
|
21
|
+
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.token_error_message
|
26
|
+
'Rollbar needs an access token configured. Check the README for instructions.'
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.error_message
|
30
|
+
'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.'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.success_message
|
34
|
+
'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
|
35
|
+
end
|
36
|
+
end
|
@@ -9,8 +9,8 @@ module Rollbar
|
|
9
9
|
# received parameters. It will not scrub anything that is in the scrub_whitelist
|
10
10
|
# configuration array even if :scrub_all is true.
|
11
11
|
class Params
|
12
|
-
SKIPPED_CLASSES = [::Tempfile]
|
13
|
-
ATTACHMENT_CLASSES = %w
|
12
|
+
SKIPPED_CLASSES = [::Tempfile].freeze
|
13
|
+
ATTACHMENT_CLASSES = %w[ActionDispatch::Http::UploadedFile Rack::Multipart::UploadedFile].freeze
|
14
14
|
SCRUB_ALL = :scrub_all
|
15
15
|
|
16
16
|
def self.call(*args)
|
@@ -52,9 +52,10 @@ module Rollbar
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def build_whitelist_regex(whitelist)
|
55
|
-
fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) }
|
55
|
+
fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) || f.is_a?(Regexp) }
|
56
56
|
return unless fields.any?
|
57
|
-
|
57
|
+
|
58
|
+
Regexp.new(fields.map { |val| val.is_a?(Regexp) ? val : /\A#{Regexp.escape(val.to_s)}\z/ }.join('|'))
|
58
59
|
end
|
59
60
|
|
60
61
|
def scrub(params, options)
|
@@ -70,19 +71,19 @@ module Rollbar
|
|
70
71
|
|
71
72
|
params.to_hash.inject({}) do |result, (key, value)|
|
72
73
|
encoded_key = Rollbar::Encoding.encode(key).to_s
|
73
|
-
if (fields_regex === encoded_key) && !(whitelist_regex === encoded_key)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
74
|
+
result[key] = if (fields_regex === encoded_key) && !(whitelist_regex === encoded_key)
|
75
|
+
scrub_value(value)
|
76
|
+
elsif value.is_a?(Hash)
|
77
|
+
scrub(value, options)
|
78
|
+
elsif scrub_all && !(whitelist_regex === encoded_key)
|
79
|
+
scrub_value(value)
|
80
|
+
elsif value.is_a?(Array)
|
81
|
+
scrub_array(value, options)
|
82
|
+
elsif skip_value?(value)
|
83
|
+
"Skipped value of class '#{value.class.name}'"
|
84
|
+
else
|
85
|
+
rollbar_filtered_param_value(value)
|
86
|
+
end
|
86
87
|
|
87
88
|
result
|
88
89
|
end
|
@@ -102,7 +103,7 @@ module Rollbar
|
|
102
103
|
if ATTACHMENT_CLASSES.include?(value.class.name)
|
103
104
|
begin
|
104
105
|
attachment_value(value)
|
105
|
-
rescue
|
106
|
+
rescue StandardError
|
106
107
|
'Uploaded file'
|
107
108
|
end
|
108
109
|
else
|