rollbar 2.19.2 → 2.19.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +27 -0
- data/Appraisals +10 -10
- data/Gemfile +2 -0
- data/README.md +4 -1
- data/Rakefile +0 -0
- data/data/rollbar.snippet.js +1 -1
- data/gemfiles/rails30.gemfile +2 -0
- data/gemfiles/rails31.gemfile +2 -0
- data/gemfiles/rails32.gemfile +2 -0
- data/gemfiles/rails40.gemfile +2 -0
- data/gemfiles/rails41.gemfile +2 -0
- data/gemfiles/rails42.gemfile +2 -0
- data/gemfiles/rails50.gemfile +2 -0
- data/gemfiles/rails51.gemfile +2 -0
- data/gemfiles/rails52.gemfile +2 -0
- data/gemfiles/ruby_1_8_and_1_9_2.gemfile +2 -0
- data/lib/generators/rollbar/rollbar_generator.rb +1 -1
- data/lib/rails/rollbar_runner.rb +1 -1
- data/lib/rollbar.rb +2 -3
- data/lib/rollbar/capistrano3.rb +6 -3
- data/lib/rollbar/capistrano_tasks.rb +13 -15
- data/lib/rollbar/configuration.rb +10 -8
- data/lib/rollbar/delay/girl_friday.rb +2 -2
- data/lib/rollbar/delay/resque.rb +4 -6
- data/lib/rollbar/delay/sidekiq.rb +6 -10
- data/lib/rollbar/delay/sucker_punch.rb +17 -19
- data/lib/rollbar/delay/thread.rb +2 -2
- data/lib/rollbar/deploy.rb +47 -30
- data/lib/rollbar/encoding/encoder.rb +9 -9
- data/lib/rollbar/item.rb +7 -7
- data/lib/rollbar/item/backtrace.rb +4 -4
- data/lib/rollbar/item/frame.rb +7 -1
- data/lib/rollbar/item/locals.rb +56 -0
- data/lib/rollbar/json.rb +5 -2
- data/lib/rollbar/json/default.rb +1 -1
- data/lib/rollbar/json/oj.rb +1 -1
- data/lib/rollbar/language_support.rb +1 -1
- data/lib/rollbar/lazy_store.rb +5 -5
- data/lib/rollbar/logger.rb +1 -0
- data/lib/rollbar/logger_proxy.rb +1 -1
- data/lib/rollbar/middleware/js.rb +15 -15
- data/lib/rollbar/middleware/rack.rb +4 -1
- data/lib/rollbar/middleware/rails/rollbar.rb +10 -1
- data/lib/rollbar/notifier.rb +40 -15
- data/lib/rollbar/notifier/trace_with_bindings.rb +65 -0
- data/lib/rollbar/plugin.rb +54 -6
- data/lib/rollbar/plugins.rb +7 -1
- 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 +2 -2
- 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/rake_tasks.rb +2 -2
- data/lib/rollbar/request_data_extractor.rb +21 -18
- data/lib/rollbar/scrubbers.rb +7 -3
- data/lib/rollbar/scrubbers/params.rb +17 -16
- data/lib/rollbar/scrubbers/url.rb +8 -3
- data/lib/rollbar/truncation.rb +1 -1
- data/lib/rollbar/truncation/strings_strategy.rb +1 -1
- data/lib/rollbar/util/ip_anonymizer.rb +8 -7
- data/lib/rollbar/util/ip_obfuscator.rb +1 -1
- data/lib/rollbar/version.rb +1 -1
- data/lib/tasks/benchmark.rake +103 -0
- data/rollbar.gemspec +13 -4
- metadata +12 -5
data/lib/rollbar/json/oj.rb
CHANGED
data/lib/rollbar/lazy_store.rb
CHANGED
@@ -21,11 +21,11 @@ module Rollbar
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def ==(other)
|
24
|
-
if other.is_a?(self.class)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
raw == if other.is_a?(self.class)
|
25
|
+
other.raw
|
26
|
+
else
|
27
|
+
other
|
28
|
+
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# With this version of clone we ensure that the loaded_data is empty
|
data/lib/rollbar/logger.rb
CHANGED
data/lib/rollbar/logger_proxy.rb
CHANGED
@@ -13,7 +13,7 @@ module Rollbar
|
|
13
13
|
attr_reader :app
|
14
14
|
attr_reader :config
|
15
15
|
|
16
|
-
JS_IS_INJECTED_KEY = 'rollbar.js_is_injected'
|
16
|
+
JS_IS_INJECTED_KEY = 'rollbar.js_is_injected'.freeze
|
17
17
|
SNIPPET = File.read(File.expand_path('../../../../data/rollbar.snippet.js', __FILE__))
|
18
18
|
|
19
19
|
def initialize(app, config)
|
@@ -29,7 +29,7 @@ module Rollbar
|
|
29
29
|
|
30
30
|
response_string = add_js(env, app_result[2])
|
31
31
|
build_response(env, app_result, response_string)
|
32
|
-
rescue => e
|
32
|
+
rescue StandardError => e
|
33
33
|
Rollbar.log_error("[Rollbar] Rollbar.js could not be added because #{e} exception")
|
34
34
|
|
35
35
|
app_result
|
@@ -71,7 +71,7 @@ module Rollbar
|
|
71
71
|
return nil unless insert_after_idx
|
72
72
|
|
73
73
|
build_body_with_js(env, body, insert_after_idx)
|
74
|
-
rescue => e
|
74
|
+
rescue StandardError => e
|
75
75
|
Rollbar.log_error("[Rollbar] Rollbar.js could not be added because #{e} exception")
|
76
76
|
nil
|
77
77
|
end
|
@@ -189,17 +189,17 @@ module Rollbar
|
|
189
189
|
|
190
190
|
secure_headers_cls = nil
|
191
191
|
|
192
|
-
if !::SecureHeaders
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
192
|
+
secure_headers_cls = if !::SecureHeaders.respond_to?(:content_security_policy_script_nonce)
|
193
|
+
SecureHeadersFalse
|
194
|
+
elsif config.respond_to?(:get)
|
195
|
+
SecureHeaders3To5
|
196
|
+
elsif config.dup.respond_to?(:csp)
|
197
|
+
SecureHeaders6
|
198
|
+
else
|
199
|
+
SecureHeadersFalse
|
200
|
+
end
|
201
|
+
|
202
|
+
secure_headers_cls.new
|
203
203
|
end
|
204
204
|
|
205
205
|
class SecureHeadersResolver
|
@@ -217,7 +217,7 @@ module Rollbar
|
|
217
217
|
!opt_out?(csp) && !unsafe_inline?(csp)
|
218
218
|
end
|
219
219
|
|
220
|
-
def opt_out?(
|
220
|
+
def opt_out?(_csp)
|
221
221
|
raise NotImplementedError
|
222
222
|
end
|
223
223
|
|
@@ -17,12 +17,15 @@ module Rollbar
|
|
17
17
|
|
18
18
|
Rollbar.scoped(fetch_scope(env)) do
|
19
19
|
begin
|
20
|
+
Rollbar.notifier.enable_locals
|
20
21
|
response = @app.call(env)
|
21
22
|
report_exception_to_rollbar(env, framework_error(env)) if framework_error(env)
|
22
23
|
response
|
23
24
|
rescue Exception => e
|
24
25
|
report_exception_to_rollbar(env, e)
|
25
26
|
raise
|
27
|
+
ensure
|
28
|
+
Rollbar.notifier.disable_locals
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
@@ -41,7 +44,7 @@ module Rollbar
|
|
41
44
|
proc { extract_person_data_from_controller(env) }
|
42
45
|
end
|
43
46
|
|
44
|
-
def framework_error(
|
47
|
+
def framework_error(_env)
|
45
48
|
nil
|
46
49
|
end
|
47
50
|
end
|
@@ -21,6 +21,7 @@ module Rollbar
|
|
21
21
|
|
22
22
|
Rollbar.scoped(scope) do
|
23
23
|
begin
|
24
|
+
Rollbar.notifier.enable_locals
|
24
25
|
response = @app.call(env)
|
25
26
|
|
26
27
|
if (framework_exception = env['action_dispatch.exception'])
|
@@ -31,6 +32,8 @@ module Rollbar
|
|
31
32
|
rescue Exception => exception
|
32
33
|
report_exception_to_rollbar(env, exception)
|
33
34
|
raise
|
35
|
+
ensure
|
36
|
+
Rollbar.notifier.disable_locals
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
@@ -62,7 +65,13 @@ module Rollbar
|
|
62
65
|
block = proc { extract_person_data_from_controller(env) }
|
63
66
|
return block unless defined?(ActiveRecord::Base) && ActiveRecord::Base.connected?
|
64
67
|
|
65
|
-
proc
|
68
|
+
proc do
|
69
|
+
begin
|
70
|
+
ActiveRecord::Base.connection_pool.with_connection(&block)
|
71
|
+
rescue ActiveRecord::ConnectionTimeoutError
|
72
|
+
{}
|
73
|
+
end
|
74
|
+
end
|
66
75
|
end
|
67
76
|
|
68
77
|
def context(request_data)
|
data/lib/rollbar/notifier.rb
CHANGED
@@ -8,6 +8,7 @@ require 'rollbar/delay/girl_friday'
|
|
8
8
|
require 'rollbar/delay/thread'
|
9
9
|
require 'rollbar/logger_proxy'
|
10
10
|
require 'rollbar/item'
|
11
|
+
require 'rollbar/notifier/trace_with_bindings'
|
11
12
|
require 'ostruct'
|
12
13
|
|
13
14
|
module Rollbar
|
@@ -95,7 +96,7 @@ module Rollbar
|
|
95
96
|
# @yield Block which exceptions won't be reported.
|
96
97
|
def silenced
|
97
98
|
yield
|
98
|
-
rescue => e
|
99
|
+
rescue StandardError => e
|
99
100
|
e.instance_variable_set(:@_rollbar_do_not_report, true)
|
100
101
|
raise
|
101
102
|
end
|
@@ -202,7 +203,7 @@ module Rollbar
|
|
202
203
|
else
|
203
204
|
send_item(item)
|
204
205
|
end
|
205
|
-
rescue => e
|
206
|
+
rescue StandardError => e
|
206
207
|
log_error("[Rollbar] Error processing the item: #{e.class}, #{e.message}. Item: #{item.payload.inspect}")
|
207
208
|
raise e
|
208
209
|
end
|
@@ -241,7 +242,7 @@ module Rollbar
|
|
241
242
|
Rollbar.silenced do
|
242
243
|
begin
|
243
244
|
process_item(item)
|
244
|
-
rescue => e
|
245
|
+
rescue StandardError => e
|
245
246
|
report_internal_error(e)
|
246
247
|
|
247
248
|
raise
|
@@ -287,7 +288,7 @@ module Rollbar
|
|
287
288
|
:configuration => configuration,
|
288
289
|
:logger => logger)
|
289
290
|
schedule_item(item)
|
290
|
-
rescue => e
|
291
|
+
rescue StandardError => e
|
291
292
|
log_error "[Rollbar] Error sending failsafe : #{e}"
|
292
293
|
end
|
293
294
|
|
@@ -295,7 +296,7 @@ module Rollbar
|
|
295
296
|
end
|
296
297
|
|
297
298
|
## Logging
|
298
|
-
%w
|
299
|
+
%w[debug info warn error].each do |level|
|
299
300
|
define_method(:"log_#{level}") do |message|
|
300
301
|
logger.send(level, message)
|
301
302
|
end
|
@@ -305,6 +306,30 @@ module Rollbar
|
|
305
306
|
@logger ||= LoggerProxy.new(configuration.logger)
|
306
307
|
end
|
307
308
|
|
309
|
+
def trace_with_bindings
|
310
|
+
@trace_with_bindings ||= TraceWithBindings.new
|
311
|
+
end
|
312
|
+
|
313
|
+
def exception_bindings
|
314
|
+
trace_with_bindings.exception_frames
|
315
|
+
end
|
316
|
+
|
317
|
+
def current_bindings
|
318
|
+
trace_with_bindings.frames
|
319
|
+
end
|
320
|
+
|
321
|
+
def enable_locals?
|
322
|
+
configuration.locals[:enabled] && [:app, :all].include?(configuration.send_extra_frame_data)
|
323
|
+
end
|
324
|
+
|
325
|
+
def enable_locals
|
326
|
+
trace_with_bindings.enable if enable_locals?
|
327
|
+
end
|
328
|
+
|
329
|
+
def disable_locals
|
330
|
+
trace_with_bindings.disable if enable_locals?
|
331
|
+
end
|
332
|
+
|
308
333
|
private
|
309
334
|
|
310
335
|
def use_exception_level_filters?(options)
|
@@ -331,7 +356,7 @@ module Rollbar
|
|
331
356
|
return 'ignored' if status == 'ignored'
|
332
357
|
rescue Rollbar::Ignore
|
333
358
|
raise
|
334
|
-
rescue => e
|
359
|
+
rescue StandardError => e
|
335
360
|
log_error("[Rollbar] Error calling the `before_process` hook: #{e}")
|
336
361
|
|
337
362
|
break
|
@@ -423,7 +448,7 @@ module Rollbar
|
|
423
448
|
|
424
449
|
begin
|
425
450
|
item = build_item('error', nil, exception, { :internal => true }, nil)
|
426
|
-
rescue => e
|
451
|
+
rescue StandardError => e
|
427
452
|
send_failsafe('build_item in exception_data', e)
|
428
453
|
log_error "[Rollbar] Exception: #{exception}"
|
429
454
|
return
|
@@ -431,7 +456,7 @@ module Rollbar
|
|
431
456
|
|
432
457
|
begin
|
433
458
|
process_item(item)
|
434
|
-
rescue => e
|
459
|
+
rescue StandardError => e
|
435
460
|
send_failsafe('error in process_item', e)
|
436
461
|
log_error "[Rollbar] Item: #{item}"
|
437
462
|
return
|
@@ -439,7 +464,7 @@ module Rollbar
|
|
439
464
|
|
440
465
|
begin
|
441
466
|
log_instance_link(item['data'])
|
442
|
-
rescue => e
|
467
|
+
rescue StandardError => e
|
443
468
|
send_failsafe('error logging instance link', e)
|
444
469
|
log_error "[Rollbar] Item: #{item}"
|
445
470
|
return
|
@@ -658,17 +683,17 @@ module Rollbar
|
|
658
683
|
|
659
684
|
exception_info = exception.class.name
|
660
685
|
# #to_s and #message defaults to class.to_s. Add message only if add valuable info.
|
661
|
-
exception_info += %
|
686
|
+
exception_info += %[: "#{exception.message}"] if exception.message != exception.class.to_s
|
662
687
|
exception_info += " in #{nearest_frame}" if nearest_frame
|
663
688
|
|
664
689
|
body += "#{exception_info}: #{message}"
|
665
|
-
rescue
|
690
|
+
rescue StandardError
|
666
691
|
log_error('[Rollbar] Error building failsafe exception message')
|
667
692
|
end
|
668
693
|
else
|
669
694
|
begin
|
670
695
|
body += message.to_s
|
671
|
-
rescue
|
696
|
+
rescue StandardError
|
672
697
|
log_error('[Rollbar] Error building failsafe message')
|
673
698
|
end
|
674
699
|
end
|
@@ -701,7 +726,7 @@ module Rollbar
|
|
701
726
|
def process_async_item(item)
|
702
727
|
configuration.async_handler ||= default_async_handler
|
703
728
|
configuration.async_handler.call(item.payload)
|
704
|
-
rescue
|
729
|
+
rescue StandardError
|
705
730
|
if configuration.failover_handlers.empty?
|
706
731
|
log_error '[Rollbar] Async handler failed, and there are no failover handlers configured. See the docs for "failover_handlers"'
|
707
732
|
return
|
@@ -718,7 +743,7 @@ module Rollbar
|
|
718
743
|
failover_handlers.each do |handler|
|
719
744
|
begin
|
720
745
|
handler.call(item.payload)
|
721
|
-
rescue
|
746
|
+
rescue StandardError
|
722
747
|
next unless handler == failover_handlers.last
|
723
748
|
|
724
749
|
log_error "[Rollbar] All failover handlers failed while processing item: #{Rollbar::JSON.dump(item.payload)}"
|
@@ -726,7 +751,7 @@ module Rollbar
|
|
726
751
|
end
|
727
752
|
end
|
728
753
|
|
729
|
-
|
754
|
+
alias log_warning log_warn
|
730
755
|
|
731
756
|
def log_instance_link(data)
|
732
757
|
return unless data[:uuid]
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Rollbar
|
2
|
+
class Notifier
|
3
|
+
class TraceWithBindings # :nodoc:
|
4
|
+
attr_reader :frames, :exception_frames
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
reset
|
8
|
+
end
|
9
|
+
|
10
|
+
def reset
|
11
|
+
@frames = []
|
12
|
+
@exception_frames = []
|
13
|
+
@exception_signature = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def enable
|
17
|
+
reset
|
18
|
+
trace_point.enable if defined?(TracePoint)
|
19
|
+
end
|
20
|
+
|
21
|
+
def disable
|
22
|
+
trace_point.disable if defined?(TracePoint)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def exception_signature(trace)
|
28
|
+
# use the exception backtrace to detect reraised exception.
|
29
|
+
trace.raised_exception.backtrace.first
|
30
|
+
end
|
31
|
+
|
32
|
+
def detect_reraise(trace)
|
33
|
+
@exception_signature == exception_signature(trace)
|
34
|
+
end
|
35
|
+
|
36
|
+
def trace_point
|
37
|
+
return unless defined?(TracePoint)
|
38
|
+
|
39
|
+
@trace_point ||= TracePoint.new(:call, :return, :b_call, :b_return, :c_call, :c_return, :raise) do |tp|
|
40
|
+
case tp.event
|
41
|
+
when :call, :b_call, :c_call, :class
|
42
|
+
frames.push frame(tp)
|
43
|
+
when :return, :b_return, :c_return, :end
|
44
|
+
frames.pop
|
45
|
+
when :raise
|
46
|
+
unless detect_reraise(tp) # ignore reraised exceptions
|
47
|
+
@exception_frames = @frames.dup # may be possible to optimize better than #dup
|
48
|
+
@exception_signature = exception_signature(tp)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def frame(trace)
|
55
|
+
{
|
56
|
+
:binding => trace.binding,
|
57
|
+
:defined_class => trace.defined_class,
|
58
|
+
:method_id => trace.method_id,
|
59
|
+
:path => trace.path,
|
60
|
+
:lineno => trace.lineno
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/rollbar/plugin.rb
CHANGED
@@ -7,6 +7,8 @@ module Rollbar
|
|
7
7
|
attr_reader :name
|
8
8
|
attr_reader :dependencies
|
9
9
|
attr_reader :callables
|
10
|
+
attr_reader :revert_callables
|
11
|
+
attr_accessor :on_demand
|
10
12
|
attr_accessor :loaded
|
11
13
|
|
12
14
|
private :loaded=
|
@@ -15,31 +17,73 @@ module Rollbar
|
|
15
17
|
@name = name
|
16
18
|
@dependencies = []
|
17
19
|
@callables = []
|
20
|
+
@revert_callables = []
|
18
21
|
@loaded = false
|
22
|
+
@on_demand = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_on_demand
|
26
|
+
@on_demand = true
|
19
27
|
end
|
20
28
|
|
21
29
|
def configuration
|
22
30
|
Rollbar.configuration
|
23
31
|
end
|
24
32
|
|
33
|
+
def load_scoped!(transparent = false)
|
34
|
+
if transparent
|
35
|
+
load! if load?
|
36
|
+
|
37
|
+
result = yield
|
38
|
+
|
39
|
+
unload! if loaded
|
40
|
+
else
|
41
|
+
return unless load?
|
42
|
+
|
43
|
+
load!
|
44
|
+
|
45
|
+
result = yield
|
46
|
+
|
47
|
+
unload!
|
48
|
+
end
|
49
|
+
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
25
53
|
def load!
|
26
54
|
return unless load?
|
27
55
|
|
28
56
|
begin
|
29
57
|
callables.each(&:call)
|
30
|
-
rescue => e
|
58
|
+
rescue StandardError => e
|
31
59
|
log_loading_error(e)
|
32
60
|
ensure
|
33
61
|
self.loaded = true
|
34
62
|
end
|
35
63
|
end
|
36
64
|
|
65
|
+
def unload!
|
66
|
+
return unless loaded
|
67
|
+
|
68
|
+
begin
|
69
|
+
revert_callables.each(&:call)
|
70
|
+
rescue StandardError => e
|
71
|
+
log_unloading_error(e)
|
72
|
+
ensure
|
73
|
+
self.loaded = false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
37
77
|
def execute(&block)
|
38
78
|
callables << block
|
39
79
|
end
|
40
80
|
|
41
|
-
def execute!
|
42
|
-
|
81
|
+
def execute!
|
82
|
+
yield if load?
|
83
|
+
end
|
84
|
+
|
85
|
+
def revert(&block)
|
86
|
+
revert_callables << block
|
43
87
|
end
|
44
88
|
|
45
89
|
private
|
@@ -61,7 +105,7 @@ module Rollbar
|
|
61
105
|
|
62
106
|
def load?
|
63
107
|
!loaded && dependencies_satisfy?
|
64
|
-
rescue => e
|
108
|
+
rescue StandardError => e
|
65
109
|
log_loading_error(e)
|
66
110
|
|
67
111
|
false
|
@@ -71,8 +115,12 @@ module Rollbar
|
|
71
115
|
dependencies.all?(&:call)
|
72
116
|
end
|
73
117
|
|
74
|
-
def log_loading_error(
|
75
|
-
Rollbar.log_error("Error trying to load plugin '#{name}': #{
|
118
|
+
def log_loading_error(error)
|
119
|
+
Rollbar.log_error("Error trying to load plugin '#{name}': #{error.class}, #{error.message}")
|
120
|
+
end
|
121
|
+
|
122
|
+
def log_unloading_error(error)
|
123
|
+
Rollbar.log_error("Error trying to unload plugin '#{name}': #{error.class}, #{error.message}")
|
76
124
|
end
|
77
125
|
end
|
78
126
|
end
|