rollbar 2.22.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 +4 -4
- data/.github/pull_request_template.md +25 -0
- data/.rubocop.yml +136 -0
- data/.travis.yml +33 -30
- data/Gemfile +2 -0
- data/README.md +1 -1
- data/data/rollbar.snippet.js +1 -1
- data/docs/configuration.md +8 -0
- data/gemfiles/rails42.gemfile +4 -0
- data/gemfiles/rails50.gemfile +6 -2
- data/gemfiles/rails51.gemfile +6 -2
- data/gemfiles/rails60.gemfile +1 -1
- data/lib/rails/rollbar_runner.rb +3 -1
- data/lib/rollbar/capistrano.rb +1 -1
- data/lib/rollbar/capistrano_tasks.rb +10 -1
- data/lib/rollbar/configuration.rb +28 -6
- data/lib/rollbar/delay/girl_friday.rb +3 -7
- data/lib/rollbar/delay/resque.rb +2 -3
- data/lib/rollbar/delay/sidekiq.rb +2 -4
- data/lib/rollbar/delay/sucker_punch.rb +3 -4
- data/lib/rollbar/delay/thread.rb +14 -0
- data/lib/rollbar/deploy.rb +2 -0
- data/lib/rollbar/encoding/encoder.rb +10 -3
- data/lib/rollbar/item/backtrace.rb +12 -2
- data/lib/rollbar/item/frame.rb +2 -0
- data/lib/rollbar/item/locals.rb +45 -1
- data/lib/rollbar/item.rb +22 -14
- data/lib/rollbar/json.rb +1 -0
- data/lib/rollbar/middleware/js.rb +13 -3
- data/lib/rollbar/notifier.rb +154 -61
- data/lib/rollbar/plugins/active_job.rb +6 -2
- data/lib/rollbar/plugins/delayed_job/plugin.rb +11 -1
- data/lib/rollbar/plugins/error_context.rb +11 -0
- data/lib/rollbar/rake_tasks.rb +1 -1
- data/lib/rollbar/request_data_extractor.rb +7 -1
- data/lib/rollbar/rollbar_test.rb +6 -117
- data/lib/rollbar/scrubbers/url.rb +10 -5
- data/lib/rollbar/scrubbers.rb +1 -5
- data/lib/rollbar/truncation/frames_strategy.rb +1 -1
- data/lib/rollbar/truncation/mixin.rb +1 -1
- data/lib/rollbar/truncation/strings_strategy.rb +4 -2
- data/lib/rollbar/util.rb +4 -0
- data/lib/rollbar/version.rb +1 -1
- data/rollbar.gemspec +1 -0
- data/spec/support/rollbar_api.rb +67 -0
- metadata +6 -4
data/lib/rollbar/notifier.rb
CHANGED
@@ -19,7 +19,9 @@ module Rollbar
|
|
19
19
|
attr_accessor :last_report
|
20
20
|
attr_accessor :scope_object
|
21
21
|
|
22
|
-
|
22
|
+
MUTEX = Mutex.new
|
23
|
+
EXTENSION_REGEXP = /.rollbar\z/.freeze
|
24
|
+
FAILSAFE_STRING_LENGTH = 10_000
|
23
25
|
|
24
26
|
def initialize(parent_notifier = nil, payload_options = nil, scope = nil)
|
25
27
|
if parent_notifier
|
@@ -103,10 +105,10 @@ module Rollbar
|
|
103
105
|
|
104
106
|
# Sends a report to Rollbar.
|
105
107
|
#
|
106
|
-
# Accepts any number of arguments. The last String
|
107
|
-
# the message or description of the report. The last
|
108
|
-
# will become the associated exception for the report.
|
109
|
-
# argument will be used as the extra data for the report.
|
108
|
+
# Accepts a level string plus any number of arguments. The last String
|
109
|
+
# argument will become the message or description of the report. The last
|
110
|
+
# Exception argument will become the associated exception for the report.
|
111
|
+
# The last hash argument will be used as the extra data for the report.
|
110
112
|
#
|
111
113
|
# If the extra hash contains a symbol key :custom_data_method_context
|
112
114
|
# the value of the key will be used as the context for
|
@@ -117,14 +119,14 @@ module Rollbar
|
|
117
119
|
# begin
|
118
120
|
# foo = bar
|
119
121
|
# rescue => e
|
120
|
-
# Rollbar.log(e)
|
122
|
+
# Rollbar.log('error', e)
|
121
123
|
# end
|
122
124
|
#
|
123
125
|
# @example
|
124
|
-
# Rollbar.log('This is a simple log message')
|
126
|
+
# Rollbar.log('info', 'This is a simple log message')
|
125
127
|
#
|
126
128
|
# @example
|
127
|
-
# Rollbar.log(e, 'This is a description of the exception')
|
129
|
+
# Rollbar.log('error', e, 'This is a description of the exception')
|
128
130
|
#
|
129
131
|
def log(level, *args)
|
130
132
|
return 'disabled' unless enabled?
|
@@ -157,7 +159,13 @@ module Rollbar
|
|
157
159
|
def report_with_rescue(level, message, exception, extra, context)
|
158
160
|
report(level, message, exception, extra, context)
|
159
161
|
rescue StandardError, SystemStackError => e
|
160
|
-
|
162
|
+
original_error = {
|
163
|
+
:message => message,
|
164
|
+
:exception => exception,
|
165
|
+
:configuration => configuration
|
166
|
+
}
|
167
|
+
|
168
|
+
report_internal_error(e, original_error)
|
161
169
|
|
162
170
|
'error'
|
163
171
|
end
|
@@ -200,18 +208,20 @@ module Rollbar
|
|
200
208
|
def process_item(item)
|
201
209
|
if configuration.write_to_file
|
202
210
|
if configuration.use_async
|
203
|
-
|
204
|
-
|
211
|
+
MUTEX.synchronize do
|
212
|
+
do_write_item(item)
|
205
213
|
end
|
206
214
|
else
|
207
|
-
|
215
|
+
do_write_item(item)
|
208
216
|
end
|
209
217
|
else
|
210
218
|
send_item(item)
|
211
219
|
end
|
212
220
|
rescue StandardError => e
|
213
221
|
log_error("[Rollbar] Error processing the item: #{e.class}, #{e.message}. Item: #{item.payload.inspect}")
|
214
|
-
raise e
|
222
|
+
raise e unless via_failsafe?(item)
|
223
|
+
|
224
|
+
log_error('[Rollbar] Item has already failed. Not re-raising')
|
215
225
|
end
|
216
226
|
|
217
227
|
# We will reraise exceptions in this method so async queues
|
@@ -238,16 +248,19 @@ module Rollbar
|
|
238
248
|
# Using Rollbar.silenced we avoid the above behavior but Sidekiq
|
239
249
|
# will have a chance to retry the original job.
|
240
250
|
def process_from_async_handler(payload)
|
241
|
-
payload = Rollbar::JSON.load(payload) if payload.is_a?(String)
|
242
|
-
|
243
|
-
item = Item.build_with(payload,
|
244
|
-
:notifier => self,
|
245
|
-
:configuration => configuration,
|
246
|
-
:logger => logger)
|
247
|
-
|
248
251
|
Rollbar.silenced do
|
249
252
|
begin
|
250
|
-
|
253
|
+
if payload.is_a?(String)
|
254
|
+
# The final payload has already been built.
|
255
|
+
send_body(payload)
|
256
|
+
else
|
257
|
+
item = Item.build_with(payload,
|
258
|
+
:notifier => self,
|
259
|
+
:configuration => configuration,
|
260
|
+
:logger => logger)
|
261
|
+
|
262
|
+
process_item(item)
|
263
|
+
end
|
251
264
|
rescue StandardError => e
|
252
265
|
report_internal_error(e)
|
253
266
|
|
@@ -256,35 +269,34 @@ module Rollbar
|
|
256
269
|
end
|
257
270
|
end
|
258
271
|
|
259
|
-
def
|
260
|
-
|
261
|
-
|
262
|
-
log_error "[Rollbar] Sending failsafe response due to #{exception_reason}"
|
263
|
-
|
264
|
-
body = failsafe_body(exception_reason)
|
265
|
-
|
266
|
-
failsafe_data = {
|
272
|
+
def failsafe_initial_data(exception_reason)
|
273
|
+
{
|
267
274
|
:level => 'error',
|
268
275
|
:environment => configuration.environment.to_s,
|
269
276
|
:body => {
|
270
277
|
:message => {
|
271
|
-
:body =>
|
278
|
+
:body => failsafe_body(exception_reason)
|
272
279
|
}
|
273
280
|
},
|
274
281
|
:notifier => {
|
275
282
|
:name => 'rollbar-gem',
|
276
283
|
:version => VERSION
|
277
284
|
},
|
278
|
-
:custom => {
|
279
|
-
:orig_uuid => uuid,
|
280
|
-
:orig_host => host
|
281
|
-
},
|
282
285
|
:internal => true,
|
283
|
-
|
286
|
+
'failsafe' => true
|
284
287
|
}
|
288
|
+
end
|
289
|
+
|
290
|
+
def send_failsafe(message, exception, original_error = nil)
|
291
|
+
exception_reason = failsafe_reason(message, exception)
|
292
|
+
|
293
|
+
log_error "[Rollbar] Sending failsafe response due to #{exception_reason}"
|
294
|
+
|
295
|
+
failsafe_data = failsafe_initial_data(exception_reason)
|
296
|
+
|
297
|
+
failsafe_add_original_error_data(failsafe_data[:notifier], original_error)
|
285
298
|
|
286
299
|
failsafe_payload = {
|
287
|
-
'access_token' => configuration.access_token,
|
288
300
|
'data' => failsafe_data
|
289
301
|
}
|
290
302
|
|
@@ -293,7 +305,9 @@ module Rollbar
|
|
293
305
|
:notifier => self,
|
294
306
|
:configuration => configuration,
|
295
307
|
:logger => logger)
|
296
|
-
|
308
|
+
|
309
|
+
process_item(item)
|
310
|
+
log_and_return_item_data(item)
|
297
311
|
rescue StandardError => e
|
298
312
|
log_error "[Rollbar] Error sending failsafe : #{e}"
|
299
313
|
end
|
@@ -301,6 +315,57 @@ module Rollbar
|
|
301
315
|
failsafe_payload
|
302
316
|
end
|
303
317
|
|
318
|
+
def failsafe_add_original_error_data(payload_notifier, original_error)
|
319
|
+
return unless original_error
|
320
|
+
|
321
|
+
payload_notifier[:diagnostic] ||= {}
|
322
|
+
|
323
|
+
add_original_host(payload_notifier[:diagnostic], original_error)
|
324
|
+
add_original_uuid(payload_notifier[:diagnostic], original_error)
|
325
|
+
add_original_message(payload_notifier[:diagnostic], original_error)
|
326
|
+
add_original_error(payload_notifier[:diagnostic], original_error)
|
327
|
+
add_configured_options(payload_notifier, original_error)
|
328
|
+
end
|
329
|
+
|
330
|
+
def add_original_message(diagnostic, original_error)
|
331
|
+
diagnostic[:original_message] = original_error[:message].truncate(FAILSAFE_STRING_LENGTH) if original_error[:message]
|
332
|
+
|
333
|
+
rescue StandardError => e
|
334
|
+
diagnostic[:original_message] = "Failed: #{e.message}"
|
335
|
+
end
|
336
|
+
|
337
|
+
def add_original_error(diagnostic, original_error)
|
338
|
+
if original_error[:exception]
|
339
|
+
backtrace = original_error[:exception].backtrace
|
340
|
+
message = original_error[:exception].message
|
341
|
+
diagnostic[:original_error] = {
|
342
|
+
:message => message && message.truncate(FAILSAFE_STRING_LENGTH),
|
343
|
+
:stack => backtrace && backtrace.join(', ').truncate(FAILSAFE_STRING_LENGTH)
|
344
|
+
}
|
345
|
+
end
|
346
|
+
|
347
|
+
rescue StandardError => e
|
348
|
+
diagnostic[:original_error] = "Failed: #{e.message}"
|
349
|
+
end
|
350
|
+
|
351
|
+
def add_configured_options(payload_notifier, original_error)
|
352
|
+
if original_error[:configuration]
|
353
|
+
configured = original_error[:configuration].configured_options.configured
|
354
|
+
payload_notifier[:configured_options] = ::JSON.generate(configured).truncate(FAILSAFE_STRING_LENGTH)
|
355
|
+
end
|
356
|
+
|
357
|
+
rescue StandardError => e
|
358
|
+
payload_notifier[:configured_options] = "Failed: #{e.message}"
|
359
|
+
end
|
360
|
+
|
361
|
+
def add_original_host(diagnostic, original_error)
|
362
|
+
diagnostic[:original_host] = original_error[:host] if original_error[:host]
|
363
|
+
end
|
364
|
+
|
365
|
+
def add_original_uuid(diagnostic, original_error)
|
366
|
+
diagnostic[:original_uuid] = original_error[:uuid] if original_error[:uuid]
|
367
|
+
end
|
368
|
+
|
304
369
|
## Logging
|
305
370
|
%w[debug info warn error].each do |level|
|
306
371
|
define_method(:"log_#{level}") do |message|
|
@@ -456,7 +521,7 @@ module Rollbar
|
|
456
521
|
# Reports an internal error in the Rollbar library. This will be reported within the configured
|
457
522
|
# Rollbar project. We'll first attempt to provide a report including the exception traceback.
|
458
523
|
# If that fails, we'll fall back to a more static failsafe response.
|
459
|
-
def report_internal_error(exception)
|
524
|
+
def report_internal_error(exception, original_error = nil)
|
460
525
|
log_error '[Rollbar] Reporting internal error encountered while sending data to Rollbar.'
|
461
526
|
|
462
527
|
configuration.execute_hook(:on_report_internal_error, exception)
|
@@ -464,7 +529,7 @@ module Rollbar
|
|
464
529
|
begin
|
465
530
|
item = build_item('error', nil, exception, { :internal => true }, nil)
|
466
531
|
rescue StandardError => e
|
467
|
-
send_failsafe('build_item in exception_data', e)
|
532
|
+
send_failsafe('build_item in exception_data', e, original_error)
|
468
533
|
log_error "[Rollbar] Exception: #{exception}"
|
469
534
|
return
|
470
535
|
end
|
@@ -472,7 +537,7 @@ module Rollbar
|
|
472
537
|
begin
|
473
538
|
process_item(item)
|
474
539
|
rescue StandardError => e
|
475
|
-
send_failsafe('error in process_item', e)
|
540
|
+
send_failsafe('error in process_item', e, original_error)
|
476
541
|
log_error "[Rollbar] Item: #{item}"
|
477
542
|
return
|
478
543
|
end
|
@@ -480,7 +545,7 @@ module Rollbar
|
|
480
545
|
begin
|
481
546
|
log_instance_link(item['data'])
|
482
547
|
rescue StandardError => e
|
483
|
-
send_failsafe('error logging instance link', e)
|
548
|
+
send_failsafe('error logging instance link', e, original_error)
|
484
549
|
log_error "[Rollbar] Item: #{item}"
|
485
550
|
return
|
486
551
|
end
|
@@ -509,14 +574,18 @@ module Rollbar
|
|
509
574
|
|
510
575
|
## Delivery functions
|
511
576
|
|
512
|
-
def
|
513
|
-
|
514
|
-
return unless body
|
577
|
+
def send_using_eventmachine(body)
|
578
|
+
uri = URI.parse(configuration.endpoint)
|
515
579
|
|
516
|
-
headers = { 'X-Rollbar-Access-Token' =>
|
580
|
+
headers = { 'X-Rollbar-Access-Token' => configuration.access_token }
|
517
581
|
options = http_proxy_for_em(uri)
|
518
582
|
req = EventMachine::HttpRequest.new(uri.to_s, options).post(:body => body, :head => headers)
|
519
583
|
|
584
|
+
eventmachine_callback(req)
|
585
|
+
eventmachine_errback(req)
|
586
|
+
end
|
587
|
+
|
588
|
+
def eventmachine_callback(req)
|
520
589
|
req.callback do
|
521
590
|
if req.response_header.status == 200
|
522
591
|
log_info '[Rollbar] Success'
|
@@ -525,7 +594,9 @@ module Rollbar
|
|
525
594
|
log_info "[Rollbar] Response: #{req.response}"
|
526
595
|
end
|
527
596
|
end
|
597
|
+
end
|
528
598
|
|
599
|
+
def eventmachine_errback(req)
|
529
600
|
req.errback do
|
530
601
|
log_warning "[Rollbar] Call to API failed, status code: #{req.response_header.status}"
|
531
602
|
log_info "[Rollbar] Error's response: #{req.response}"
|
@@ -538,14 +609,20 @@ module Rollbar
|
|
538
609
|
body = item.dump
|
539
610
|
return unless body
|
540
611
|
|
541
|
-
uri = URI.parse(configuration.endpoint)
|
542
|
-
|
543
612
|
if configuration.use_eventmachine
|
544
|
-
|
613
|
+
send_using_eventmachine(body)
|
545
614
|
return
|
546
615
|
end
|
547
616
|
|
548
|
-
|
617
|
+
send_body(body)
|
618
|
+
end
|
619
|
+
|
620
|
+
def send_body(body)
|
621
|
+
log_info '[Rollbar] Sending json'
|
622
|
+
|
623
|
+
uri = URI.parse(configuration.endpoint)
|
624
|
+
|
625
|
+
handle_response(do_post(uri, body, configuration.access_token))
|
549
626
|
end
|
550
627
|
|
551
628
|
def do_post(uri, body, access_token)
|
@@ -658,27 +735,24 @@ module Rollbar
|
|
658
735
|
end
|
659
736
|
end
|
660
737
|
|
661
|
-
def write_item(item)
|
662
|
-
if configuration.use_async
|
663
|
-
@file_semaphore.synchronize do
|
664
|
-
do_write_item(item)
|
665
|
-
end
|
666
|
-
else
|
667
|
-
do_write_item(item)
|
668
|
-
end
|
669
|
-
end
|
670
|
-
|
671
738
|
def do_write_item(item)
|
672
739
|
log_info '[Rollbar] Writing item to file'
|
673
740
|
|
674
741
|
body = item.dump
|
675
742
|
return unless body
|
676
743
|
|
744
|
+
file_name = if configuration.files_with_pid_name_enabled
|
745
|
+
configuration.filepath.gsub(EXTENSION_REGEXP, "_#{Process.pid}\\0")
|
746
|
+
else
|
747
|
+
configuration.filepath
|
748
|
+
end
|
749
|
+
|
677
750
|
begin
|
678
|
-
@file ||= File.open(
|
751
|
+
@file ||= File.open(file_name, 'a')
|
679
752
|
|
680
753
|
@file.puts(body)
|
681
754
|
@file.flush
|
755
|
+
update_file(@file, file_name)
|
682
756
|
|
683
757
|
log_info '[Rollbar] Success'
|
684
758
|
rescue IOError => e
|
@@ -686,6 +760,18 @@ module Rollbar
|
|
686
760
|
end
|
687
761
|
end
|
688
762
|
|
763
|
+
def update_file(file, file_name)
|
764
|
+
return unless configuration.files_processed_enabled
|
765
|
+
|
766
|
+
time_now = Time.now
|
767
|
+
return if configuration.files_processed_duration > time_now - file.birthtime && file.size < configuration.files_processed_size
|
768
|
+
|
769
|
+
new_file_name = file_name.gsub(EXTENSION_REGEXP, "_processed_#{time_now.to_i}\\0")
|
770
|
+
File.rename(file, new_file_name)
|
771
|
+
file.close
|
772
|
+
@file = File.open(file_name, 'a')
|
773
|
+
end
|
774
|
+
|
689
775
|
def failsafe_reason(message, exception)
|
690
776
|
body = ''
|
691
777
|
|
@@ -737,8 +823,11 @@ module Rollbar
|
|
737
823
|
end
|
738
824
|
|
739
825
|
def process_async_item(item)
|
826
|
+
# Send async payloads as JSON string when async_json_payload is set.
|
827
|
+
payload = configuration.async_json_payload ? item.dump : item.payload
|
828
|
+
|
740
829
|
configuration.async_handler ||= default_async_handler
|
741
|
-
configuration.async_handler.call(
|
830
|
+
configuration.async_handler.call(payload)
|
742
831
|
rescue StandardError
|
743
832
|
if configuration.failover_handlers.empty?
|
744
833
|
log_error '[Rollbar] Async handler failed, and there are no failover handlers configured. See the docs for "failover_handlers"'
|
@@ -772,5 +861,9 @@ module Rollbar
|
|
772
861
|
uuid_url = Util.uuid_rollbar_url(data, configuration)
|
773
862
|
log_info "[Rollbar] Details: #{uuid_url} (only available if report was successful)"
|
774
863
|
end
|
864
|
+
|
865
|
+
def via_failsafe?(item)
|
866
|
+
item.payload.fetch('data', {}).fetch('failsafe', false)
|
867
|
+
end
|
775
868
|
end
|
776
869
|
end
|
@@ -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
|
@@ -12,7 +12,13 @@ module Rollbar
|
|
12
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
|
@@ -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
|
|
data/lib/rollbar/rake_tasks.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
namespace :rollbar do
|
3
|
-
desc 'Verify your gem installation by sending a test
|
3
|
+
desc 'Verify your gem installation by sending a test message to Rollbar'
|
4
4
|
task :test => [:environment] do
|
5
5
|
rollbar_dir = Gem.loaded_specs['rollbar'].full_gem_path
|
6
6
|
require "#{rollbar_dir}/lib/rollbar/rollbar_test"
|
@@ -131,6 +131,7 @@ module Rollbar
|
|
131
131
|
host = host.split(',').first.strip unless host.empty?
|
132
132
|
|
133
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?}"
|
134
135
|
unless path.nil? || path.empty?
|
135
136
|
path = '/' + path.to_s if path.to_s.slice(0, 1) != '/'
|
136
137
|
end
|
@@ -247,7 +248,12 @@ module Rollbar
|
|
247
248
|
end
|
248
249
|
|
249
250
|
def sensitive_headers_list
|
250
|
-
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
|
251
257
|
end
|
252
258
|
end
|
253
259
|
end
|
data/lib/rollbar/rollbar_test.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
10
|
+
if result == 'error'
|
11
|
+
puts error_message
|
12
|
+
else
|
13
|
+
puts success_message
|
46
14
|
end
|
47
15
|
end
|
48
16
|
|
@@ -54,69 +22,6 @@ 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
|
@@ -129,19 +34,3 @@ module RollbarTest # :nodoc:
|
|
129
34
|
'Testing rollbar with "rake rollbar:test". If you can see this, it works.'
|
130
35
|
end
|
131
36
|
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
|
@@ -67,10 +67,7 @@ module Rollbar
|
|
67
67
|
|
68
68
|
params = decode_www_form(query)
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
# We want this to rebuild array params like foo[]=1&foo[]=2
|
73
|
-
URI.escape(CGI.unescape(encoded_query))
|
70
|
+
encode_www_form(filter_query_params(params, regex, randomize_scrub_length, scrub_all, whitelist))
|
74
71
|
end
|
75
72
|
|
76
73
|
def decode_www_form(query)
|
@@ -78,7 +75,15 @@ module Rollbar
|
|
78
75
|
end
|
79
76
|
|
80
77
|
def encode_www_form(params)
|
81
|
-
URI.encode_www_form(params)
|
78
|
+
restore_square_brackets(URI.encode_www_form(params))
|
79
|
+
end
|
80
|
+
|
81
|
+
def restore_square_brackets(query)
|
82
|
+
# We want this to rebuild array params like foo[]=1&foo[]=2
|
83
|
+
#
|
84
|
+
# URI.encode_www_form follows the spec at https://url.spec.whatwg.org/#concept-urlencoded-serializer
|
85
|
+
# and percent encodes square brackets. Here we change them back.
|
86
|
+
query.gsub('%5B', '[').gsub('%5D', ']')
|
82
87
|
end
|
83
88
|
|
84
89
|
def filter_query_params(params, regex, randomize_scrub_length, scrub_all, whitelist)
|
data/lib/rollbar/scrubbers.rb
CHANGED