rookout 0.1.36 → 0.1.39
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/lib/rookout/augs/actions/action_run_processor.rb +1 -0
- data/lib/rookout/augs/aug.rb +3 -5
- data/lib/rookout/augs/aug_factory.rb +40 -16
- data/lib/rookout/augs/aug_rate_limiter.rb +35 -36
- data/lib/rookout/augs/limits_manager.rb +31 -0
- data/lib/rookout/augs/locations/location_file_line.rb +5 -1
- data/lib/rookout/com_ws/agent_com_ws.rb +4 -3
- data/lib/rookout/com_ws/envelope_wrapper.rb +7 -5
- data/lib/rookout/com_ws/git.rb +1 -1
- data/lib/rookout/com_ws/information.rb +2 -1
- data/lib/rookout/com_ws/output.rb +13 -7
- data/lib/rookout/commit.rb +1 -1
- data/lib/rookout/config.rb +55 -17
- data/lib/rookout/exceptions.rb +12 -9
- data/lib/rookout/interface.rb +9 -8
- data/lib/rookout/logger.rb +13 -7
- data/lib/rookout/processor/namespace_serializer.rb +1 -1
- data/lib/rookout/processor/namespace_serializer2.rb +26 -12
- data/lib/rookout/processor/namespaces/container_namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/frame_namespace.rb +2 -3
- data/lib/rookout/processor/namespaces/namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/noop_namespace.rb +0 -4
- data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +31 -16
- data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +9 -7
- data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +0 -4
- data/lib/rookout/processor/namespaces/stack_namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/traceback_namespace.rb +4 -1
- data/lib/rookout/processor/operations/set_operation.rb +2 -0
- data/lib/rookout/processor/paths/arithmetic_path.rb +3 -1
- data/lib/rookout/processor/paths/canopy/actions.rb +5 -1
- data/lib/rookout/processor/paths/canopy/consts.rb +6 -4
- data/lib/rookout/processor/paths/canopy/markers.rb +15 -5
- data/lib/rookout/processor/processor_factory.rb +0 -2
- data/lib/rookout/processor/rook_error.rb +3 -1
- data/lib/rookout/rookout_singleton.rb +3 -2
- data/lib/rookout/sanitizer.rb +22 -0
- data/lib/rookout/services/position.rb +3 -2
- data/lib/rookout/services/tracer.rb +2 -2
- data/lib/rookout/utils.rb +7 -1
- data/lib/rookout/version.rb +1 -1
- data/lib/rookout.rb +4 -0
- metadata +41 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fb5d9fef64ead13081355d267ad49671d0ca9ddf3e916ab5cf556d6d3b5997be
|
|
4
|
+
data.tar.gz: e114be3eb5224761c01f5a64bd4f367a90effed5d130c61f90ab4a8328152928
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1da019cfc4c4cbeada393163a6fb4fa01826fdfe9d76edfd0926218b40d6dbedafb2291de4c63a558ac521bf6d360fee76a8522b2a10d021ce7d3538ce1ae530
|
|
7
|
+
data.tar.gz: 0a24f0bee3b44a23c9ad1ab7e1cdd6c6fc694e50358abd9d96b219ab3a5116c6567ebfd94a498de0de3cda523605fe2d0d27617d3aca7a9161689eeaa9132131
|
data/lib/rookout/augs/aug.rb
CHANGED
|
@@ -10,13 +10,11 @@ module Rookout
|
|
|
10
10
|
require_relative "../logger"
|
|
11
11
|
|
|
12
12
|
class Aug
|
|
13
|
-
def initialize aug_id, action, condition,
|
|
14
|
-
# NOTE: max_aux_time is not implemented
|
|
15
|
-
|
|
13
|
+
def initialize aug_id, action, condition, limits_manager, _max_aug_time
|
|
16
14
|
@id = aug_id
|
|
17
15
|
@action = action
|
|
18
16
|
@condition = condition
|
|
19
|
-
@
|
|
17
|
+
@limits_manager = limits_manager
|
|
20
18
|
|
|
21
19
|
@enabled = true
|
|
22
20
|
@status = nil
|
|
@@ -36,7 +34,7 @@ module Rookout
|
|
|
36
34
|
namespace = create_namespaces frame, extracted
|
|
37
35
|
return if @condition && !@condition.evaluate(namespace)
|
|
38
36
|
|
|
39
|
-
@
|
|
37
|
+
@limits_manager.with_limit do
|
|
40
38
|
report_id = Utils.uuid
|
|
41
39
|
Logger.instance.info "Executing aug-\t#{id} (msg ID #{report_id})"
|
|
42
40
|
@action.execute @id, report_id, namespace, output
|
|
@@ -10,7 +10,9 @@ module Rookout
|
|
|
10
10
|
require_relative "locations/location_exception_handler"
|
|
11
11
|
require_relative "aug_rate_limiter"
|
|
12
12
|
require_relative "aug"
|
|
13
|
+
require_relative "limits_manager"
|
|
13
14
|
require_relative "../utils"
|
|
15
|
+
require_relative "../logger"
|
|
14
16
|
|
|
15
17
|
class AugFactory
|
|
16
18
|
def initialize output
|
|
@@ -34,10 +36,10 @@ module Rookout
|
|
|
34
36
|
end
|
|
35
37
|
condition = condition_configuration.nil? ? nil : Conditions::Condition.new(condition_configuration)
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
limits_manager = create_limits_manager configuration
|
|
38
40
|
|
|
39
41
|
max_aug_time_ns = Utils.milliseconds_to_nanoseconds max_aug_time
|
|
40
|
-
aug = Aug.new aug_id, action, condition,
|
|
42
|
+
aug = Aug.new aug_id, action, condition, limits_manager, max_aug_time_ns
|
|
41
43
|
|
|
42
44
|
location_configuration = configuration["location"]
|
|
43
45
|
raise Exceptions::RookAugInvalidKey.new("location", configuration) unless location_configuration.is_a? Hash
|
|
@@ -52,9 +54,9 @@ module Rookout
|
|
|
52
54
|
|
|
53
55
|
case name
|
|
54
56
|
when "file_line"
|
|
55
|
-
|
|
57
|
+
Locations::LocationFileLine.new configuration, @output, aug
|
|
56
58
|
when "exception_handler"
|
|
57
|
-
|
|
59
|
+
Locations::LocationExceptionHandler.new configuration, @output, aug
|
|
58
60
|
when "log_handler"
|
|
59
61
|
raise Exceptions::RookUnsupportedLiveLogger
|
|
60
62
|
else
|
|
@@ -62,25 +64,47 @@ module Rookout
|
|
|
62
64
|
end
|
|
63
65
|
end
|
|
64
66
|
|
|
65
|
-
def
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
def create_limits_manager configuration
|
|
68
|
+
limiters = []
|
|
69
|
+
if global_rate_limiter.nil?
|
|
70
|
+
rate_limit = parse_rate_limit configuration["rateLimit"], configuration["rateLimitModifier"], 200, 5000
|
|
71
|
+
limiters.append AugRateLimiter.new(*rate_limit)
|
|
72
|
+
else
|
|
73
|
+
limiters.append global_rate_limiter
|
|
74
|
+
end
|
|
68
75
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
LimitsManager.new limiters
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def global_rate_limiter
|
|
80
|
+
if @global_rate_limiter.nil? && !Rookout::Config.global_rate_limit.nil?
|
|
81
|
+
rate_limit = parse_rate_limit Rookout::Config.global_rate_limit, "0", 0, 0
|
|
82
|
+
@global_rate_limiter = AugRateLimiter.new(*rate_limit)
|
|
83
|
+
Logger.instance.debug "Using global rate limiter with configuration: #{rate_limit}"
|
|
76
84
|
end
|
|
77
85
|
|
|
78
|
-
|
|
86
|
+
@global_rate_limiter
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def parse_rate_limit config, modifier_config, default_quota, default_window
|
|
90
|
+
window_quota = default_quota
|
|
91
|
+
window_size = default_window
|
|
92
|
+
|
|
93
|
+
unless config.nil? || config.empty?
|
|
94
|
+
rate_limit_split = config.split "/"
|
|
95
|
+
unless rate_limit_split.length == 2 && rate_limit_split[0].is_number? && rate_limit_split[1].is_number?
|
|
96
|
+
raise Exceptions::RookInvalidRateLimitConfiguration, config
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
window_quota = rate_limit_split[0].to_i
|
|
100
|
+
window_size = rate_limit_split[1].to_i
|
|
101
|
+
end
|
|
79
102
|
|
|
80
103
|
window_quota_ns = Utils.milliseconds_to_nanoseconds window_quota
|
|
81
104
|
window_size_ns = Utils.milliseconds_to_nanoseconds window_size
|
|
105
|
+
rate_limit_modifier = modifier_config.to_i || 5
|
|
82
106
|
|
|
83
|
-
|
|
107
|
+
[window_quota_ns, window_size_ns, rate_limit_modifier]
|
|
84
108
|
end
|
|
85
109
|
end
|
|
86
110
|
end
|
|
@@ -8,51 +8,50 @@ module Rookout
|
|
|
8
8
|
@quota = quota
|
|
9
9
|
@has_quota = !@quota.nil? && (@quota > 0)
|
|
10
10
|
@window_size = window_size
|
|
11
|
-
|
|
11
|
+
if active_limit > 0
|
|
12
|
+
@active_weight = quota / active_limit
|
|
13
|
+
else
|
|
14
|
+
@active_weight = 0
|
|
15
|
+
end
|
|
12
16
|
|
|
13
17
|
@mutex = Mutex.new
|
|
14
18
|
@active_count = 0
|
|
15
19
|
@windows = {}
|
|
16
20
|
end
|
|
17
21
|
|
|
18
|
-
def
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# If exceeding quota
|
|
38
|
-
if current_usage(now_ns, current_window_key, prev_window_key) > @quota
|
|
39
|
-
warning = Processor::RookError.new Exceptions::RookRuleRateLimited.new
|
|
40
|
-
UserWarnings.notify_warning warning
|
|
41
|
-
return
|
|
42
|
-
end
|
|
22
|
+
def before_run start_time
|
|
23
|
+
# If no quota, we can safely exit
|
|
24
|
+
unless @has_quota
|
|
25
|
+
return true
|
|
26
|
+
end
|
|
27
|
+
now_ns = Utils.time_to_nanoseconds start_time
|
|
28
|
+
current_window_key, prev_window_key = timestamp_to_window_keys now_ns
|
|
29
|
+
|
|
30
|
+
@mutex.synchronize do
|
|
31
|
+
# Clean old windows
|
|
32
|
+
cleanup now_ns
|
|
33
|
+
usage = current_usage now_ns, current_window_key, prev_window_key
|
|
34
|
+
@active_count += 1
|
|
35
|
+
|
|
36
|
+
# If exceeding quota
|
|
37
|
+
if usage > @quota
|
|
38
|
+
warning = Processor::RookError.new Exceptions::RookRuleRateLimited.new
|
|
39
|
+
UserWarnings.notify_warning warning
|
|
40
|
+
return false
|
|
43
41
|
end
|
|
42
|
+
|
|
43
|
+
return true
|
|
44
44
|
end
|
|
45
|
+
end
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
end
|
|
47
|
+
def after_run start_time
|
|
48
|
+
if @has_quota
|
|
49
|
+
now_ns = Utils.time_to_nanoseconds start_time
|
|
50
|
+
current_window_key, = timestamp_to_window_keys now_ns
|
|
51
|
+
@mutex.synchronize { record_usage current_window_key, Utils.time_to_nanoseconds(Time.now) - now_ns }
|
|
52
52
|
end
|
|
53
|
-
ensure
|
|
54
53
|
# Reduce active count
|
|
55
|
-
@mutex.synchronize { @active_count -= 1 }
|
|
54
|
+
@mutex.synchronize { @active_count -= 1 }
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
private
|
|
@@ -75,7 +74,7 @@ module Rookout
|
|
|
75
74
|
prev_window_usage = @windows[prev_window_key] || 0
|
|
76
75
|
|
|
77
76
|
# Previous window weight
|
|
78
|
-
prev_weight = 1 - (now_ns - current_window_key) / @window_size.to_f
|
|
77
|
+
prev_weight = 1 - ((now_ns - current_window_key) / @window_size.to_f)
|
|
79
78
|
|
|
80
79
|
# Final weighted usage
|
|
81
80
|
(prev_window_usage * prev_weight) + (@active_count * @active_weight) + current_window_usage
|
|
@@ -91,7 +90,7 @@ module Rookout
|
|
|
91
90
|
end
|
|
92
91
|
|
|
93
92
|
def cleanup now_ns
|
|
94
|
-
@windows.reject! { |key, _| key < (now_ns - @window_size * 5) } if @windows.length > 10
|
|
93
|
+
@windows.reject! { |key, _| key < (now_ns - (@window_size * 5)) } if @windows.length > 10
|
|
95
94
|
end
|
|
96
95
|
end
|
|
97
96
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Rookout
|
|
2
|
+
module Augs
|
|
3
|
+
class LimitsManager
|
|
4
|
+
def initialize limiters
|
|
5
|
+
@limiters = limiters
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def with_limit start_time = nil
|
|
9
|
+
start_time ||= Time.now
|
|
10
|
+
can_execute = true
|
|
11
|
+
after_execute = []
|
|
12
|
+
|
|
13
|
+
@limiters.each do |limiter|
|
|
14
|
+
if limiter.before_run start_time
|
|
15
|
+
after_execute.append -> { limiter.after_run start_time }
|
|
16
|
+
else
|
|
17
|
+
can_execute = false
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
if can_execute
|
|
22
|
+
yield
|
|
23
|
+
end
|
|
24
|
+
ensure
|
|
25
|
+
unless after_execute.nil?
|
|
26
|
+
after_execute.each(&:call)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -21,7 +21,11 @@ module Rookout
|
|
|
21
21
|
@line_unique = arguments["line_unique"] || false
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
attr_reader :filename
|
|
24
|
+
attr_reader :filename
|
|
25
|
+
attr_reader :lineno
|
|
26
|
+
attr_reader :file_hash
|
|
27
|
+
attr_reader :line_crc
|
|
28
|
+
attr_reader :line_unique
|
|
25
29
|
|
|
26
30
|
def add_aug trigger_services
|
|
27
31
|
trigger_services.get_service("position").add_aug self
|
|
@@ -118,7 +118,7 @@ module Rookout
|
|
|
118
118
|
|
|
119
119
|
if @print_on_initial_connection
|
|
120
120
|
@print_on_initial_connection = false
|
|
121
|
-
|
|
121
|
+
$stderr.puts "[Rookout] Successfully connected to controller"
|
|
122
122
|
end
|
|
123
123
|
Logger.instance.debug "WebSocket connected successfully"
|
|
124
124
|
Logger.instance.info "Finished initialization"
|
|
@@ -205,9 +205,10 @@ module Rookout
|
|
|
205
205
|
msg = envelope_wrapper.envelope
|
|
206
206
|
@pending_messages_length -= envelope_wrapper.calculate_size
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
case msg
|
|
209
|
+
when ExitMessage
|
|
209
210
|
break if msg.thread == Thread.current
|
|
210
|
-
|
|
211
|
+
when FlushMessage
|
|
211
212
|
msg.event.set
|
|
212
213
|
else
|
|
213
214
|
begin
|
|
@@ -8,8 +8,7 @@ class EnvelopeWrapperBase
|
|
|
8
8
|
timestamp = Google::Protobuf::Timestamp.new
|
|
9
9
|
timestamp.from_time Time.new
|
|
10
10
|
envelope = Com::Rookout::Envelope.new msg: any_message, timestamp: timestamp
|
|
11
|
-
|
|
12
|
-
serialized
|
|
11
|
+
Com::Rookout::Envelope.encode envelope
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
def envelope
|
|
@@ -23,11 +22,13 @@ end
|
|
|
23
22
|
|
|
24
23
|
class Variant2EnvelopeWrapper < EnvelopeWrapperBase
|
|
25
24
|
def initialize agent_id, aug_id, report_id, arguments
|
|
25
|
+
super()
|
|
26
|
+
|
|
26
27
|
@aug_report_message = Com::Rookout::AugReportMessage.new agent_id: agent_id,
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
aug_id: aug_id,
|
|
29
|
+
report_id: report_id
|
|
29
30
|
@serializer = Rookout::Processor::NamespaceSerializer2.new
|
|
30
|
-
@aug_report_message.arguments2 = @serializer.dump arguments
|
|
31
|
+
@aug_report_message.arguments2 = @serializer.dump arguments, true
|
|
31
32
|
@serializer.string_cache.each { |key, value| @aug_report_message.strings_cache[key] = value }
|
|
32
33
|
@envelope = wrap_in_envelope @aug_report_message
|
|
33
34
|
@aug_report_message = nil
|
|
@@ -44,6 +45,7 @@ end
|
|
|
44
45
|
|
|
45
46
|
class EnvelopeWrapper < EnvelopeWrapperBase
|
|
46
47
|
def initialize message
|
|
48
|
+
super()
|
|
47
49
|
@envelope = wrap_in_envelope message
|
|
48
50
|
end
|
|
49
51
|
|
data/lib/rookout/com_ws/git.rb
CHANGED
|
@@ -42,7 +42,8 @@ module Rookout
|
|
|
42
42
|
@closing = false
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
attr_accessor :agent_id
|
|
45
|
+
attr_accessor :agent_id
|
|
46
|
+
attr_accessor :agent_com
|
|
46
47
|
|
|
47
48
|
def close
|
|
48
49
|
@closing = true
|
|
@@ -86,13 +87,17 @@ module Rookout
|
|
|
86
87
|
if arguments.nil? || arguments.call_method("size", "") == 0
|
|
87
88
|
protobuf_arguments = nil
|
|
88
89
|
else
|
|
89
|
-
protobuf_arguments = Processor::NamespaceSerializer.dump arguments
|
|
90
|
+
protobuf_arguments = Processor::NamespaceSerializer.dump arguments, true
|
|
90
91
|
end
|
|
91
92
|
|
|
92
|
-
envelope_wrapper = EnvelopeWrapper.new(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
envelope_wrapper = EnvelopeWrapper.new(
|
|
94
|
+
Com::Rookout::AugReportMessage.new(
|
|
95
|
+
agent_id: @agent_id,
|
|
96
|
+
aug_id: aug_id,
|
|
97
|
+
report_id: report_id,
|
|
98
|
+
arguments: protobuf_arguments
|
|
99
|
+
)
|
|
100
|
+
)
|
|
96
101
|
end
|
|
97
102
|
|
|
98
103
|
@agent_com.add envelope_wrapper
|
|
@@ -123,7 +128,8 @@ module Rookout
|
|
|
123
128
|
protobuf_arguments = nil
|
|
124
129
|
else
|
|
125
130
|
protobuf_arguments = Processor::NamespaceSerializer.dump(
|
|
126
|
-
Processor::Namespaces::RubyObjectNamespace.new(arguments)
|
|
131
|
+
Processor::Namespaces::RubyObjectNamespace.new(arguments),
|
|
132
|
+
true
|
|
127
133
|
)
|
|
128
134
|
end
|
|
129
135
|
|
data/lib/rookout/commit.rb
CHANGED
data/lib/rookout/config.rb
CHANGED
|
@@ -6,21 +6,26 @@ module Rookout
|
|
|
6
6
|
# Magic to allow for module variables to be easily accessible
|
|
7
7
|
class << self
|
|
8
8
|
attr_accessor :debug
|
|
9
|
+
|
|
9
10
|
Rookout::Config.debug = false
|
|
10
11
|
|
|
11
|
-
attr_accessor :logger_filename
|
|
12
|
+
attr_accessor :logger_filename
|
|
13
|
+
attr_accessor :logger_log_to_stderr
|
|
14
|
+
attr_accessor :logger_log_level
|
|
15
|
+
|
|
12
16
|
Rookout::Config.logger_filename = "rookout/ruby-rook.log".freeze
|
|
13
17
|
Rookout::Config.logger_log_to_stderr = false
|
|
14
18
|
Rookout::Config.logger_log_level = :info
|
|
15
19
|
|
|
16
|
-
attr_accessor :agent_com_configuration_command_thread_name
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
attr_accessor :agent_com_configuration_command_thread_name
|
|
21
|
+
attr_accessor :agent_com_max_message_limit
|
|
22
|
+
attr_accessor :agent_com_max_queue_messages_length
|
|
23
|
+
attr_accessor :agent_com_timeout
|
|
24
|
+
attr_accessor :agent_com_ping_interval
|
|
25
|
+
attr_accessor :agent_com_ping_timeout
|
|
26
|
+
attr_accessor :agent_com_flush_timeout
|
|
27
|
+
attr_accessor :agent_com_max_queued_messages
|
|
28
|
+
|
|
24
29
|
Rookout::Config.agent_com_max_message_limit = 1024 * 1024
|
|
25
30
|
Rookout::Config.agent_com_max_queue_messages_length = 15 * 1024 * 1024
|
|
26
31
|
Rookout::Config.agent_com_timeout = 3
|
|
@@ -29,47 +34,80 @@ module Rookout
|
|
|
29
34
|
Rookout::Config.agent_com_flush_timeout = 3
|
|
30
35
|
Rookout::Config.agent_com_max_queued_messages = 100
|
|
31
36
|
|
|
32
|
-
attr_accessor :backoff_factor
|
|
37
|
+
attr_accessor :backoff_factor
|
|
38
|
+
attr_accessor :backoff_reset_time
|
|
39
|
+
attr_accessor :backoff_max_time
|
|
40
|
+
|
|
33
41
|
Rookout::Config.backoff_factor = 0.2
|
|
34
42
|
Rookout::Config.backoff_max_time = 60
|
|
35
43
|
Rookout::Config.backoff_reset_time = 3 * 60.0
|
|
36
44
|
|
|
37
|
-
attr_accessor :output_max_status_updates
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
attr_accessor :output_max_status_updates
|
|
46
|
+
attr_accessor :output_max_aug_messages
|
|
47
|
+
attr_accessor :output_max_log_items
|
|
48
|
+
attr_accessor :output_bucket_refresh_rate
|
|
49
|
+
|
|
41
50
|
Rookout::Config.output_max_status_updates = 200
|
|
42
51
|
Rookout::Config.output_max_aug_messages = 100
|
|
43
52
|
Rookout::Config.output_max_log_items = 200
|
|
44
53
|
Rookout::Config.output_bucket_refresh_rate = 10
|
|
45
54
|
|
|
46
55
|
attr_accessor :instrumentation_max_aug_time
|
|
56
|
+
|
|
47
57
|
Rookout::Config.instrumentation_max_aug_time = 400
|
|
48
58
|
|
|
49
|
-
attr_accessor :user_git_commit
|
|
59
|
+
attr_accessor :user_git_commit
|
|
60
|
+
attr_accessor :user_git_origin
|
|
61
|
+
|
|
50
62
|
Rookout::Config.user_git_commit = nil
|
|
51
63
|
Rookout::Config.user_git_origin = nil
|
|
52
64
|
|
|
53
|
-
attr_accessor :rookout_version
|
|
65
|
+
attr_accessor :rookout_version
|
|
66
|
+
attr_accessor :rookout_commit
|
|
67
|
+
|
|
54
68
|
Rookout::Config.rookout_version = Rookout::VERSION
|
|
55
69
|
Rookout::Config.rookout_commit = Rookout::COMMIT
|
|
56
70
|
|
|
57
71
|
attr_accessor :protobuf_version2
|
|
72
|
+
|
|
58
73
|
Rookout::Config.protobuf_version2 = false
|
|
59
74
|
|
|
60
75
|
attr_accessor :true_values
|
|
76
|
+
|
|
61
77
|
Rookout::Config.true_values = ["y", "Y", "yes", "Yes", "YES", "true", "True", "TRUE", "1"]
|
|
62
78
|
|
|
79
|
+
attr_accessor :global_rate_limit
|
|
80
|
+
|
|
81
|
+
Rookout::Config.global_rate_limit = nil
|
|
63
82
|
|
|
64
83
|
def update_config configuration
|
|
84
|
+
update_var2_config configuration
|
|
85
|
+
update_global_rate_limit_config configuration
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def update_var2_config configuration
|
|
65
89
|
is_config_proto2 = configuration["RUBY_PROTOBUF_VERSION_2"]
|
|
66
90
|
return if is_config_proto2.nil?
|
|
67
|
-
is_env_proto2 = ENV["
|
|
91
|
+
is_env_proto2 = ENV["ROOKOUT_Protobuf_Version2"]
|
|
68
92
|
if is_env_proto2.nil?
|
|
69
93
|
@protobuf_version2 = true if @true_values.include? is_config_proto2
|
|
70
94
|
elsif @true_values.include? is_env_proto2
|
|
95
|
+
Logger.instance.debug "ROOKOUT_Protobuf_Version2 env is preset: #{is_env_proto2}"
|
|
71
96
|
@protobuf_version2 = true
|
|
72
97
|
end
|
|
98
|
+
Logger.instance.info "Updating ROOKOUT_Protobuf_Version2 value to: #{@protobuf_version2}"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def update_global_rate_limit_config configuration
|
|
102
|
+
global_rate_limit = ENV["ROOKOUT_GLOBAL_RATE_LIMIT"]
|
|
103
|
+
if global_rate_limit.nil?
|
|
104
|
+
global_rate_limit = configuration["RUBY_GLOBAL_RATE_LIMIT"]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
return if global_rate_limit.nil?
|
|
108
|
+
|
|
109
|
+
@global_rate_limit = global_rate_limit
|
|
110
|
+
Logger.instance.info "Updating global rate limit to: #{global_rate_limit}"
|
|
73
111
|
end
|
|
74
112
|
end
|
|
75
113
|
end
|
data/lib/rookout/exceptions.rb
CHANGED
|
@@ -11,9 +11,6 @@ module Rookout
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
class RookInterfaceException < ToolException
|
|
14
|
-
def initialize message
|
|
15
|
-
super message
|
|
16
|
-
end
|
|
17
14
|
end
|
|
18
15
|
|
|
19
16
|
class RookVersionNotSupported < ToolException
|
|
@@ -92,8 +89,8 @@ module Rookout
|
|
|
92
89
|
class RookMessageSizeExceeded < ToolException
|
|
93
90
|
def initialize message_size, max_message_size
|
|
94
91
|
super "Message size of #{message_size} exceeds max size limit of #{max_message_size}. " \
|
|
95
|
-
|
|
96
|
-
|
|
92
|
+
"Change the depth of collection or change the default by setting ROOKOUT_MAX_MESSAGE_SIZE " \
|
|
93
|
+
"as environment variable or system property",
|
|
97
94
|
{ "message_size" => message_size, "max_message_size" => max_message_size }
|
|
98
95
|
end
|
|
99
96
|
end
|
|
@@ -101,7 +98,7 @@ module Rookout
|
|
|
101
98
|
class RookRuleRateLimited < ToolException
|
|
102
99
|
def initialize
|
|
103
100
|
super "Breakpoint was disabled due to rate-limiting. " \
|
|
104
|
-
|
|
101
|
+
"For more information: https://docs.rookout.com/docs/breakpoints-tasks.html#rate-limiting"
|
|
105
102
|
end
|
|
106
103
|
end
|
|
107
104
|
|
|
@@ -139,9 +136,6 @@ module Rookout
|
|
|
139
136
|
end
|
|
140
137
|
|
|
141
138
|
class RookInvalidOptions < ToolException
|
|
142
|
-
def initialize description
|
|
143
|
-
super description
|
|
144
|
-
end
|
|
145
139
|
end
|
|
146
140
|
|
|
147
141
|
class RookInvalidLabel < ToolException
|
|
@@ -220,6 +214,15 @@ module Rookout
|
|
|
220
214
|
end
|
|
221
215
|
end
|
|
222
216
|
|
|
217
|
+
class RookInvalidRateLimitConfiguration < ToolException
|
|
218
|
+
def initialize config
|
|
219
|
+
super "Invalid rate limit configuration: #{config}",
|
|
220
|
+
{
|
|
221
|
+
"rate_limit_config" => config
|
|
222
|
+
}
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
223
226
|
class RookUnsupportedLiveLogger < ToolException
|
|
224
227
|
def initialize
|
|
225
228
|
super "Live Logger is not supported. Try using Rookout Live Debugger instead."
|
data/lib/rookout/interface.rb
CHANGED
|
@@ -14,7 +14,7 @@ module Rookout
|
|
|
14
14
|
|
|
15
15
|
def print_debug_messages
|
|
16
16
|
puts "[Rookout] Running in debug mode"
|
|
17
|
-
puts "[Rookout] Rookout SDK for ruby:
|
|
17
|
+
puts "[Rookout] Rookout SDK for ruby: #{Config.rookout_version}"
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def start options = {}
|
|
@@ -36,16 +36,16 @@ module Rookout
|
|
|
36
36
|
rook.connect(**@start_options)
|
|
37
37
|
rescue LoadError
|
|
38
38
|
raise if throw_errors
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
$stderr.puts "[Rookout] Failed to load Rookout. Please make sure to force build native extensions by setting" \
|
|
40
|
+
"'bundle config force_ruby_platform true'"
|
|
41
41
|
rescue RookMissingToken, RookInvalidToken, RookInvalidOptions, RookVersionNotSupported, RookBadProtobuf => e
|
|
42
42
|
raise if throw_errors
|
|
43
|
-
|
|
43
|
+
$stderr.puts "[Rookout] Failed to start Rookout: #{e.message}"
|
|
44
44
|
rescue RookCommunicationException => e
|
|
45
45
|
raise if throw_errors
|
|
46
|
-
Logger.instance.warning "[Rookout]
|
|
46
|
+
Logger.instance.warning "[Rookout] #{e.message}"
|
|
47
47
|
rescue Exception => e
|
|
48
|
-
|
|
48
|
+
$stderr.puts e.full_message if Config.debug
|
|
49
49
|
raise if throw_errors
|
|
50
50
|
end
|
|
51
51
|
end
|
|
@@ -82,12 +82,13 @@ module Rookout
|
|
|
82
82
|
# Only test alpine
|
|
83
83
|
return unless File.exist? "/etc/alpine-release"
|
|
84
84
|
|
|
85
|
+
# Make sure protobuf is built from source
|
|
85
86
|
protobuf = Gem::Specification.find_by_path "google/protobuf"
|
|
86
|
-
|
|
87
|
+
$stderr.puts RookBadProtobuf.new.message if protobuf.nil?
|
|
87
88
|
return unless protobuf.platform != "ruby"
|
|
88
89
|
|
|
89
90
|
error = RookBadProtobufPlatform.new protobuf.platform
|
|
90
|
-
|
|
91
|
+
$stderr.puts error.message
|
|
91
92
|
end
|
|
92
93
|
|
|
93
94
|
def configure_globals options
|