rookout 0.1.0 → 0.1.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/lib/rookout/augs/actions/action_run_processor.rb +3 -3
- data/lib/rookout/augs/aug.rb +23 -90
- data/lib/rookout/augs/aug_factory.rb +16 -13
- data/lib/rookout/augs/aug_rate_limiter.rb +3 -3
- data/lib/rookout/augs/conditions/condition.rb +4 -2
- data/lib/rookout/augs/locations/location.rb +75 -1
- data/lib/rookout/augs/locations/location_file_line.rb +16 -4
- data/lib/rookout/com_ws/agent_com_ws.rb +28 -33
- data/lib/rookout/com_ws/information.rb +1 -1
- data/lib/rookout/com_ws/pinger.rb +36 -0
- data/lib/rookout/com_ws/websocket_client.rb +143 -0
- data/lib/rookout/config.rb +1 -0
- data/lib/rookout/exceptions.rb +40 -0
- data/lib/rookout/interface.rb +29 -24
- data/lib/rookout/logger.rb +16 -2
- data/lib/rookout/processor/namespace_serializer.rb +1 -1
- data/lib/rookout/processor/namespaces/namespace.rb +2 -2
- data/lib/rookout/processor/namespaces/noop_namespace.rb +1 -1
- data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +3 -3
- data/lib/rookout/processor/operations/set_operation.rb +4 -1
- data/lib/rookout/processor/paths/arithmetic_path.rb +1 -1
- data/lib/rookout/processor/paths/canopy/markers.rb +5 -2
- data/lib/rookout/rookout_singleton.rb +4 -3
- data/lib/rookout/services/position.rb +73 -73
- data/lib/rookout/services/tracer.rb +8 -5
- data/lib/rookout/trigger_services.rb +2 -2
- data/lib/rookout/user_warnings.rb +2 -0
- data/lib/rookout/utils.rb +9 -0
- data/lib/rookout/version.rb +1 -2
- metadata +35 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 874a75dff546e6c6959ecd21b5083d3b6f8a6a0f3c055722221471572d6633c1
|
4
|
+
data.tar.gz: cef6e4460d9a852de5ca2af9dbd1fe865a1ead4cdb7186e62d7383453702402c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ea95c83e5b19b8279ea1ce829814bebda8425411e926b3b7bcbcbf72d5c9a08bedb87dc2a6ff7e5f10083f9f062d2c1ca85e93364d63d0e35b043dee843498d
|
7
|
+
data.tar.gz: d10b3af2d478bc77f2488d7a86083f6f46bdfda8ea450bc65d17dec194efdaf9495e8c1972381473136e4766e88c805b930ea66ecfba086a54a23876b4fc46fe
|
@@ -15,12 +15,12 @@ module Rookout
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def execute aug_id, report_id, namespace,
|
18
|
+
def execute aug_id, report_id, namespace, output
|
19
19
|
@processor.process namespace
|
20
|
-
|
20
|
+
output.send_user_message aug_id, report_id, namespace.read_attribute("store")
|
21
21
|
return unless @post_processor
|
22
22
|
|
23
|
-
|
23
|
+
output.flush_message
|
24
24
|
@post_processor.process namespace
|
25
25
|
end
|
26
26
|
end
|
data/lib/rookout/augs/aug.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
require_relative "../logger"
|
2
|
-
require_relative "../user_warnings"
|
3
|
-
require_relative "../processor/rook_error"
|
4
|
-
|
5
1
|
module Rookout
|
6
2
|
module Augs
|
7
|
-
|
8
|
-
require "concurrent-ruby/concurrent/atom"
|
3
|
+
require_relative "../utils"
|
9
4
|
|
10
5
|
require_relative "../processor/namespaces/frame_namespace"
|
11
6
|
require_relative "../processor/namespaces/stack_namespace"
|
@@ -13,109 +8,47 @@ module Rookout
|
|
13
8
|
require_relative "../processor/namespaces/ruby_utils_namespace"
|
14
9
|
require_relative "../processor/namespaces/noop_namespace"
|
15
10
|
|
16
|
-
require_relative "../logger"
|
17
|
-
|
18
|
-
MAX_LOG_CACHE_SIZE = 10
|
19
|
-
|
20
11
|
class Aug
|
21
|
-
def initialize aug_id,
|
12
|
+
def initialize aug_id, action, condition, rate_limiter, _max_aug_time
|
22
13
|
# NOTE: max_aux_time is not implemented
|
23
14
|
|
24
15
|
@id = aug_id
|
25
|
-
@location = location
|
26
16
|
@action = action
|
27
17
|
@condition = condition
|
28
18
|
@rate_limiter = rate_limiter
|
29
|
-
@output = output
|
30
19
|
|
31
20
|
@enabled = true
|
32
21
|
@status = nil
|
33
22
|
@log_cache = []
|
34
23
|
end
|
35
|
-
end
|
36
|
-
|
37
|
-
attr_reader :id
|
38
|
-
|
39
|
-
def add_aug trigger_services
|
40
|
-
@location.add_aug trigger_services, self
|
41
|
-
rescue SystemExit
|
42
|
-
raise
|
43
|
-
rescue Exception => e
|
44
|
-
message = "Exception when adding aug"
|
45
|
-
Logger.instance.error message, e
|
46
|
-
notify_error RookError.new e, message
|
47
|
-
end
|
48
24
|
|
49
|
-
|
50
|
-
return unless @enabled
|
25
|
+
attr_reader :id
|
51
26
|
|
52
|
-
|
53
|
-
|
54
|
-
namespace = create_namespaces frame, extracted
|
27
|
+
def execute frame, extracted, output
|
28
|
+
return unless @enabled
|
55
29
|
|
56
|
-
|
30
|
+
namespace = create_namespaces frame, extracted
|
31
|
+
return if @condition && !@condition.evaluate(namespace)
|
57
32
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
rescue SystemExit
|
63
|
-
raise
|
64
|
-
rescue Exception => e
|
65
|
-
message = "Exception while processing Aug"
|
66
|
-
error = RookError.new e, message
|
67
|
-
notify_warning error unless silence_log? error
|
33
|
+
@rate_limiter.with_limit do
|
34
|
+
report_id = Utils.uuid
|
35
|
+
@action.execute @id, report_id, namespace, output
|
68
36
|
end
|
69
37
|
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def notify_active
|
73
|
-
send_rule_status :Active
|
74
|
-
end
|
75
|
-
|
76
|
-
def notify_pending
|
77
|
-
send_rule_status :Pending
|
78
|
-
end
|
79
|
-
|
80
|
-
def notify_removed
|
81
|
-
send_rule_status :Deleted
|
82
|
-
end
|
83
38
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
"stack": Processor::Namespaces::StackNamespace.new(frame, 1),
|
98
|
-
"extracted": Processor::Namespaces::ContainerNamespace.new(extracted),
|
99
|
-
"store": Processor::Namespaces::ContainerNamespace.new,
|
100
|
-
"temp": Processor::Namespaces::ContainerNamespace.new,
|
101
|
-
"utils": Processor::Namespaces::RubyUtisNamespace.new,
|
102
|
-
"trace": Processor::Namespaces::NoopNamespace.new)
|
103
|
-
end
|
104
|
-
|
105
|
-
def silence_log? error
|
106
|
-
return true if @log_cache.length >= MAX_LOG_CACHE_SIZE || @log_cache.include(error.message)
|
107
|
-
|
108
|
-
@log_cache << error.message
|
109
|
-
false
|
110
|
-
end
|
111
|
-
|
112
|
-
def send_rule_status status, error = nil
|
113
|
-
return unless @status != status
|
114
|
-
|
115
|
-
Logger.instance.info "Updating rule status for #{@id} to #{status}"
|
116
|
-
@status = status
|
117
|
-
|
118
|
-
@output.send_rule_status @id, status, error
|
39
|
+
private
|
40
|
+
|
41
|
+
def create_namespaces frame, extracted
|
42
|
+
Processor::Namespaces::ContainerNamespace.new(
|
43
|
+
"frame" => Processor::Namespaces::FrameNamespace.new(frame[1]),
|
44
|
+
"stack" => Processor::Namespaces::StackNamespace.new(frame, 1),
|
45
|
+
"extracted" => Processor::Namespaces::ContainerNamespace.new(extracted),
|
46
|
+
"store" => Processor::Namespaces::ContainerNamespace.new,
|
47
|
+
"temp" => Processor::Namespaces::ContainerNamespace.new,
|
48
|
+
"utils" => Processor::Namespaces::RubyUtilsNamespace.new,
|
49
|
+
"trace" => Processor::Namespaces::NoopNamespace.new
|
50
|
+
)
|
51
|
+
end
|
119
52
|
end
|
120
53
|
end
|
121
54
|
end
|
@@ -6,7 +6,9 @@ module Rookout
|
|
6
6
|
|
7
7
|
require_relative "actions/action_run_processor"
|
8
8
|
require_relative "conditions/condition"
|
9
|
+
require_relative "locations/location_file_line"
|
9
10
|
require_relative "aug_rate_limiter"
|
11
|
+
require_relative "aug"
|
10
12
|
|
11
13
|
class AugFactory
|
12
14
|
def initialize output
|
@@ -16,35 +18,36 @@ module Rookout
|
|
16
18
|
|
17
19
|
def create_aug configuration
|
18
20
|
aug_id = configuration["id"]
|
19
|
-
raise Exceptions.
|
20
|
-
|
21
|
-
location_configuration = configuration["location"]
|
22
|
-
raise Exceptions.RookAugInvalidKey "location", configuration unless location_configuration.is_a? Hash
|
23
|
-
location = create_location location_configuration
|
21
|
+
raise Exceptions::RookAugInvalidKey.new("id", configuration) unless aug_id.is_a? String
|
24
22
|
|
25
23
|
action_configuration = configuration["action"]
|
26
|
-
raise Exceptions.
|
27
|
-
action = Actions.
|
24
|
+
raise Exceptions::RookAugInvalidKey.new("action", configuration) unless action_configuration.is_a? Hash
|
25
|
+
action = Actions::ActionRunProcessor.new action_configuration, @factory
|
28
26
|
|
29
|
-
max_aug_time = configuration["maxAugTime"] || Config.
|
27
|
+
max_aug_time = configuration["maxAugTime"] || Config.instrumentation_max_aug_time
|
30
28
|
|
31
29
|
condition_configuration = configuration["conditional"]
|
32
|
-
raise Exceptions.
|
33
|
-
|
30
|
+
raise Exceptions::RookAugInvalidKey.new("conditional", configuration) unless
|
31
|
+
condition_configuration.nil? || condition_configuration.is_a?(String)
|
32
|
+
condition = condition_configuration.nil? ? nil : Conditions::Condition.new(condition_configuration)
|
34
33
|
|
35
34
|
rate_limit = create_rate_limit configuration
|
36
35
|
|
37
|
-
Aug.new aug_id,
|
36
|
+
aug = Aug.new aug_id, action, condition, rate_limit, max_aug_time
|
37
|
+
|
38
|
+
location_configuration = configuration["location"]
|
39
|
+
raise Exceptions::RookAugInvalidKey.new("location", configuration) unless location_configuration.is_a? Hash
|
40
|
+
create_location location_configuration, aug
|
38
41
|
end
|
39
42
|
|
40
43
|
private
|
41
44
|
|
42
|
-
def create_location configuration
|
45
|
+
def create_location configuration, aug
|
43
46
|
name = configuration["name"]
|
44
47
|
raise Exceptions.RookObjectNameMissing if name.nil?
|
45
48
|
raise Exceptions.RookUnsupportedLocation if name != "file_line"
|
46
49
|
|
47
|
-
Locations
|
50
|
+
Locations::LocationFileLine.new configuration, @output, aug
|
48
51
|
end
|
49
52
|
|
50
53
|
def create_rate_limit configuration
|
@@ -15,12 +15,12 @@ module Rookout
|
|
15
15
|
|
16
16
|
def with_limit start_time = nil
|
17
17
|
active = false
|
18
|
-
start_time ||= Time.
|
18
|
+
start_time ||= Time.now
|
19
19
|
|
20
20
|
# If quota, verify it
|
21
21
|
if @quota
|
22
22
|
# Get current time
|
23
|
-
now_ms = (
|
23
|
+
now_ms = (start_time.to_f * 1000).to_i
|
24
24
|
|
25
25
|
# Calculate window keys
|
26
26
|
current_window_key = (now_ms / @window_size) * @window_size
|
@@ -77,7 +77,7 @@ module Rookout
|
|
77
77
|
return if prev_value.nil?
|
78
78
|
|
79
79
|
# Add value to quota
|
80
|
-
@windows[current_window_key] +=
|
80
|
+
@windows[current_window_key] += [duration, 5].max.to_f
|
81
81
|
end
|
82
82
|
|
83
83
|
def cleanup now_ms
|
@@ -1,13 +1,15 @@
|
|
1
1
|
module Rookout
|
2
2
|
module Augs
|
3
3
|
module Conditions
|
4
|
+
require_relative "../../processor/paths/arithmetic_path"
|
5
|
+
|
4
6
|
class Condition
|
5
7
|
def initialize condition
|
6
|
-
@path = ArithmeticPath.new condition
|
8
|
+
@path = Processor::Paths::ArithmeticPath.new condition
|
7
9
|
end
|
8
10
|
|
9
11
|
def evaluate namespace
|
10
|
-
@path.read_from(namespace).
|
12
|
+
@path.read_from(namespace).obj == true
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
@@ -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, extracted
|
24
|
+
UserWarnings.with self do
|
25
|
+
begin
|
26
|
+
@aug.execute frame, extracted, @output
|
27
|
+
rescue SystemExit
|
28
|
+
raise
|
29
|
+
rescue Exception => e
|
30
|
+
message = "Exception while processing Aug"
|
31
|
+
puts e.message + "\n" + e.backtrace.join("\n\t")
|
32
|
+
error = Processor::RookError.new e, message
|
33
|
+
notify_warning error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def notify_active
|
39
|
+
send_rule_status :Active
|
40
|
+
end
|
41
|
+
|
42
|
+
def notify_pending
|
43
|
+
send_rule_status :Pending
|
44
|
+
end
|
45
|
+
|
46
|
+
def notify_removed
|
47
|
+
send_rule_status :Deleted
|
48
|
+
end
|
49
|
+
|
50
|
+
def notify_error error
|
51
|
+
send_rule_status :Error, error
|
52
|
+
end
|
53
|
+
|
54
|
+
def notify_warning error
|
55
|
+
return if silence_log? error
|
56
|
+
|
57
|
+
Logger.instance.warning error.message
|
58
|
+
|
59
|
+
send_rule_status :Warning, error
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def silence_log? error
|
65
|
+
return true if @log_cache.length >= MAX_LOG_CACHE_SIZE || @log_cache.include?(error.message)
|
66
|
+
|
67
|
+
@log_cache << error.message
|
68
|
+
false
|
69
|
+
end
|
70
|
+
|
71
|
+
def send_rule_status status, error = nil
|
72
|
+
return if @status == status
|
73
|
+
|
74
|
+
Logger.instance.info "Updating rule status for #{@id} to #{status}"
|
75
|
+
@status = status
|
76
|
+
|
77
|
+
# For easier testing
|
78
|
+
return if @output.nil?
|
79
|
+
|
80
|
+
@output.send_rule_status id, status, error
|
81
|
+
end
|
8
82
|
end
|
9
83
|
end
|
10
84
|
end
|
@@ -1,24 +1,36 @@
|
|
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
24
|
attr_reader :filename, :lineno, :file_hash, :line_crc, :line_unique
|
19
25
|
|
20
|
-
def add_aug trigger_services
|
21
|
-
trigger_services.get_service("position").add_aug self
|
26
|
+
def add_aug trigger_services
|
27
|
+
trigger_services.get_service("position").add_aug self
|
28
|
+
rescue SystemExit
|
29
|
+
raise
|
30
|
+
rescue Exception => e
|
31
|
+
message = "Exception when adding aug"
|
32
|
+
Logger.instance.error message, e
|
33
|
+
notify_error Processor::RookError.new e, message
|
22
34
|
end
|
23
35
|
end
|
24
36
|
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,14 +8,17 @@ 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
|
@@ -68,7 +69,11 @@ module Rookout
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def wait_for_ready
|
71
|
-
@ready_event.wait Config.agent_com_timeout
|
72
|
+
is_finished = @ready_event.wait Config.agent_com_timeout
|
73
|
+
# We didn't finish - will keep trying in the background
|
74
|
+
raise Exceptions::RookCommunicationException unless is_finished
|
75
|
+
|
76
|
+
# We finished - raise if we failed
|
72
77
|
raise @connection_error if @connection_error
|
73
78
|
end
|
74
79
|
|
@@ -86,17 +91,15 @@ module Rookout
|
|
86
91
|
while @running
|
87
92
|
begin
|
88
93
|
backoff.before_connection_attempt
|
89
|
-
|
90
|
-
register client
|
94
|
+
client = open_new_connection
|
91
95
|
|
92
|
-
|
93
|
-
|
94
|
-
|
96
|
+
Logger.instance.debug "WebSocket connected successfully"
|
97
|
+
@token_valid = true
|
98
|
+
backoff.after_connect
|
95
99
|
|
96
|
-
|
97
|
-
end
|
100
|
+
connection_pump client
|
98
101
|
rescue Exception => e
|
99
|
-
if !@token_valid && e.
|
102
|
+
if !@token_valid && e.message.include?("403")
|
100
103
|
@connection_error = Exceptions::RookInvalidToken.new @token
|
101
104
|
@ready_event.set
|
102
105
|
end
|
@@ -109,26 +112,15 @@ module Rookout
|
|
109
112
|
end
|
110
113
|
end
|
111
114
|
|
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
|
115
|
+
def open_new_connection
|
116
|
+
client = WebsocketClient.new @uri, @proxy, @token
|
117
|
+
client.connect
|
126
118
|
|
127
|
-
def register client
|
128
119
|
Logger.instance.info "Registering agent with id #{@agent_id}"
|
129
|
-
|
130
120
|
msg = Com::Rookout::NewAgentMessage.new agent_info: @info.pack
|
131
|
-
client.
|
121
|
+
client.send_frame wrap_in_envelope(msg)
|
122
|
+
|
123
|
+
client
|
132
124
|
end
|
133
125
|
|
134
126
|
ACCEPTED_MESSAGE_TYPES = [
|
@@ -140,11 +132,11 @@ module Rookout
|
|
140
132
|
].freeze
|
141
133
|
|
142
134
|
def connection_pump client
|
143
|
-
on_outgoing_exit = proc { client.
|
135
|
+
on_outgoing_exit = proc { client.close }
|
144
136
|
send_thread = Thread.new { outgoing client, on_outgoing_exit }
|
145
137
|
send_thread.name = "rookout-outgoing-thread"
|
146
138
|
|
147
|
-
|
139
|
+
message_handler = proc do |raw_message|
|
148
140
|
envelope = Com::Rookout::Envelope.decode raw_message.pack("c*")
|
149
141
|
|
150
142
|
ACCEPTED_MESSAGE_TYPES.each do |klass|
|
@@ -153,6 +145,8 @@ module Rookout
|
|
153
145
|
end
|
154
146
|
end
|
155
147
|
|
148
|
+
client.connection_pump message_handler
|
149
|
+
|
156
150
|
Logger.instance.debug "Incoming loop - socket disconnected"
|
157
151
|
|
158
152
|
@pending_messages.push ExitMessage.new(send_thread)
|
@@ -160,7 +154,7 @@ module Rookout
|
|
160
154
|
end
|
161
155
|
|
162
156
|
def outgoing client, on_exit
|
163
|
-
|
157
|
+
Pinger.new(client, Config.agent_com_ping_interval, Config.agent_com_ping_timeout).repeat do
|
164
158
|
begin
|
165
159
|
msg = @pending_messages.pop true
|
166
160
|
rescue ThreadError
|
@@ -174,7 +168,7 @@ module Rookout
|
|
174
168
|
msg.event.set
|
175
169
|
else
|
176
170
|
begin
|
177
|
-
client.
|
171
|
+
client.send_frame msg
|
178
172
|
rescue RuntimeError
|
179
173
|
@queue << msg
|
180
174
|
break
|
@@ -184,6 +178,7 @@ module Rookout
|
|
184
178
|
rescue Exception => e
|
185
179
|
Logger.instance.exception "Outgoing thread failed", e
|
186
180
|
ensure
|
181
|
+
Logger.instance.debug "Outgoing thread exiting"
|
187
182
|
on_exit.call
|
188
183
|
end
|
189
184
|
|
@@ -196,7 +191,7 @@ module Rookout
|
|
196
191
|
end
|
197
192
|
|
198
193
|
def reset_id
|
199
|
-
@agent_id =
|
194
|
+
@agent_id = Utils.uuid
|
200
195
|
@output.agent_id = @agent_id
|
201
196
|
@info.agent_id = @agent_id
|
202
197
|
end
|