rollbar 2.18.2 → 2.19.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +15 -0
- data/.travis.yml +155 -93
- data/Gemfile +19 -13
- data/README.md +12 -0
- data/gemfiles/rails30.gemfile +17 -10
- data/gemfiles/rails31.gemfile +20 -12
- data/gemfiles/rails32.gemfile +16 -7
- data/gemfiles/rails40.gemfile +16 -5
- data/gemfiles/rails41.gemfile +15 -5
- data/gemfiles/rails42.gemfile +25 -14
- data/gemfiles/rails50.gemfile +15 -8
- data/gemfiles/rails51.gemfile +15 -8
- data/gemfiles/rails52.gemfile +62 -0
- data/gemfiles/ruby_1_8_and_1_9_2.gemfile +2 -2
- data/lib/rails/rollbar_runner.rb +16 -1
- data/lib/rollbar/capistrano.rb +71 -39
- data/lib/rollbar/capistrano3.rb +53 -1
- data/lib/rollbar/capistrano_tasks.rb +131 -0
- data/lib/rollbar/configuration.rb +13 -4
- data/lib/rollbar/delay/active_job.rb +17 -0
- data/lib/rollbar/delay/sidekiq.rb +3 -1
- data/lib/rollbar/delay/thread.rb +1 -1
- data/lib/rollbar/deploy.rb +69 -0
- data/lib/rollbar/item.rb +17 -6
- data/lib/rollbar/middleware/js.rb +25 -3
- data/lib/rollbar/middleware/js/json_value.rb +26 -0
- data/lib/rollbar/notifier.rb +32 -13
- data/lib/rollbar/plugins/active_job.rb +3 -0
- data/lib/rollbar/plugins/rails/controller_methods.rb +2 -1
- data/lib/rollbar/plugins/rails/railtie_mixin.rb +7 -1
- data/lib/rollbar/rake_tasks.rb +126 -67
- data/lib/rollbar/scrubbers/params.rb +6 -0
- data/lib/rollbar/util.rb +75 -45
- data/lib/rollbar/util/hash.rb +15 -6
- data/lib/rollbar/version.rb +1 -1
- data/rollbar.gemspec +2 -3
- metadata +9 -261
- data/lib/rollbar/tasks/rollbar.cap +0 -47
- data/spec/cacert.pem +0 -3988
- data/spec/controllers/home_controller_spec.rb +0 -480
- data/spec/delay/sidekiq_spec.rb +0 -61
- data/spec/delay/sucker_punch_spec.rb +0 -25
- data/spec/delayed/backend/test.rb +0 -140
- data/spec/delayed/serialization/test.rb +0 -0
- data/spec/dummyapp/.gitignore +0 -73
- data/spec/dummyapp/Rakefile +0 -7
- data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
- data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
- data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
- data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
- data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
- data/spec/dummyapp/app/helpers/.gitkeep +0 -0
- data/spec/dummyapp/app/mailers/.gitkeep +0 -0
- data/spec/dummyapp/app/models/.gitkeep +0 -0
- data/spec/dummyapp/app/models/book.rb +0 -5
- data/spec/dummyapp/app/models/post.rb +0 -9
- data/spec/dummyapp/app/models/user.rb +0 -9
- data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
- data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
- data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
- data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/home/index.html.erb +0 -4
- data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
- data/spec/dummyapp/app/views/js/test.html.erb +0 -1
- data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
- data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
- data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
- data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
- data/spec/dummyapp/app/views/users/index.html.erb +0 -8
- data/spec/dummyapp/app/views/users/show.html.erb +0 -3
- data/spec/dummyapp/config.ru +0 -4
- data/spec/dummyapp/config/application.rb +0 -59
- data/spec/dummyapp/config/boot.rb +0 -10
- data/spec/dummyapp/config/database.yml +0 -25
- data/spec/dummyapp/config/environment.rb +0 -5
- data/spec/dummyapp/config/environments/development.rb +0 -37
- data/spec/dummyapp/config/environments/production.rb +0 -67
- data/spec/dummyapp/config/environments/test.rb +0 -37
- data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummyapp/config/initializers/inflections.rb +0 -15
- data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
- data/spec/dummyapp/config/initializers/rollbar.rb +0 -26
- data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
- data/spec/dummyapp/config/initializers/session_store.rb +0 -8
- data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
- data/spec/dummyapp/config/locales/devise.en.yml +0 -58
- data/spec/dummyapp/config/locales/en.yml +0 -5
- data/spec/dummyapp/config/routes.rb +0 -17
- data/spec/dummyapp/config/secrets.yml +0 -2
- data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
- data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
- data/spec/dummyapp/db/migrate/20161219184410_create_books.rb +0 -10
- data/spec/dummyapp/db/migrate/20161219185529_add_username_to_users.rb +0 -5
- data/spec/dummyapp/db/schema.rb +0 -41
- data/spec/dummyapp/db/seeds.rb +0 -12
- data/spec/dummyapp/lib/assets/.gitkeep +0 -0
- data/spec/dummyapp/public/404.html +0 -26
- data/spec/dummyapp/public/422.html +0 -26
- data/spec/dummyapp/public/500.html +0 -25
- data/spec/dummyapp/public/favicon.ico +0 -0
- data/spec/dummyapp/script/rails +0 -6
- data/spec/fixtures/file1 +0 -1
- data/spec/fixtures/file2 +0 -1
- data/spec/fixtures/payloads/message.json +0 -25
- data/spec/fixtures/payloads/sample.trace.json +0 -275
- data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
- data/spec/fixtures/plugins/dummy1.rb +0 -5
- data/spec/fixtures/plugins/dummy2.rb +0 -5
- data/spec/generators/rollbar/rollbar_generator_rails30_spec.rb +0 -31
- data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -51
- data/spec/requests/home_spec.rb +0 -49
- data/spec/rollbar/configuration_spec.rb +0 -74
- data/spec/rollbar/delay/delayed_job_spec.rb +0 -22
- data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
- data/spec/rollbar/delay/resque_spec.rb +0 -37
- data/spec/rollbar/delay/shoryuken_spec.rb +0 -44
- data/spec/rollbar/delay/thread_spec.rb +0 -27
- data/spec/rollbar/encoding/encoder_spec.rb +0 -63
- data/spec/rollbar/item/backtrace_spec.rb +0 -26
- data/spec/rollbar/item/frame_spec.rb +0 -267
- data/spec/rollbar/item_spec.rb +0 -736
- data/spec/rollbar/json/oj_spec.rb +0 -18
- data/spec/rollbar/json_spec.rb +0 -110
- data/spec/rollbar/lazy_store_spec.rb +0 -99
- data/spec/rollbar/logger_proxy_spec.rb +0 -69
- data/spec/rollbar/logger_spec.rb +0 -124
- data/spec/rollbar/middleware/js_spec.rb +0 -428
- data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
- data/spec/rollbar/notifier_spec.rb +0 -67
- data/spec/rollbar/plugin_spec.rb +0 -209
- data/spec/rollbar/plugins/active_job_spec.rb +0 -45
- data/spec/rollbar/plugins/delayed_job/job_data_spec.rb +0 -48
- data/spec/rollbar/plugins/delayed_job_spec.rb +0 -129
- data/spec/rollbar/plugins/rack_spec.rb +0 -152
- data/spec/rollbar/plugins/rails_js_spec.rb +0 -19
- data/spec/rollbar/plugins/rake_spec.rb +0 -34
- data/spec/rollbar/plugins/resque/failure_spec.rb +0 -36
- data/spec/rollbar/plugins/sidekiq_spec.rb +0 -169
- data/spec/rollbar/plugins/validations_spec.rb +0 -56
- data/spec/rollbar/plugins_spec.rb +0 -68
- data/spec/rollbar/request_data_extractor_spec.rb +0 -321
- data/spec/rollbar/scrubbers/params_spec.rb +0 -598
- data/spec/rollbar/scrubbers/url_spec.rb +0 -240
- data/spec/rollbar/scrubbers_spec.rb +0 -31
- data/spec/rollbar/sidekig/clear_scope_spec.rb +0 -19
- data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
- data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
- data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
- data/spec/rollbar/truncation_spec.rb +0 -27
- data/spec/rollbar/util/hash_spec.rb +0 -22
- data/spec/rollbar/util/ip_anonymizer_spec.rb +0 -30
- data/spec/rollbar/util_spec.rb +0 -80
- data/spec/rollbar_bc_spec.rb +0 -380
- data/spec/rollbar_spec.rb +0 -1737
- data/spec/spec_helper.rb +0 -84
- data/spec/support/cause_exception.rb +0 -1
- data/spec/support/encoding_helpers.rb +0 -8
- data/spec/support/encodings/iso_8859_9 +0 -1
- data/spec/support/fixture_helpers.rb +0 -10
- data/spec/support/get_ip_raising.rb +0 -7
- data/spec/support/helpers.rb +0 -5
- data/spec/support/matchers.rb +0 -23
- data/spec/support/notifier_helpers.rb +0 -57
- data/spec/support/rollbar_api.rb +0 -57
- data/spec/support/secure_headers_mocks.rb +0 -83
- data/spec/support/shared_contexts.rb +0 -12
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Rollbar
|
|
2
|
+
module Delay
|
|
3
|
+
# This class provides the ActiveJob async handler. Users can
|
|
4
|
+
# use ActiveJob in order to send the reports to the Rollbar API
|
|
5
|
+
class ActiveJob < ::ActiveJob::Base
|
|
6
|
+
queue_as :default
|
|
7
|
+
|
|
8
|
+
def perform(payload)
|
|
9
|
+
Rollbar.process_from_async_handler(payload)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.call(payload)
|
|
13
|
+
perform_later payload
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -10,7 +10,9 @@ module Rollbar
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def call(payload)
|
|
13
|
-
::Sidekiq::Client.push
|
|
13
|
+
if ::Sidekiq::Client.push(@options.merge('args' => [payload])) == nil
|
|
14
|
+
raise StandardError.new "Unable to push the job to Sidekiq"
|
|
15
|
+
end
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
include ::Sidekiq::Worker
|
data/lib/rollbar/delay/thread.rb
CHANGED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'capistrano'
|
|
2
|
+
|
|
3
|
+
module Rollbar
|
|
4
|
+
# Deploy Tracking API wrapper module
|
|
5
|
+
module Deploy
|
|
6
|
+
ENDPOINT = 'https://api.rollbar.com/api/1/deploy/'.freeze
|
|
7
|
+
|
|
8
|
+
def self.report(opts = {}, access_token:, environment:, revision:)
|
|
9
|
+
opts[:status] ||= :started
|
|
10
|
+
|
|
11
|
+
uri = URI.parse(::Rollbar::Deploy::ENDPOINT)
|
|
12
|
+
|
|
13
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
|
14
|
+
request.body = ::JSON.dump({
|
|
15
|
+
:access_token => access_token,
|
|
16
|
+
:environment => environment,
|
|
17
|
+
:revision => revision
|
|
18
|
+
}.merge(opts))
|
|
19
|
+
|
|
20
|
+
send_request(opts, :uri => uri, :request => request)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.update(opts = {}, deploy_id:, access_token:, status:)
|
|
24
|
+
uri = URI.parse(
|
|
25
|
+
::Rollbar::Deploy::ENDPOINT +
|
|
26
|
+
deploy_id.to_s +
|
|
27
|
+
'?access_token=' + access_token
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
request = Net::HTTP::Patch.new(uri.request_uri)
|
|
31
|
+
request.body = ::JSON.dump(:status => status.to_s, :comment => opts[:comment])
|
|
32
|
+
|
|
33
|
+
send_request(opts, :uri => uri, :request => request)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class << self
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def send_request(opts = {}, uri:, request:)
|
|
40
|
+
Net::HTTP.start(uri.host, uri.port, opts[:proxy], :use_ssl => true) do |http|
|
|
41
|
+
build_result(
|
|
42
|
+
:uri => uri,
|
|
43
|
+
:request => request,
|
|
44
|
+
:response => opts[:dry_run] ? nil : http.request(request)
|
|
45
|
+
)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def build_result(uri:, request:, response: nil)
|
|
50
|
+
result = {
|
|
51
|
+
:request_info => uri.inspect + ': ' + request.body,
|
|
52
|
+
:request => request,
|
|
53
|
+
:response => response
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
unless result[:response].nil?
|
|
57
|
+
result.merge!(JSON.parse(result[:response].body, :symbolize_names => true))
|
|
58
|
+
result[:response_info] = build_response_info(result[:response])
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def build_response_info(response)
|
|
65
|
+
response.code + '; ' + response.message + '; ' + response.body.delete!("\n")
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/rollbar/item.rb
CHANGED
|
@@ -26,12 +26,12 @@ module Rollbar
|
|
|
26
26
|
attr_reader :message
|
|
27
27
|
attr_reader :exception
|
|
28
28
|
attr_reader :extra
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
attr_reader :configuration
|
|
31
31
|
attr_reader :scope
|
|
32
32
|
attr_reader :logger
|
|
33
33
|
attr_reader :notifier
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
attr_reader :context
|
|
36
36
|
|
|
37
37
|
def_delegators :payload, :[]
|
|
@@ -156,13 +156,24 @@ module Rollbar
|
|
|
156
156
|
end
|
|
157
157
|
|
|
158
158
|
def build_extra
|
|
159
|
-
if custom_data_method?
|
|
160
|
-
Util.deep_merge(custom_data, extra || {})
|
|
159
|
+
if custom_data_method? && !Rollbar::Util.method_in_stack(:custom_data, __FILE__)
|
|
160
|
+
Util.deep_merge(scrub(custom_data), scrub(extra) || {})
|
|
161
161
|
else
|
|
162
|
-
extra
|
|
162
|
+
scrub(extra)
|
|
163
163
|
end
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
+
def scrub(data)
|
|
167
|
+
return data unless data.is_a? Hash
|
|
168
|
+
|
|
169
|
+
options = {
|
|
170
|
+
:params => data,
|
|
171
|
+
:config => Rollbar.configuration.scrub_fields,
|
|
172
|
+
:whitelist => Rollbar.configuration.scrub_whitelist
|
|
173
|
+
}
|
|
174
|
+
Rollbar::Scrubbers::Params.call(options)
|
|
175
|
+
end
|
|
176
|
+
|
|
166
177
|
def custom_data_method?
|
|
167
178
|
!!configuration.custom_data_method
|
|
168
179
|
end
|
|
@@ -173,7 +184,7 @@ module Rollbar
|
|
|
173
184
|
else
|
|
174
185
|
data = configuration.custom_data_method.call
|
|
175
186
|
end
|
|
176
|
-
|
|
187
|
+
|
|
177
188
|
Rollbar::Util.deep_copy(data)
|
|
178
189
|
rescue => e
|
|
179
190
|
return {} if configuration.safely?
|
|
@@ -120,7 +120,11 @@ module Rollbar
|
|
|
120
120
|
|
|
121
121
|
add_person_data(js_config, env)
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
# MUST use the Ruby JSON encoder (JSON#generate).
|
|
124
|
+
# See lib/rollbar/middleware/js/json_value
|
|
125
|
+
json = ::JSON.generate(js_config)
|
|
126
|
+
|
|
127
|
+
script_tag("var _rollbarConfig = #{json};", env)
|
|
124
128
|
end
|
|
125
129
|
|
|
126
130
|
def add_person_data(js_config, env)
|
|
@@ -141,7 +145,9 @@ module Rollbar
|
|
|
141
145
|
end
|
|
142
146
|
|
|
143
147
|
def script_tag(content, env)
|
|
144
|
-
if
|
|
148
|
+
if (nonce = rails5_nonce(env))
|
|
149
|
+
script_tag_content = "\n<script type=\"text/javascript\" nonce=\"#{nonce}\">#{content}</script>"
|
|
150
|
+
elsif secure_headers_nonce?
|
|
145
151
|
nonce = ::SecureHeaders.content_security_policy_script_nonce(::Rack::Request.new(env))
|
|
146
152
|
script_tag_content = "\n<script type=\"text/javascript\" nonce=\"#{nonce}\">#{content}</script>"
|
|
147
153
|
else
|
|
@@ -156,7 +162,23 @@ module Rollbar
|
|
|
156
162
|
string
|
|
157
163
|
end
|
|
158
164
|
|
|
159
|
-
|
|
165
|
+
# Rails 5.2 Secure Content Policy
|
|
166
|
+
def rails5_nonce(env)
|
|
167
|
+
# The nonce is the preferred method, however 'unsafe-inline' is also possible.
|
|
168
|
+
# The app gets to decide, so we handle both. If the script_src key is missing,
|
|
169
|
+
# Rails will not add the nonce to the headers, so we should not add it either.
|
|
170
|
+
# If the 'unsafe-inline' value is present, the app should not add a nonce and
|
|
171
|
+
# we should ignore it if they do.
|
|
172
|
+
req = ::ActionDispatch::Request.new env
|
|
173
|
+
req.respond_to?(:content_security_policy) &&
|
|
174
|
+
req.content_security_policy &&
|
|
175
|
+
req.content_security_policy.directives['script-src'] &&
|
|
176
|
+
!req.content_security_policy.directives['script-src'].include?("'unsafe-inline'") &&
|
|
177
|
+
req.content_security_policy_nonce
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Secure Headers gem
|
|
181
|
+
def secure_headers_nonce?
|
|
160
182
|
secure_headers.append_nonce?
|
|
161
183
|
end
|
|
162
184
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Allows a Ruby String to be used to create native Javascript objects
|
|
2
|
+
# when calling JSON#generate.
|
|
3
|
+
#
|
|
4
|
+
# Example:
|
|
5
|
+
# JSON.generate({ foo: Rollbar::JSON::Value.new('function(){ alert("bar") }') })
|
|
6
|
+
# => '{"foo":function(){ alert(\"bar\") }}'
|
|
7
|
+
#
|
|
8
|
+
# MUST use the Ruby JSON encoder, as in the example. The ActiveSupport encoder,
|
|
9
|
+
# which is installed with Rails, is invoked when calling Hash#to_json and #as_json,
|
|
10
|
+
# and will not work.
|
|
11
|
+
#
|
|
12
|
+
module Rollbar
|
|
13
|
+
module JSON
|
|
14
|
+
class Value # :nodoc:
|
|
15
|
+
attr_accessor :value
|
|
16
|
+
|
|
17
|
+
def initialize(value)
|
|
18
|
+
@value = value
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_json(*_args)
|
|
22
|
+
value
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/rollbar/notifier.rb
CHANGED
|
@@ -134,10 +134,11 @@ module Rollbar
|
|
|
134
134
|
return 'ignored' if ignored?(exception, use_exception_level_filters)
|
|
135
135
|
|
|
136
136
|
begin
|
|
137
|
-
call_before_process(:level => level,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
status = call_before_process(:level => level,
|
|
138
|
+
:exception => exception,
|
|
139
|
+
:message => message,
|
|
140
|
+
:extra => extra)
|
|
141
|
+
return 'ignored' if status == 'ignored'
|
|
141
142
|
rescue Rollbar::Ignore
|
|
142
143
|
return 'ignored'
|
|
143
144
|
end
|
|
@@ -295,6 +296,10 @@ module Rollbar
|
|
|
295
296
|
end
|
|
296
297
|
end
|
|
297
298
|
|
|
299
|
+
def logger
|
|
300
|
+
@logger ||= LoggerProxy.new(configuration.logger)
|
|
301
|
+
end
|
|
302
|
+
|
|
298
303
|
private
|
|
299
304
|
|
|
300
305
|
def use_exception_level_filters?(options)
|
|
@@ -317,7 +322,8 @@ module Rollbar
|
|
|
317
322
|
|
|
318
323
|
handlers.each do |handler|
|
|
319
324
|
begin
|
|
320
|
-
handler.call(options)
|
|
325
|
+
status = handler.call(options)
|
|
326
|
+
return 'ignored' if status == 'ignored'
|
|
321
327
|
rescue Rollbar::Ignore
|
|
322
328
|
raise
|
|
323
329
|
rescue => e
|
|
@@ -343,10 +349,10 @@ module Rollbar
|
|
|
343
349
|
exception = arg
|
|
344
350
|
elsif arg.is_a?(Hash)
|
|
345
351
|
extra = arg
|
|
346
|
-
|
|
352
|
+
|
|
347
353
|
context = extra[:custom_data_method_context]
|
|
348
354
|
extra.delete :custom_data_method_context
|
|
349
|
-
|
|
355
|
+
|
|
350
356
|
extra = nil if extra.empty?
|
|
351
357
|
end
|
|
352
358
|
end
|
|
@@ -407,7 +413,7 @@ module Rollbar
|
|
|
407
413
|
# If that fails, we'll fall back to a more static failsafe response.
|
|
408
414
|
def report_internal_error(exception)
|
|
409
415
|
log_error '[Rollbar] Reporting internal error encountered while sending data to Rollbar.'
|
|
410
|
-
|
|
416
|
+
|
|
411
417
|
configuration.execute_hook(:on_report_internal_error, exception)
|
|
412
418
|
|
|
413
419
|
begin
|
|
@@ -513,12 +519,29 @@ module Rollbar
|
|
|
513
519
|
|
|
514
520
|
request = Net::HTTP::Post.new(uri.request_uri)
|
|
515
521
|
|
|
516
|
-
request.body = body
|
|
522
|
+
request.body = pack_ruby260_bytes(body)
|
|
517
523
|
request.add_field('X-Rollbar-Access-Token', access_token)
|
|
518
524
|
|
|
519
525
|
handle_net_retries { http.request(request) }
|
|
520
526
|
end
|
|
521
527
|
|
|
528
|
+
def pack_ruby260_bytes(body)
|
|
529
|
+
# Ruby 2.6.0 shipped with a bug affecting multi-byte body for Net::HTTP.
|
|
530
|
+
# Fix (committed one day after 2.6.0p0 shipped) is here:
|
|
531
|
+
# https://github.com/ruby/ruby/commit/1680a13a926b17661329beec1ded6b32aad16c1b#diff-00a99d8c71daaf5fc60a050da41f7261
|
|
532
|
+
#
|
|
533
|
+
# We work around this by repacking the body as single byte chars if needed.
|
|
534
|
+
if RUBY_VERSION == '2.6.0' && multibyte?(body)
|
|
535
|
+
body.unpack('C*').pack('C*')
|
|
536
|
+
else
|
|
537
|
+
body
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
def multibyte?(str)
|
|
542
|
+
str.chars.length != str.bytes.length
|
|
543
|
+
end
|
|
544
|
+
|
|
522
545
|
def http_proxy_for_em(uri)
|
|
523
546
|
proxy = http_proxy(uri)
|
|
524
547
|
{
|
|
@@ -706,9 +729,5 @@ module Rollbar
|
|
|
706
729
|
uuid_url = Util.uuid_rollbar_url(data, configuration)
|
|
707
730
|
log_info "[Rollbar] Details: #{uuid_url} (only available if report was successful)"
|
|
708
731
|
end
|
|
709
|
-
|
|
710
|
-
def logger
|
|
711
|
-
@logger ||= LoggerProxy.new(configuration.logger)
|
|
712
|
-
end
|
|
713
732
|
end
|
|
714
733
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'rollbar/request_data_extractor'
|
|
2
|
+
require 'rollbar/util'
|
|
2
3
|
|
|
3
4
|
module Rollbar
|
|
4
5
|
module Rails
|
|
@@ -6,7 +7,7 @@ module Rollbar
|
|
|
6
7
|
include RequestDataExtractor
|
|
7
8
|
|
|
8
9
|
def rollbar_person_data
|
|
9
|
-
user = send(Rollbar.configuration.person_method)
|
|
10
|
+
(user = send(Rollbar.configuration.person_method)) unless Rollbar::Util.method_in_stack_twice(:rollbar_person_data, __FILE__)
|
|
10
11
|
# include id, username, email if non-empty
|
|
11
12
|
if user
|
|
12
13
|
{
|
|
@@ -14,7 +14,13 @@ module Rollbar
|
|
|
14
14
|
config.environment ||= ::Rails.env
|
|
15
15
|
config.root ||= ::Rails.root
|
|
16
16
|
config.framework = "Rails: #{::Rails::VERSION::STRING}"
|
|
17
|
-
config.filepath ||=
|
|
17
|
+
config.filepath ||= begin
|
|
18
|
+
if ::Rails.application.class.respond_to?(:module_parent_name)
|
|
19
|
+
::Rails.application.class.module_parent_name + '.rollbar'
|
|
20
|
+
else
|
|
21
|
+
::Rails.application.class.parent_name + '.rollbar'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
18
24
|
end
|
|
19
25
|
end
|
|
20
26
|
end
|
data/lib/rollbar/rake_tasks.rb
CHANGED
|
@@ -2,92 +2,151 @@ require 'rollbar'
|
|
|
2
2
|
begin
|
|
3
3
|
require 'rack/mock'
|
|
4
4
|
rescue LoadError
|
|
5
|
+
puts 'Cannot load rack/mock'
|
|
5
6
|
end
|
|
6
7
|
require 'logger'
|
|
7
8
|
|
|
8
9
|
namespace :rollbar do
|
|
9
10
|
desc 'Verify your gem installation by sending a test exception to Rollbar'
|
|
10
11
|
task :test => [:environment] do
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
else
|
|
15
|
-
Logger.new(STDOUT)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
Rails.logger.level = Logger::DEBUG
|
|
19
|
-
Rollbar.preconfigure do |config|
|
|
20
|
-
config.logger = Rails.logger
|
|
21
|
-
end
|
|
22
|
-
end
|
|
12
|
+
RollbarTest.run
|
|
13
|
+
end
|
|
14
|
+
end
|
|
23
15
|
|
|
24
|
-
|
|
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.'
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
raise RollbarTestingException.new, ::RollbarTest.success_message
|
|
22
|
+
end
|
|
28
23
|
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
def self.run
|
|
25
|
+
return unless confirmed_token?
|
|
26
|
+
|
|
27
|
+
configure_rails if defined?(Rails)
|
|
31
28
|
|
|
32
29
|
puts 'Testing manual report...'
|
|
33
30
|
Rollbar.error('Test error from rollbar:test')
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
# rack apps
|
|
37
|
-
module RollbarTest
|
|
38
|
-
def test_rollbar
|
|
39
|
-
puts 'Raising RollbarTestingException to simulate app failure.'
|
|
32
|
+
return unless defined?(Rack::MockRequest)
|
|
40
33
|
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
43
53
|
end
|
|
54
|
+
end
|
|
44
55
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
# from http://stackoverflow.com/questions/5270835/authlogic-activation-problems
|
|
67
|
-
if defined? Authlogic
|
|
68
|
-
Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
protocol = (defined? Rails.application.config.force_ssl && Rails.application.config.force_ssl) ? 'https' : 'http'
|
|
72
|
-
app = Rails.application
|
|
73
|
-
else
|
|
74
|
-
protocol = 'http'
|
|
75
|
-
app = Class.new do
|
|
76
|
-
include RollbarTest
|
|
77
|
-
|
|
78
|
-
def self.call(_env)
|
|
79
|
-
new.test_rollbar
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
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.'
|
|
73
|
+
|
|
74
|
+
if defined?(Rails)
|
|
75
|
+
app = rails_app
|
|
83
76
|
|
|
84
|
-
|
|
85
|
-
env = Rack::MockRequest.env_for("#{protocol}://www.example.com/verify")
|
|
86
|
-
status, = app.call(env)
|
|
77
|
+
draw_rails_route(app)
|
|
87
78
|
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
90
123
|
end
|
|
91
124
|
end
|
|
92
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
|
+
class RollbarTestController < ActionController::Base # :nodoc:
|
|
143
|
+
include RollbarTest
|
|
144
|
+
|
|
145
|
+
def verify
|
|
146
|
+
test_rollbar
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def logger
|
|
150
|
+
nil
|
|
151
|
+
end
|
|
93
152
|
end
|