rookout 0.1.0 → 0.1.56
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rookout/atfork.rb +73 -0
- data/lib/rookout/augs/actions/action_run_processor.rb +4 -3
- data/lib/rookout/augs/aug.rb +33 -91
- data/lib/rookout/augs/aug_factory.rb +94 -27
- data/lib/rookout/augs/aug_rate_limiter.rb +50 -47
- data/lib/rookout/augs/augs_manager.rb +3 -1
- data/lib/rookout/augs/conditions/condition.rb +4 -2
- data/lib/rookout/augs/limits_manager.rb +32 -0
- data/lib/rookout/augs/locations/location.rb +75 -1
- data/lib/rookout/augs/locations/location_exception_handler.rb +22 -0
- data/lib/rookout/augs/locations/location_file_line.rb +21 -5
- data/lib/rookout/com_ws/agent_com_ws.rb +97 -58
- data/lib/rookout/com_ws/backoff.rb +5 -10
- 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 +95 -4
- data/lib/rookout/com_ws/output.rb +69 -21
- data/lib/rookout/com_ws/pinger.rb +41 -0
- data/lib/rookout/com_ws/websocket_client.rb +173 -0
- data/lib/rookout/commit.rb +3 -0
- data/lib/rookout/config.rb +94 -18
- data/lib/rookout/exceptions.rb +147 -12
- data/lib/rookout/interface.rb +95 -32
- data/lib/rookout/logger.rb +39 -10
- data/lib/rookout/processor/namespace_serializer.rb +2 -2
- 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 +20 -17
- data/lib/rookout/processor/namespaces/namespace.rb +3 -2
- data/lib/rookout/processor/namespaces/noop_namespace.rb +4 -8
- data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +39 -22
- data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +15 -12
- data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +0 -4
- data/lib/rookout/processor/namespaces/stack_namespace.rb +6 -4
- data/lib/rookout/processor/namespaces/traceback_namespace.rb +13 -9
- data/lib/rookout/processor/operations/set_operation.rb +6 -1
- data/lib/rookout/processor/paths/arithmetic_path.rb +5 -3
- 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/maps.rb +286 -286
- data/lib/rookout/processor/paths/canopy/markers.rb +35 -4
- data/lib/rookout/processor/processor_factory.rb +0 -2
- data/lib/rookout/processor/rook_error.rb +6 -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 +23 -5
- data/lib/rookout/sanitizer.rb +22 -0
- data/lib/rookout/services/position.rb +92 -75
- data/lib/rookout/services/tracer.rb +30 -16
- data/lib/rookout/start.rb +12 -0
- data/lib/rookout/trigger_services.rb +2 -2
- data/lib/rookout/user_warnings.rb +2 -0
- data/lib/rookout/utils.rb +34 -0
- data/lib/rookout/version.rb +1 -2
- data/lib/rookout.rb +4 -0
- metadata +77 -51
@@ -1,10 +1,84 @@
|
|
1
1
|
module Rookout
|
2
2
|
module Augs
|
3
3
|
module Locations
|
4
|
+
require_relative "../../processor/rook_error"
|
5
|
+
|
6
|
+
MAX_LOG_CACHE_SIZE = 10
|
7
|
+
|
4
8
|
class Location
|
5
|
-
def
|
9
|
+
def initialize output, aug
|
10
|
+
@output = output
|
11
|
+
@aug = aug
|
12
|
+
@log_cache = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_aug _trigger_services
|
6
16
|
raise NotImplementedError
|
7
17
|
end
|
18
|
+
|
19
|
+
def id
|
20
|
+
@aug.id
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute frame_binding, stack_trace, extracted
|
24
|
+
UserWarnings.with self do
|
25
|
+
begin
|
26
|
+
@aug.execute frame_binding, stack_trace, extracted, @output
|
27
|
+
rescue SystemExit
|
28
|
+
raise
|
29
|
+
rescue Exception => e
|
30
|
+
message = "Exception while processing Aug"
|
31
|
+
error = Processor::RookError.new e, message
|
32
|
+
notify_warning error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def notify_active
|
38
|
+
send_rule_status :Active
|
39
|
+
end
|
40
|
+
|
41
|
+
def notify_pending
|
42
|
+
send_rule_status :Pending
|
43
|
+
end
|
44
|
+
|
45
|
+
def notify_removed
|
46
|
+
send_rule_status :Deleted
|
47
|
+
end
|
48
|
+
|
49
|
+
def notify_error error
|
50
|
+
send_rule_status :Error, error
|
51
|
+
end
|
52
|
+
|
53
|
+
def notify_warning error
|
54
|
+
return if silence_log? error
|
55
|
+
|
56
|
+
Logger.instance.warning error.message, error.exception
|
57
|
+
|
58
|
+
# For easier testing
|
59
|
+
return if @output.nil?
|
60
|
+
@output.send_rule_status id, :Warning, error
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def silence_log? error
|
66
|
+
return true if @log_cache.length >= MAX_LOG_CACHE_SIZE || @log_cache.include?(error.message)
|
67
|
+
|
68
|
+
@log_cache << error.message
|
69
|
+
false
|
70
|
+
end
|
71
|
+
|
72
|
+
def send_rule_status status, error = nil
|
73
|
+
return if @status == status
|
74
|
+
|
75
|
+
Logger.instance.info "Updating rule status for #{@id} to #{status}"
|
76
|
+
@status = status
|
77
|
+
|
78
|
+
# For easier testing
|
79
|
+
return if @output.nil?
|
80
|
+
@output.send_rule_status id, status, error
|
81
|
+
end
|
8
82
|
end
|
9
83
|
end
|
10
84
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Rookout
|
2
|
+
module Augs
|
3
|
+
require_relative "../../logger"
|
4
|
+
|
5
|
+
require_relative "../../processor/rook_error"
|
6
|
+
|
7
|
+
module Locations
|
8
|
+
require_relative "location"
|
9
|
+
|
10
|
+
class LocationExceptionHandler < Location
|
11
|
+
NAME = "exception_handler".freeze
|
12
|
+
|
13
|
+
def initialize _arguments, output, aug
|
14
|
+
super output, aug
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_aug _trigger_services
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,24 +1,40 @@
|
|
1
1
|
module Rookout
|
2
2
|
module Augs
|
3
|
+
require_relative "../../logger"
|
4
|
+
|
5
|
+
require_relative "../../processor/rook_error"
|
6
|
+
|
3
7
|
module Locations
|
4
8
|
require_relative "location"
|
5
9
|
|
6
10
|
class LocationFileLine < Location
|
7
11
|
NAME = "file_line".freeze
|
8
12
|
|
9
|
-
def initialize arguments,
|
13
|
+
def initialize arguments, output, aug
|
14
|
+
super output, aug
|
10
15
|
@filename = arguments["filename"]
|
11
16
|
@lineno = arguments["lineno"]
|
12
17
|
|
18
|
+
# NOTE: Hashes are only used for suggestions, not for verification
|
13
19
|
@file_hash = arguments["sha256"]
|
14
20
|
@line_crc = arguments["line_crc32_2"]
|
15
|
-
@line_unique = arguments["line_unique"]
|
21
|
+
@line_unique = arguments["line_unique"] || false
|
16
22
|
end
|
17
23
|
|
18
|
-
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
|
19
29
|
|
20
|
-
def add_aug trigger_services
|
21
|
-
trigger_services.get_service("position").add_aug self
|
30
|
+
def add_aug trigger_services
|
31
|
+
trigger_services.get_service("position").add_aug self
|
32
|
+
rescue SystemExit
|
33
|
+
raise
|
34
|
+
rescue Exception => e
|
35
|
+
message = "Exception when adding aug"
|
36
|
+
Logger.instance.error message, e
|
37
|
+
notify_error Processor::RookError.new e, message
|
22
38
|
end
|
23
39
|
end
|
24
40
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module Rookout
|
2
2
|
module ComWs
|
3
|
-
require "securerandom"
|
4
|
-
require "kontena-websocket-client"
|
5
3
|
require "event_emitter"
|
6
4
|
require "google/protobuf/well_known_types"
|
7
5
|
require "concurrent"
|
@@ -10,21 +8,30 @@ module Rookout
|
|
10
8
|
require_relative "../logger"
|
11
9
|
require_relative "../user_warnings"
|
12
10
|
require_relative "../exceptions"
|
11
|
+
require_relative "../utils"
|
13
12
|
|
14
13
|
require_relative "../processor/rook_error"
|
15
14
|
|
16
15
|
require_relative "../protobuf/messages_pb"
|
17
16
|
require_relative "../protobuf/envelope_pb"
|
18
17
|
|
18
|
+
require_relative "websocket_client"
|
19
19
|
require_relative "backoff"
|
20
20
|
require_relative "information"
|
21
|
+
require_relative "pinger"
|
21
22
|
|
22
23
|
class AgentComWs
|
23
24
|
include EventEmitter
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
attr_reader :pending_messages
|
27
|
+
|
28
|
+
def initialize output, agent_host, agent_port, proxy, token, labels, print_on_connect
|
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
|
28
35
|
if proxy.nil? || proxy.empty?
|
29
36
|
@proxy = nil
|
30
37
|
else
|
@@ -38,37 +45,55 @@ module Rookout
|
|
38
45
|
@info = Information.new labels
|
39
46
|
reset_id
|
40
47
|
|
41
|
-
@
|
48
|
+
@main_thread = nil
|
49
|
+
@outgoing_thread = nil
|
42
50
|
@pending_messages = Queue.new
|
51
|
+
@pending_messages_length = 0
|
43
52
|
|
44
53
|
@running = false
|
45
54
|
@ready_event = Concurrent::Event.new
|
46
55
|
once("Com::Rookout::InitialAugsCommand") { @ready_event.set }
|
47
|
-
end
|
48
56
|
|
49
|
-
|
50
|
-
|
51
|
-
if buffer.length > Config.agent_com_max_message_limit
|
52
|
-
exc = Exceptions::RookMessageSizeExceeded.new buffer.length, Coonfig.agent_com_max_message_limit
|
53
|
-
warning = RookError.new exc, message
|
54
|
-
UserWarnings.notify_warning warning
|
57
|
+
@print_on_initial_connection = print_on_connect
|
58
|
+
end
|
55
59
|
|
56
|
-
|
57
|
-
|
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
|
58
65
|
end
|
59
66
|
|
60
|
-
@pending_messages.push
|
67
|
+
@pending_messages.push envelope_wrapper
|
68
|
+
@pending_messages_length += msg_size
|
69
|
+
end
|
70
|
+
|
71
|
+
def queue_full?
|
72
|
+
@pending_messages.length >= Config.agent_com_max_queued_messages
|
61
73
|
end
|
62
74
|
|
63
75
|
def connect
|
64
76
|
@running = true
|
65
77
|
|
66
|
-
@
|
67
|
-
@
|
78
|
+
@main_thread = Thread.new { connection_thread }
|
79
|
+
@main_thread.name = "rookout-connection-thread"
|
80
|
+
end
|
81
|
+
|
82
|
+
def stop
|
83
|
+
@running = false
|
84
|
+
|
85
|
+
# Ask outgoing thread to exit (if running)
|
86
|
+
@pending_messages << ExitMessage.new(@outgoing_thread)
|
87
|
+
|
88
|
+
@main_thread.join
|
68
89
|
end
|
69
90
|
|
70
91
|
def wait_for_ready
|
71
|
-
@ready_event.wait Config.agent_com_timeout
|
92
|
+
is_finished = @ready_event.wait Config.agent_com_timeout
|
93
|
+
# We didn't finish - will keep trying in the background
|
94
|
+
raise Exceptions::RookCommunicationException unless is_finished
|
95
|
+
|
96
|
+
# We finished - raise if we failed
|
72
97
|
raise @connection_error if @connection_error
|
73
98
|
end
|
74
99
|
|
@@ -85,50 +110,49 @@ module Rookout
|
|
85
110
|
|
86
111
|
while @running
|
87
112
|
begin
|
88
|
-
|
89
|
-
Kontena::Websocket::Client.connect(@uri, **create_options) do |client|
|
90
|
-
register client
|
113
|
+
client = open_new_connection
|
91
114
|
|
92
|
-
|
93
|
-
@
|
94
|
-
|
95
|
-
|
96
|
-
connection_pump client
|
115
|
+
if @print_on_initial_connection
|
116
|
+
@print_on_initial_connection = false
|
117
|
+
Utils.quiet_puts "[Rookout] Successfully connected to controller."
|
118
|
+
Logger.instance.debug "[Rookout] Agent ID is #{@agent_id}"
|
97
119
|
end
|
120
|
+
Logger.instance.debug "WebSocket connected successfully"
|
121
|
+
Logger.instance.info "Finished initialization"
|
122
|
+
|
123
|
+
@token_valid = true
|
124
|
+
backoff.after_connect
|
125
|
+
|
126
|
+
connection_pump client
|
98
127
|
rescue Exception => e
|
99
|
-
if !@token_valid && e.
|
128
|
+
if !@token_valid && e.message.include?("403")
|
100
129
|
@connection_error = Exceptions::RookInvalidToken.new @token
|
101
130
|
@ready_event.set
|
102
131
|
end
|
103
132
|
|
104
|
-
|
133
|
+
if e.message.include? "400"
|
134
|
+
@connection_error = Exceptions::RookWebSocketError.new 400
|
135
|
+
@ready_event.set
|
136
|
+
end
|
137
|
+
|
138
|
+
Logger.instance.warning "Connection failed; reason = #{e.message}"
|
105
139
|
end
|
106
140
|
|
107
141
|
backoff.after_disconnect
|
108
142
|
Logger.instance.debug "Reconnecting"
|
109
143
|
end
|
144
|
+
rescue Exception => e
|
145
|
+
Logger.instance.error "Unexpected error in connection_thread", e
|
110
146
|
end
|
111
147
|
|
112
|
-
def
|
113
|
-
|
114
|
-
|
115
|
-
}
|
116
|
-
|
117
|
-
headers["X-Rookout-Token"] = @token unless @token.nil?
|
118
|
-
|
119
|
-
# NOTE: WE DONT HAVE PROXY SUPPORT (YET) - THIS WILL PROBABLY REQUIRE FORKING KONTENA
|
120
|
-
{ headers: headers,
|
121
|
-
connect_timeout: Config.agent_com_timeout,
|
122
|
-
open_timeout: Config.agent_com_timeout,
|
123
|
-
ping_interval: Config.agent_com_ping_interval,
|
124
|
-
ping_timeout: Config.agent_com_ping_timeout }
|
125
|
-
end
|
126
|
-
|
127
|
-
def register client
|
128
|
-
Logger.instance.info "Registering agent with id #{@agent_id}"
|
148
|
+
def open_new_connection
|
149
|
+
client = WebsocketClient.new @uri, @proxy, @token
|
150
|
+
client.connect
|
129
151
|
|
130
152
|
msg = Com::Rookout::NewAgentMessage.new agent_info: @info.pack
|
131
|
-
client.
|
153
|
+
client.send_frame wrap_in_envelope(msg)
|
154
|
+
|
155
|
+
client
|
132
156
|
end
|
133
157
|
|
134
158
|
ACCEPTED_MESSAGE_TYPES = [
|
@@ -140,11 +164,18 @@ module Rookout
|
|
140
164
|
].freeze
|
141
165
|
|
142
166
|
def connection_pump client
|
143
|
-
on_outgoing_exit = proc {
|
144
|
-
|
145
|
-
|
167
|
+
on_outgoing_exit = proc {
|
168
|
+
begin
|
169
|
+
client.close
|
170
|
+
rescue Exception => e
|
171
|
+
Logger.instance.error "Unexpected error exiting outgoing thread", e
|
172
|
+
end
|
173
|
+
}
|
174
|
+
|
175
|
+
@outgoing_thread = Thread.new { outgoing client, on_outgoing_exit }
|
176
|
+
@outgoing_thread.name = "rookout-outgoing-thread"
|
146
177
|
|
147
|
-
|
178
|
+
message_handler = proc do |raw_message|
|
148
179
|
envelope = Com::Rookout::Envelope.decode raw_message.pack("c*")
|
149
180
|
|
150
181
|
ACCEPTED_MESSAGE_TYPES.each do |klass|
|
@@ -153,28 +184,35 @@ module Rookout
|
|
153
184
|
end
|
154
185
|
end
|
155
186
|
|
187
|
+
client.connection_pump message_handler
|
188
|
+
|
156
189
|
Logger.instance.debug "Incoming loop - socket disconnected"
|
157
190
|
|
158
191
|
@pending_messages.push ExitMessage.new(send_thread)
|
159
|
-
|
192
|
+
@outgoing_thread.join
|
193
|
+
@outgoing_thread = nil
|
160
194
|
end
|
161
195
|
|
162
196
|
def outgoing client, on_exit
|
163
|
-
|
197
|
+
Pinger.new(client, Config.agent_com_ping_interval, Config.agent_com_ping_timeout).repeat do
|
164
198
|
begin
|
165
|
-
|
199
|
+
envelope_wrapper = @pending_messages.pop true
|
166
200
|
rescue ThreadError
|
167
201
|
sleep 0.25
|
168
202
|
next
|
169
203
|
end
|
170
204
|
|
171
|
-
|
205
|
+
msg = envelope_wrapper.envelope
|
206
|
+
@pending_messages_length -= envelope_wrapper.calculate_size
|
207
|
+
|
208
|
+
case msg
|
209
|
+
when ExitMessage
|
172
210
|
break if msg.thread == Thread.current
|
173
|
-
|
211
|
+
when FlushMessage
|
174
212
|
msg.event.set
|
175
213
|
else
|
176
214
|
begin
|
177
|
-
client.
|
215
|
+
client.send_frame msg
|
178
216
|
rescue RuntimeError
|
179
217
|
@queue << msg
|
180
218
|
break
|
@@ -184,6 +222,7 @@ module Rookout
|
|
184
222
|
rescue Exception => e
|
185
223
|
Logger.instance.exception "Outgoing thread failed", e
|
186
224
|
ensure
|
225
|
+
Logger.instance.debug "Outgoing thread exiting"
|
187
226
|
on_exit.call
|
188
227
|
end
|
189
228
|
|
@@ -196,7 +235,7 @@ module Rookout
|
|
196
235
|
end
|
197
236
|
|
198
237
|
def reset_id
|
199
|
-
@agent_id =
|
238
|
+
@agent_id = Utils.uuid
|
200
239
|
@output.agent_id = @agent_id
|
201
240
|
@info.agent_id = @agent_id
|
202
241
|
end
|
@@ -4,25 +4,20 @@ module Rookout
|
|
4
4
|
|
5
5
|
class Backoff
|
6
6
|
def initialize
|
7
|
-
@
|
8
|
-
@last_successful_connection = Time.mktime 1970
|
9
|
-
reset_backoff
|
10
|
-
end
|
11
|
-
|
12
|
-
def before_connection_attempt
|
13
|
-
return unless Time.new > @last_successful_connection + Config.backoff_reset_time
|
7
|
+
@connect_time = nil
|
14
8
|
reset_backoff
|
15
9
|
end
|
16
10
|
|
17
11
|
def after_disconnect
|
18
|
-
@
|
12
|
+
reset_backoff if @connect_time && Time.new > @connect_time + Config.backoff_reset_time
|
13
|
+
@connect_time = nil
|
14
|
+
|
19
15
|
sleep @next_backoff
|
20
16
|
@next_backoff = [@next_backoff * 2, Config.backoff_max_time].min
|
21
17
|
end
|
22
18
|
|
23
19
|
def after_connect
|
24
|
-
@
|
25
|
-
@last_successful_connection = Time.now
|
20
|
+
@connect_time = Time.now
|
26
21
|
end
|
27
22
|
|
28
23
|
private
|
@@ -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
@@ -11,10 +11,17 @@ module Rookout
|
|
11
11
|
require_relative "git"
|
12
12
|
include Git
|
13
13
|
|
14
|
-
def initialize labels
|
14
|
+
def initialize labels, k8s_file_path = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
|
15
15
|
@agent_id = nil
|
16
16
|
@labels = labels.clone
|
17
|
-
@labels["rookout_debug"] = "on"
|
17
|
+
@labels["rookout_debug"] = "on" if Config.debug
|
18
|
+
|
19
|
+
k8_namespace = create_cluster_namespace k8s_file_path
|
20
|
+
unless k8_namespace == "" || @labels.key?("k8s_namespace")
|
21
|
+
@labels["k8s_namespace"] = k8_namespace
|
22
|
+
end
|
23
|
+
|
24
|
+
collect_serverless_labels
|
18
25
|
|
19
26
|
@ip_addr = local_ip
|
20
27
|
|
@@ -50,6 +57,7 @@ module Rookout
|
|
50
57
|
end
|
51
58
|
|
52
59
|
attr_accessor :agent_id
|
60
|
+
attr_accessor :labels
|
53
61
|
|
54
62
|
private
|
55
63
|
|
@@ -65,10 +73,52 @@ module Rookout
|
|
65
73
|
end
|
66
74
|
# rubocop:enable Style/ParallelAssignment
|
67
75
|
|
76
|
+
def create_cluster_namespace k8s_file_path
|
77
|
+
return_value = ""
|
78
|
+
|
79
|
+
# No Kubernetes is valid
|
80
|
+
if File.file? k8s_file_path
|
81
|
+
# Read the file contents and return it as result
|
82
|
+
return_value = File.read k8s_file_path
|
83
|
+
end
|
84
|
+
|
85
|
+
return_value
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse_raw_git_sources
|
89
|
+
git_sources_raw = ENV["ROOKOUT_SOURCES"]
|
90
|
+
if git_sources_raw.nil?
|
91
|
+
return nil
|
92
|
+
end
|
93
|
+
|
94
|
+
git_sources = git_sources_raw.split ";"
|
95
|
+
user_git_sources = {}
|
96
|
+
git_sources.each do |url|
|
97
|
+
url_parts = url.split "#"
|
98
|
+
if url_parts.length != 2
|
99
|
+
next
|
100
|
+
end
|
101
|
+
|
102
|
+
remote_url = url_parts[0]
|
103
|
+
commit = url_parts[1]
|
104
|
+
user_git_sources[remote_url] = commit
|
105
|
+
end
|
106
|
+
|
107
|
+
user_git_sources
|
108
|
+
end
|
109
|
+
|
68
110
|
def create_scm_information
|
69
|
-
user_git_origin = Config.user_git_origin || ENV["
|
111
|
+
user_git_origin = Config.user_git_origin || ENV["ROOKOUT_REMOTE_ORIGIN"]
|
70
112
|
user_git_commit = Config.user_git_commit || ENV["ROOKOUT_COMMIT"]
|
71
113
|
|
114
|
+
user_git_sources = Config.user_git_sources || parse_raw_git_sources
|
115
|
+
|
116
|
+
if !user_git_sources.nil? && !user_git_sources.empty?
|
117
|
+
user_git_sources = user_git_sources.map do |remote_url, commit|
|
118
|
+
Com::Rookout::SCMInformation::SourceInfo.new remoteOriginUrl: remote_url, commit: commit
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
72
122
|
if user_git_origin.nil? && user_git_commit.nil?
|
73
123
|
search_path = File.dirname File.absolute_path($PROGRAM_NAME)
|
74
124
|
git_root = find_root search_path
|
@@ -78,7 +128,48 @@ module Rookout
|
|
78
128
|
end
|
79
129
|
end
|
80
130
|
|
81
|
-
Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit
|
131
|
+
Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit, sources: user_git_sources
|
132
|
+
end
|
133
|
+
|
134
|
+
def aws_lambda?
|
135
|
+
!ENV["AWS_LAMBDA_FUNCTION_NAME"].nil?
|
136
|
+
end
|
137
|
+
|
138
|
+
def google_cloud_function?
|
139
|
+
!ENV["FUNCTION_TARGET"].nil? && !ENV["FUNCTION_SIGNATURE_TYPE"].nil?
|
140
|
+
end
|
141
|
+
|
142
|
+
def cloud_run_or_fire_base?
|
143
|
+
!ENV["K_SERVICE"].nil? &&
|
144
|
+
!ENV["K_REVISION"].nil? &&
|
145
|
+
!ENV["K_CONFIGURATION"].nil? &&
|
146
|
+
!ENV["PORT"].nil?
|
147
|
+
end
|
148
|
+
|
149
|
+
def azure_function?
|
150
|
+
!ENV["FUNCTIONS_WORKER_RUNTIME"].nil? && !ENV["WEBSITE_SITE_NAME"].nil?
|
151
|
+
end
|
152
|
+
|
153
|
+
def collect_serverless_labels
|
154
|
+
if aws_lambda?
|
155
|
+
@labels["function_name"] = ENV["AWS_LAMBDA_FUNCTION_NAME"]
|
156
|
+
@labels["aws_region"] = ENV["AWS_REGION"]
|
157
|
+
|
158
|
+
elsif google_cloud_function? || cloud_run_or_fire_base?
|
159
|
+
function_name = ENV["FUNCTION_NAME"]
|
160
|
+
if function_name.nil?
|
161
|
+
function_name = ENV["K_SERVICE"]
|
162
|
+
end
|
163
|
+
@labels["function_name"] = function_name
|
164
|
+
|
165
|
+
elsif azure_function?
|
166
|
+
@labels["function_name"] = ENV["WEBSITE_SITE_NAME"]
|
167
|
+
@labels["azure_region"] = ENV["REGION_NAME"]
|
168
|
+
end
|
169
|
+
|
170
|
+
return unless @labels.key? "function_name"
|
171
|
+
|
172
|
+
@labels["rookout_serverless"] = "true"
|
82
173
|
end
|
83
174
|
end
|
84
175
|
end
|