rookout 0.1.28 → 0.1.50
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 +7 -6
- data/lib/rookout/augs/aug_factory.rb +71 -19
- data/lib/rookout/augs/aug_rate_limiter.rb +35 -36
- data/lib/rookout/augs/limits_manager.rb +32 -0
- data/lib/rookout/augs/locations/location.rb +1 -1
- data/lib/rookout/augs/locations/location_file_line.rb +5 -1
- data/lib/rookout/com_ws/agent_com_ws.rb +24 -20
- data/lib/rookout/com_ws/command_handler.rb +1 -1
- data/lib/rookout/com_ws/envelope_wrapper.rb +68 -0
- data/lib/rookout/com_ws/git.rb +1 -1
- data/lib/rookout/com_ws/information.rb +45 -1
- data/lib/rookout/com_ws/output.rb +62 -12
- data/lib/rookout/commit.rb +1 -1
- data/lib/rookout/config.rb +86 -15
- data/lib/rookout/exceptions.rb +49 -10
- data/lib/rookout/interface.rb +10 -8
- data/lib/rookout/logger.rb +13 -7
- data/lib/rookout/processor/namespace_serializer.rb +1 -1
- data/lib/rookout/processor/namespace_serializer2.rb +331 -0
- data/lib/rookout/processor/namespaces/container_namespace.rb +5 -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 +37 -22
- 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 +5 -0
- data/lib/rookout/processor/operations/set_operation.rb +2 -0
- data/lib/rookout/processor/paths/arithmetic_path.rb +4 -2
- 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/protobuf/controller_info_pb.rb +1 -0
- data/lib/rookout/protobuf/messages_pb.rb +54 -0
- data/lib/rookout/protobuf/variant2_pb.rb +42 -0
- data/lib/rookout/protobuf/variant_pb.rb +22 -0
- data/lib/rookout/rookout_singleton.rb +4 -3
- data/lib/rookout/sanitizer.rb +22 -0
- data/lib/rookout/services/position.rb +4 -3
- data/lib/rookout/services/tracer.rb +5 -2
- data/lib/rookout/utils.rb +28 -14
- data/lib/rookout/version.rb +1 -1
- data/lib/rookout.rb +4 -0
- metadata +46 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 72f208b3a47ef61e59b2123afe3e666a2f3efa8295ddec10950e221e5547770a
|
|
4
|
+
data.tar.gz: 216a478be4998de21db6b2df156123d6cde587a54369914d93ba2f3ef8f9b5a7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c9c2e1c91cba199a499fb360f519dcce9081f9c5693cf9919aaff369cd2389534900be7b580e03a3b9ef24e91394db0eec9d25e3968163de87a9390aec288392
|
|
7
|
+
data.tar.gz: 476c8d023ae8e04214693c3b929d0dae31bcf364cf23cc443bf3aab2c29bd05f08db4646a366cb54b4b5208d188df22024886bd35421849c73e331db720eb960
|
data/lib/rookout/augs/aug.rb
CHANGED
|
@@ -10,14 +10,13 @@ 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
|
|
|
19
|
+
@executed = false
|
|
21
20
|
@enabled = true
|
|
22
21
|
@status = nil
|
|
23
22
|
@log_cache = []
|
|
@@ -29,14 +28,16 @@ module Rookout
|
|
|
29
28
|
return unless @enabled
|
|
30
29
|
|
|
31
30
|
if output.user_messages_queue_full?
|
|
32
|
-
|
|
31
|
+
output.send_output_queue_full_warning @id
|
|
33
32
|
return
|
|
34
33
|
end
|
|
35
34
|
|
|
36
35
|
namespace = create_namespaces frame, extracted
|
|
37
36
|
return if @condition && !@condition.evaluate(namespace)
|
|
38
37
|
|
|
39
|
-
@
|
|
38
|
+
should_skip_limiters = @condition.nil? && !@executed
|
|
39
|
+
@limits_manager.with_limit should_skip_limiters do
|
|
40
|
+
@executed = true
|
|
40
41
|
report_id = Utils.uuid
|
|
41
42
|
Logger.instance.info "Executing aug-\t#{id} (msg ID #{report_id})"
|
|
42
43
|
@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
|
|
@@ -29,14 +31,15 @@ module Rookout
|
|
|
29
31
|
max_aug_time = configuration["maxAugTime"] || Config.instrumentation_max_aug_time
|
|
30
32
|
|
|
31
33
|
condition_configuration = configuration["conditional"]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
unless condition_configuration.nil? || condition_configuration.is_a?(String)
|
|
35
|
+
raise Exceptions::RookAugInvalidKey.new("conditional", configuration)
|
|
36
|
+
end
|
|
34
37
|
condition = condition_configuration.nil? ? nil : Conditions::Condition.new(condition_configuration)
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
limits_manager = create_limits_manager configuration
|
|
37
40
|
|
|
38
41
|
max_aug_time_ns = Utils.milliseconds_to_nanoseconds max_aug_time
|
|
39
|
-
aug = Aug.new aug_id, action, condition,
|
|
42
|
+
aug = Aug.new aug_id, action, condition, limits_manager, max_aug_time_ns
|
|
40
43
|
|
|
41
44
|
location_configuration = configuration["location"]
|
|
42
45
|
raise Exceptions::RookAugInvalidKey.new("location", configuration) unless location_configuration.is_a? Hash
|
|
@@ -47,37 +50,86 @@ module Rookout
|
|
|
47
50
|
|
|
48
51
|
def create_location configuration, aug
|
|
49
52
|
name = configuration["name"]
|
|
50
|
-
raise Exceptions::RookObjectNameMissing if name.nil?
|
|
53
|
+
raise Exceptions::RookObjectNameMissing, configuration if name.nil?
|
|
51
54
|
|
|
52
55
|
case name
|
|
53
56
|
when "file_line"
|
|
54
|
-
|
|
57
|
+
Locations::LocationFileLine.new configuration, @output, aug
|
|
55
58
|
when "exception_handler"
|
|
56
|
-
|
|
59
|
+
Locations::LocationExceptionHandler.new configuration, @output, aug
|
|
60
|
+
when "log_handler"
|
|
61
|
+
raise Exceptions::RookUnsupportedLiveLogger
|
|
57
62
|
else
|
|
58
|
-
raise Exceptions::RookUnsupportedLocation if name != "file_line"
|
|
63
|
+
raise Exceptions::RookUnsupportedLocation, configuration if name != "file_line"
|
|
59
64
|
end
|
|
60
65
|
end
|
|
61
66
|
|
|
62
|
-
def
|
|
63
|
-
|
|
64
|
-
|
|
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
|
+
unless rate_limit.nil?
|
|
72
|
+
limiters.append AugRateLimiter.new(*rate_limit)
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
limiters.append global_rate_limiter
|
|
76
|
+
end
|
|
65
77
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
LimitsManager.new limiters
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def global_rate_limiter
|
|
82
|
+
if @global_rate_limiter.nil? && Rookout::Config.global_rate_limit != ""
|
|
83
|
+
begin
|
|
84
|
+
rate_limit = parse_rate_limit Rookout::Config.global_rate_limit,
|
|
85
|
+
"0", 0, 0
|
|
86
|
+
if rate_limit.nil?
|
|
87
|
+
raise Exceptions::RookInvalidRateLimitConfiguration, Rookout::Config.global_rate_limit
|
|
88
|
+
end
|
|
89
|
+
rescue Exceptions::RookInvalidRateLimitConfiguration => e
|
|
90
|
+
Logger.instance.warning "Failed to create global rate limiter: #{e.message}"
|
|
91
|
+
err = Processor::RookError.new e
|
|
92
|
+
UserWarnings.notify_error err
|
|
93
|
+
return nil
|
|
72
94
|
end
|
|
95
|
+
|
|
96
|
+
@global_rate_limiter = AugRateLimiter.new(*rate_limit)
|
|
97
|
+
Logger.instance.debug "Using global rate limiter with configuration: #{rate_limit}"
|
|
98
|
+
Rookout::Config.using_global_rate_limiter = true
|
|
73
99
|
end
|
|
74
100
|
|
|
75
|
-
|
|
101
|
+
@global_rate_limiter
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def parse_rate_limit config, modifier_config, default_quota, default_window
|
|
105
|
+
window_quota = default_quota
|
|
106
|
+
window_size = default_window
|
|
107
|
+
|
|
108
|
+
unless config.nil? || config.empty?
|
|
109
|
+
rate_limit_split = config.split "/"
|
|
110
|
+
unless rate_limit_split.length == 2 && \
|
|
111
|
+
Utils.is_number?(rate_limit_split[0]) && \
|
|
112
|
+
Utils.is_number?(rate_limit_split[1])
|
|
113
|
+
raise Exceptions::RookInvalidRateLimitConfiguration, config
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
window_quota = rate_limit_split[0].to_i
|
|
117
|
+
window_size = rate_limit_split[1].to_i
|
|
118
|
+
end
|
|
76
119
|
|
|
77
120
|
window_quota_ns = Utils.milliseconds_to_nanoseconds window_quota
|
|
78
121
|
window_size_ns = Utils.milliseconds_to_nanoseconds window_size
|
|
122
|
+
rate_limit_modifier = modifier_config.to_i || 5
|
|
123
|
+
|
|
124
|
+
if window_quota_ns == 0
|
|
125
|
+
return nil
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
if window_quota_ns >= window_size_ns
|
|
129
|
+
raise Exceptions::RookInvalidRateLimitConfiguration, config
|
|
130
|
+
end
|
|
79
131
|
|
|
80
|
-
|
|
132
|
+
[window_quota_ns, window_size_ns, rate_limit_modifier]
|
|
81
133
|
end
|
|
82
134
|
end
|
|
83
135
|
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.create
|
|
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,32 @@
|
|
|
1
|
+
module Rookout
|
|
2
|
+
module Augs
|
|
3
|
+
class LimitsManager
|
|
4
|
+
def initialize limiters
|
|
5
|
+
@limiters = limiters
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def with_limit skip_limiters, start_time = nil
|
|
9
|
+
start_time ||= Time.now
|
|
10
|
+
can_execute = true
|
|
11
|
+
after_execute = []
|
|
12
|
+
|
|
13
|
+
@limiters.each do |limiter|
|
|
14
|
+
limiter_passed = limiter.before_run start_time
|
|
15
|
+
if limiter_passed || skip_limiters
|
|
16
|
+
after_execute.append -> { limiter.after_run start_time }
|
|
17
|
+
else
|
|
18
|
+
can_execute = false
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if can_execute
|
|
23
|
+
yield
|
|
24
|
+
end
|
|
25
|
+
ensure
|
|
26
|
+
unless after_execute.nil?
|
|
27
|
+
after_execute.each(&:call)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
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
|
|
@@ -26,8 +26,12 @@ module Rookout
|
|
|
26
26
|
attr_reader :pending_messages
|
|
27
27
|
|
|
28
28
|
def initialize output, agent_host, agent_port, proxy, token, labels, print_on_connect
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
if agent_host.nil? || agent_host.empty?
|
|
30
|
+
@uri = ""
|
|
31
|
+
else
|
|
32
|
+
agent_host_with_protocl = agent_host.include?("://") ? agent_host : "ws://#{agent_host}"
|
|
33
|
+
@uri = "#{agent_host_with_protocl}:#{agent_port}/v1"
|
|
34
|
+
end
|
|
31
35
|
if proxy.nil? || proxy.empty?
|
|
32
36
|
@proxy = nil
|
|
33
37
|
else
|
|
@@ -44,6 +48,7 @@ module Rookout
|
|
|
44
48
|
@main_thread = nil
|
|
45
49
|
@outgoing_thread = nil
|
|
46
50
|
@pending_messages = Queue.new
|
|
51
|
+
@pending_messages_length = 0
|
|
47
52
|
|
|
48
53
|
@running = false
|
|
49
54
|
@ready_event = Concurrent::Event.new
|
|
@@ -52,18 +57,15 @@ module Rookout
|
|
|
52
57
|
@print_on_initial_connection = print_on_connect
|
|
53
58
|
end
|
|
54
59
|
|
|
55
|
-
def add
|
|
56
|
-
|
|
57
|
-
if
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
UserWarnings.notify_warning warning
|
|
61
|
-
|
|
62
|
-
Logger.instance.warning "Dropping message, size was #{buffer.length} which is over the message size limit"
|
|
63
|
-
return
|
|
60
|
+
def add envelope_wrapper
|
|
61
|
+
msg_size = envelope_wrapper.calculate_size
|
|
62
|
+
if @pending_messages_length + msg_size > Config.agent_com_max_queue_messages_length ||
|
|
63
|
+
queue_full?
|
|
64
|
+
raise Exceptions::RookOutputQueueFull
|
|
64
65
|
end
|
|
65
66
|
|
|
66
|
-
@pending_messages.push
|
|
67
|
+
@pending_messages.push envelope_wrapper
|
|
68
|
+
@pending_messages_length += msg_size
|
|
67
69
|
end
|
|
68
70
|
|
|
69
71
|
def queue_full?
|
|
@@ -103,7 +105,6 @@ module Rookout
|
|
|
103
105
|
|
|
104
106
|
private
|
|
105
107
|
|
|
106
|
-
# rubocop:disable Style/StderrPuts
|
|
107
108
|
def connection_thread
|
|
108
109
|
backoff = Backoff.new
|
|
109
110
|
|
|
@@ -113,7 +114,8 @@ module Rookout
|
|
|
113
114
|
|
|
114
115
|
if @print_on_initial_connection
|
|
115
116
|
@print_on_initial_connection = false
|
|
116
|
-
|
|
117
|
+
Utils.quiet_puts "[Rookout] Successfully connected to controller."
|
|
118
|
+
Logger.instance.debug "[Rookout] Agent ID is #{@agent_id}"
|
|
117
119
|
end
|
|
118
120
|
Logger.instance.debug "WebSocket connected successfully"
|
|
119
121
|
Logger.instance.info "Finished initialization"
|
|
@@ -128,7 +130,7 @@ module Rookout
|
|
|
128
130
|
@ready_event.set
|
|
129
131
|
end
|
|
130
132
|
|
|
131
|
-
Logger.instance.
|
|
133
|
+
Logger.instance.warning "Connection failed; reason = #{e.message}"
|
|
132
134
|
end
|
|
133
135
|
|
|
134
136
|
backoff.after_disconnect
|
|
@@ -137,13 +139,11 @@ module Rookout
|
|
|
137
139
|
rescue Exception => e
|
|
138
140
|
Logger.instance.error "Unexpected error in connection_thread", e
|
|
139
141
|
end
|
|
140
|
-
# rubocop:enable Style/StderrPuts
|
|
141
142
|
|
|
142
143
|
def open_new_connection
|
|
143
144
|
client = WebsocketClient.new @uri, @proxy, @token
|
|
144
145
|
client.connect
|
|
145
146
|
|
|
146
|
-
Logger.instance.info "Registering agent with id #{@agent_id}"
|
|
147
147
|
msg = Com::Rookout::NewAgentMessage.new agent_info: @info.pack
|
|
148
148
|
client.send_frame wrap_in_envelope(msg)
|
|
149
149
|
|
|
@@ -191,15 +191,19 @@ module Rookout
|
|
|
191
191
|
def outgoing client, on_exit
|
|
192
192
|
Pinger.new(client, Config.agent_com_ping_interval, Config.agent_com_ping_timeout).repeat do
|
|
193
193
|
begin
|
|
194
|
-
|
|
194
|
+
envelope_wrapper = @pending_messages.pop true
|
|
195
195
|
rescue ThreadError
|
|
196
196
|
sleep 0.25
|
|
197
197
|
next
|
|
198
198
|
end
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
msg = envelope_wrapper.envelope
|
|
201
|
+
@pending_messages_length -= envelope_wrapper.calculate_size
|
|
202
|
+
|
|
203
|
+
case msg
|
|
204
|
+
when ExitMessage
|
|
201
205
|
break if msg.thread == Thread.current
|
|
202
|
-
|
|
206
|
+
when FlushMessage
|
|
203
207
|
msg.event.set
|
|
204
208
|
else
|
|
205
209
|
begin
|
|
@@ -5,10 +5,10 @@ module Rookout
|
|
|
5
5
|
class CommandHandler
|
|
6
6
|
def initialize agent_com, augs_manager
|
|
7
7
|
agent_com.on "Com::Rookout::InitialAugsCommand" do |initial_augs|
|
|
8
|
+
Config.update_config initial_augs.sdk_configuration
|
|
8
9
|
augs = initial_augs.augs.map { |aug_json| JSON.parse aug_json }
|
|
9
10
|
augs_manager.initialize_augs augs
|
|
10
11
|
end
|
|
11
|
-
|
|
12
12
|
agent_com.on "Com::Rookout::AddAugCommand" do |command|
|
|
13
13
|
augs_manager.add_aug JSON.parse(command.aug_json)
|
|
14
14
|
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require_relative "../protobuf/envelope_pb"
|
|
2
|
+
require_relative "../processor/namespace_serializer2"
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class EnvelopeWrapperBase
|
|
6
|
+
def wrap_in_envelope message
|
|
7
|
+
any_message = Google::Protobuf::Any.pack message
|
|
8
|
+
timestamp = Google::Protobuf::Timestamp.new
|
|
9
|
+
timestamp.from_time Time.new
|
|
10
|
+
envelope = Com::Rookout::Envelope.new msg: any_message, timestamp: timestamp
|
|
11
|
+
Com::Rookout::Envelope.encode envelope
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def envelope
|
|
15
|
+
raise NotImplementedError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def calculate_size
|
|
19
|
+
raise NotImplementedError
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class Variant2EnvelopeWrapper < EnvelopeWrapperBase
|
|
24
|
+
def initialize agent_id, aug_id, report_id, arguments
|
|
25
|
+
super()
|
|
26
|
+
|
|
27
|
+
@aug_report_message = Com::Rookout::AugReportMessage.new agent_id: agent_id,
|
|
28
|
+
aug_id: aug_id,
|
|
29
|
+
report_id: report_id
|
|
30
|
+
@serializer = Rookout::Processor::NamespaceSerializer2.new
|
|
31
|
+
@aug_report_message.arguments2 = @serializer.dump arguments, true
|
|
32
|
+
|
|
33
|
+
@estimated_length = @serializer.estimated_pending_bytes
|
|
34
|
+
@envelope = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def envelope
|
|
38
|
+
if @envelope.nil?
|
|
39
|
+
@serializer.string_cache.each do |key, value|
|
|
40
|
+
@aug_report_message.strings_cache[key.encode "UTF-8", invalid: :replace, undef: :replace, replace: "?"] = value
|
|
41
|
+
end
|
|
42
|
+
@envelope = wrap_in_envelope @aug_report_message
|
|
43
|
+
|
|
44
|
+
@serializer = nil
|
|
45
|
+
@aug_report_message = nil
|
|
46
|
+
end
|
|
47
|
+
@envelope
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def calculate_size
|
|
51
|
+
@estimated_length
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class EnvelopeWrapper < EnvelopeWrapperBase
|
|
56
|
+
def initialize message
|
|
57
|
+
super()
|
|
58
|
+
@envelope = wrap_in_envelope message
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def envelope
|
|
62
|
+
@envelope
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def calculate_size
|
|
66
|
+
@envelope.length
|
|
67
|
+
end
|
|
68
|
+
end
|
data/lib/rookout/com_ws/git.rb
CHANGED
|
@@ -21,6 +21,8 @@ module Rookout
|
|
|
21
21
|
@labels["k8s_namespace"] = k8_namespace
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
collect_serverless_labels
|
|
25
|
+
|
|
24
26
|
@ip_addr = local_ip
|
|
25
27
|
|
|
26
28
|
@scm_info = create_scm_information
|
|
@@ -54,7 +56,8 @@ module Rookout
|
|
|
54
56
|
scm: @scm_info
|
|
55
57
|
end
|
|
56
58
|
|
|
57
|
-
attr_accessor :agent_id
|
|
59
|
+
attr_accessor :agent_id
|
|
60
|
+
attr_accessor :labels
|
|
58
61
|
|
|
59
62
|
private
|
|
60
63
|
|
|
@@ -97,6 +100,47 @@ module Rookout
|
|
|
97
100
|
|
|
98
101
|
Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit
|
|
99
102
|
end
|
|
103
|
+
|
|
104
|
+
def aws_lambda?
|
|
105
|
+
!ENV["AWS_LAMBDA_FUNCTION_NAME"].nil?
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def google_cloud_function?
|
|
109
|
+
!ENV["FUNCTION_TARGET"].nil? && !ENV["FUNCTION_SIGNATURE_TYPE"].nil?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def cloud_run_or_fire_base?
|
|
113
|
+
!ENV["K_SERVICE"].nil? &&
|
|
114
|
+
!ENV["K_REVISION"].nil? &&
|
|
115
|
+
!ENV["K_CONFIGURATION"].nil? &&
|
|
116
|
+
!ENV["PORT"].nil?
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def azure_function?
|
|
120
|
+
!ENV["FUNCTIONS_WORKER_RUNTIME"].nil? && !ENV["WEBSITE_SITE_NAME"].nil?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def collect_serverless_labels
|
|
124
|
+
if aws_lambda?
|
|
125
|
+
@labels["function_name"] = ENV["AWS_LAMBDA_FUNCTION_NAME"]
|
|
126
|
+
@labels["aws_region"] = ENV["AWS_REGION"]
|
|
127
|
+
|
|
128
|
+
elsif google_cloud_function? || cloud_run_or_fire_base?
|
|
129
|
+
function_name = ENV["FUNCTION_NAME"]
|
|
130
|
+
if function_name.nil?
|
|
131
|
+
function_name = ENV["K_SERVICE"]
|
|
132
|
+
end
|
|
133
|
+
@labels["function_name"] = function_name
|
|
134
|
+
|
|
135
|
+
elsif azure_function?
|
|
136
|
+
@labels["function_name"] = ENV["WEBSITE_SITE_NAME"]
|
|
137
|
+
@labels["azure_region"] = ENV["REGION_NAME"]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
return unless @labels.key? "function_name"
|
|
141
|
+
|
|
142
|
+
@labels["rookout_serverless"] = "true"
|
|
143
|
+
end
|
|
100
144
|
end
|
|
101
145
|
end
|
|
102
146
|
end
|