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