rookout 0.1.1 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 874a75dff546e6c6959ecd21b5083d3b6f8a6a0f3c055722221471572d6633c1
4
- data.tar.gz: cef6e4460d9a852de5ca2af9dbd1fe865a1ead4cdb7186e62d7383453702402c
3
+ metadata.gz: 2bb84d3cfe961d052ba9880fd4198dd461782b7503d85584f57b4a9970279832
4
+ data.tar.gz: 9e5f6cf8e552bfdf2f23b63a606a29537bd75474b042c565d53e478335498323
5
5
  SHA512:
6
- metadata.gz: 3ea95c83e5b19b8279ea1ce829814bebda8425411e926b3b7bcbcbf72d5c9a08bedb87dc2a6ff7e5f10083f9f062d2c1ca85e93364d63d0e35b043dee843498d
7
- data.tar.gz: d10b3af2d478bc77f2488d7a86083f6f46bdfda8ea450bc65d17dec194efdaf9495e8c1972381473136e4766e88c805b930ea66ecfba086a54a23876b4fc46fe
6
+ metadata.gz: 8bbd1e679008de0c9840437f917114ea020cff7bda9c40dbdf13e6b83207edf385bf16914f8745888007346c66b16993676e21d37210b4f401e5053b34fc0cca
7
+ data.tar.gz: a5084dfeca88fdd305611e25cf62c6c5ce3eac1b93bfbd187333364b833ddc10633456bcb1c7c96115d7427a3215ab56d02bd6a798d2b8baa5306d367b170859
@@ -0,0 +1,69 @@
1
+ module Rookout
2
+ class ForkManager
3
+ require "singleton"
4
+ include Singleton
5
+
6
+ def initialize
7
+ @active = false
8
+ end
9
+
10
+ def activate!
11
+ @active = true
12
+ end
13
+
14
+ def disable!
15
+ @active = false
16
+ end
17
+
18
+ def active?
19
+ @active
20
+ end
21
+
22
+ def fork_hook original_fork
23
+ if block_given?
24
+ original_fork.call do
25
+ post_fork_child if active?
26
+ yield
27
+ end
28
+ else
29
+ res = original_fork.call
30
+ post_fork_child if active? && !res
31
+ res
32
+ end
33
+ end
34
+
35
+ def post_fork_child
36
+ require_relative "rookout_singleton"
37
+ require_relative "interface"
38
+
39
+ RookoutSingleton.instance.post_fork_clean
40
+ Interface.instance.stop
41
+ Interface.instance.start post_fork: true
42
+
43
+ # Disable fork handler in child process
44
+ disable!
45
+ end
46
+ end
47
+ end
48
+
49
+ alias _rookout_original_fork fork
50
+
51
+ def self.fork &block
52
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
53
+ end
54
+
55
+ module Kernel
56
+ alias _rookout_original_fork fork
57
+
58
+ def self.fork &block
59
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
60
+ end
61
+ end
62
+
63
+ module Process
64
+ alias _rookout_original_fork fork
65
+
66
+ def self.fork &block
67
+ Rookout::ForkManager.instance.fork_hook method(:_rookout_original_fork), &block
68
+ end
69
+ end
@@ -46,7 +46,8 @@ module Rookout
46
46
  "store" => Processor::Namespaces::ContainerNamespace.new,
47
47
  "temp" => Processor::Namespaces::ContainerNamespace.new,
48
48
  "utils" => Processor::Namespaces::RubyUtilsNamespace.new,
49
- "trace" => Processor::Namespaces::NoopNamespace.new
49
+ "trace" => Processor::Namespaces::NoopNamespace.new,
50
+ "state" => Processor::Namespaces::NoopNamespace.new
50
51
  )
51
52
  end
52
53
  end
@@ -7,6 +7,7 @@ module Rookout
7
7
  require_relative "actions/action_run_processor"
8
8
  require_relative "conditions/condition"
9
9
  require_relative "locations/location_file_line"
10
+ require_relative "locations/location_exception_handler"
10
11
  require_relative "aug_rate_limiter"
11
12
  require_relative "aug"
12
13
 
@@ -45,9 +46,15 @@ module Rookout
45
46
  def create_location configuration, aug
46
47
  name = configuration["name"]
47
48
  raise Exceptions.RookObjectNameMissing if name.nil?
48
- raise Exceptions.RookUnsupportedLocation if name != "file_line"
49
49
 
50
- Locations::LocationFileLine.new configuration, @output, aug
50
+ case name
51
+ when "file_line"
52
+ return Locations::LocationFileLine.new configuration, @output, aug
53
+ when "exception_handler"
54
+ return Locations::LocationExceptionHandler.new configuration, @output, aug
55
+ else
56
+ raise Exceptions.RookUnsupportedLocation if name != "file_line"
57
+ end
51
58
  end
52
59
 
53
60
  def create_rate_limit configuration
@@ -2,6 +2,8 @@ module Rookout
2
2
  module Augs
3
3
  require_relative "../logger"
4
4
 
5
+ require_relative "../processor/rook_error"
6
+
5
7
  require_relative "aug_factory"
6
8
 
7
9
  class AugsManager
@@ -43,7 +45,7 @@ module Rookout
43
45
  return
44
46
  end
45
47
 
46
- error = RookError.new e, message
48
+ error = Rookout::Processor::RookError.new e, message
47
49
  @output.send_rule_status aug_id, "Error", error
48
50
  return
49
51
  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
@@ -39,7 +39,8 @@ module Rookout
39
39
  @info = Information.new labels
40
40
  reset_id
41
41
 
42
- @thread = nil
42
+ @main_thread = nil
43
+ @outgoing_thread = nil
43
44
  @pending_messages = Queue.new
44
45
 
45
46
  @running = false
@@ -64,8 +65,17 @@ module Rookout
64
65
  def connect
65
66
  @running = true
66
67
 
67
- @thread = Thread.new { connection_thread }
68
- @thread.name = "rookout-connection-thread"
68
+ @main_thread = Thread.new { connection_thread }
69
+ @main_thread.name = "rookout-connection-thread"
70
+ end
71
+
72
+ def stop
73
+ @running = false
74
+
75
+ # Ask outgoing thread to exit (if running)
76
+ @pending_messages << ExitMessage.new(@outgoing_thread)
77
+
78
+ @main_thread.join
69
79
  end
70
80
 
71
81
  def wait_for_ready
@@ -133,8 +143,8 @@ module Rookout
133
143
 
134
144
  def connection_pump client
135
145
  on_outgoing_exit = proc { client.close }
136
- send_thread = Thread.new { outgoing client, on_outgoing_exit }
137
- send_thread.name = "rookout-outgoing-thread"
146
+ @outgoing_thread = Thread.new { outgoing client, on_outgoing_exit }
147
+ @outgoing_thread.name = "rookout-outgoing-thread"
138
148
 
139
149
  message_handler = proc do |raw_message|
140
150
  envelope = Com::Rookout::Envelope.decode raw_message.pack("c*")
@@ -150,7 +160,8 @@ module Rookout
150
160
  Logger.instance.debug "Incoming loop - socket disconnected"
151
161
 
152
162
  @pending_messages.push ExitMessage.new(send_thread)
153
- send_thread.join
163
+ @outgoing_thread.join
164
+ @outgoing_thread = nil
154
165
  end
155
166
 
156
167
  def outgoing client, on_exit
@@ -57,19 +57,13 @@ module Rookout
57
57
  return if @closing || !@agent_com
58
58
 
59
59
  @rule_status_update_bucket.if_available do
60
- protobuf_error = nil
60
+ status = Com::Rookout::RuleStatusMessage.new agent_id: @agent_id,
61
+ rule_id: rule_id,
62
+ active: active
61
63
  if error
62
- protobuf_error = Com::Rookout::Error.new message: error.messsage,
63
- type: error.type
64
- protobuf_error.parameters.copy_from error.parameters
65
- protobuf_error.exc.copy_from error.exc
66
- protobuf_error.traceback.copy_from error.traceback
64
+ status.error = error.dumps
67
65
  end
68
66
 
69
- status = Com::Rookout::RuleStatusMessage.new agent_id: @agent_id,
70
- rule_id: rule_id,
71
- active: active,
72
- error: protobuf_error
73
67
  @agent_com.add status
74
68
  end
75
69
  end
@@ -0,0 +1,3 @@
1
+ module Rookout
2
+ COMMIT = "2a847bf58dabb4d6abd2957f4c382256a4a467db".freeze
3
+ end
@@ -9,6 +9,7 @@ module Rookout
9
9
 
10
10
  def initialize
11
11
  @rook = nil
12
+ @start_options = nil
12
13
  end
13
14
 
14
15
  def start options = {}
@@ -19,14 +20,20 @@ module Rookout
19
20
  begin
20
21
  require_relative "rookout_singleton"
21
22
 
22
- configure_logging options
23
- configure_git options
23
+ # If we are running post fork, use previous start_options
24
+ if options[:post_fork]
25
+ # Don't re-enable the fork handler
26
+ @start_options[:fork] = false
27
+ else
28
+ configure_logging options
29
+ configure_git options
24
30
 
25
- start_options = configure_start_options options
26
- print_config start_options
31
+ @start_options = configure_start_options options
32
+ print_config @start_options
33
+ end
27
34
 
28
35
  rook = RookoutSingleton.instance
29
- rook.connect(**start_options)
36
+ rook.connect(**@start_options)
30
37
  rescue RookMissingToken, RookInvalidToken, RookInvalidOptions, RookVersionNotSupported => e
31
38
  raise if throw_errors
32
39
  STDERR.puts "[Rookout] Failed to start Rookout: #{e.message}"
@@ -84,7 +91,7 @@ module Rookout
84
91
  raise RookMissingToken if token.nil? && host == "wss://control.rookout.com"
85
92
  verify_token token if token
86
93
 
87
- labels = options[:labels] || parse_labels(ENV["ROOKOUT_LABELS"])
94
+ labels = stringify_labels(options[:labels]) || parse_labels(ENV["ROOKOUT_LABELS"])
88
95
  validate_labels labels
89
96
 
90
97
  async_start = true? ENV["ROOKOUT_ASYNC_START"]
@@ -108,6 +115,18 @@ module Rookout
108
115
  default
109
116
  end
110
117
 
118
+ def stringify_labels labels
119
+ return nil unless labels
120
+
121
+ stringified_labels = {}
122
+
123
+ labels.each do |label_name, label_value|
124
+ stringified_labels[label_name.to_s] = label_value.to_s
125
+ end
126
+
127
+ stringified_labels
128
+ end
129
+
111
130
  def parse_labels raw_labels
112
131
  labels = {}
113
132
  return labels if raw_labels.nil?
@@ -12,6 +12,7 @@ module Rookout
12
12
  end
13
13
 
14
14
  def read_attribute name
15
+ return RubyObjectNamespace.new @binding.receiver if name == "self"
15
16
  raise Exceptions::RookAttributeNotFound, name unless @binding.local_variable_defined? name
16
17
  RubyObjectNamespace.new @binding.local_variable_get name
17
18
  end
@@ -123,6 +123,7 @@ module Rookout
123
123
  end
124
124
 
125
125
  def dump_string obj, variant, config
126
+ obj = obj.to_s
126
127
  if obj.length > config.max_string
127
128
  final_obj = obj[0...config.max_string]
128
129
  else
@@ -40,9 +40,14 @@ module Rookout
40
40
  @services_started = false
41
41
  end
42
42
 
43
- def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, **_
43
+ def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, fork: false
44
44
  raise Exceptions::RookInterfaceException, "Multiple connection attempts not supported!" unless @agent_com.nil?
45
45
 
46
+ if fork
47
+ require_relative "atfork"
48
+ Rookout::ForkManager.instance.activate!
49
+ end
50
+
46
51
  start_trigger_services
47
52
 
48
53
  Logger.instance.debug "Initiating AgentCom-\t#{host}:#{port}"
@@ -61,6 +66,16 @@ module Rookout
61
66
  @output.flush_messages if !@output.nil && !@agent_com.nil?
62
67
  end
63
68
 
69
+ def post_fork_clean
70
+ @agent_com.stop
71
+ @agent_com = nil
72
+
73
+ @command_handler = nil
74
+
75
+ # We don't disable services because we will lose all loaded scripts
76
+ @services.clear_augs
77
+ end
78
+
64
79
  attr_reader :services
65
80
 
66
81
  private
@@ -18,14 +18,14 @@ module Rookout
18
18
  def initialize tracer
19
19
  @tracer = tracer
20
20
  @augs = {}
21
- @iseqs = {}
21
+ @iseqs = []
22
22
  @trace_point = TracePoint.new :script_compiled do |tp|
23
23
  begin
24
24
  begin
25
25
  iseq = tp.instruction_sequence
26
26
  # Ignore script without sources
27
27
  if iseq.absolute_path
28
- @iseqs[tp.path] = iseq
28
+ @iseqs << iseq
29
29
  evaluate_script iseq
30
30
  end
31
31
  rescue Exception => e
@@ -83,7 +83,7 @@ module Rookout
83
83
 
84
84
  def evaluate_all_scripts_to_location location
85
85
  positions = []
86
- @iseqs.each_value do |iseq|
86
+ @iseqs.each do |iseq|
87
87
  position = evaluate_script_to_location iseq, iseq.absolute_path, location
88
88
  next if position.nil?
89
89
 
@@ -98,7 +98,7 @@ module Rookout
98
98
  lineno = find_updated_line filename, location
99
99
  return if lineno == -1
100
100
 
101
- PositionMarker.new location.lineno, iseq
101
+ PositionMarker.new lineno, iseq
102
102
  elsif suggested_match? location, filename
103
103
  warning = Exceptions::RookSourceFilePathSuggestion.new location.filename, filename
104
104
  location.notify_warning warning
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.1.6".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rookout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liran Haimovitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-28 00:00:00.000000000 Z
11
+ date: 2020-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: binding_of_caller
@@ -189,6 +189,7 @@ files:
189
189
  - LICENSE
190
190
  - bin/rookout
191
191
  - lib/rookout.rb
192
+ - lib/rookout/atfork.rb
192
193
  - lib/rookout/augs/actions/action.rb
193
194
  - lib/rookout/augs/actions/action_run_processor.rb
194
195
  - lib/rookout/augs/aug.rb
@@ -197,6 +198,7 @@ files:
197
198
  - lib/rookout/augs/augs_manager.rb
198
199
  - lib/rookout/augs/conditions/condition.rb
199
200
  - lib/rookout/augs/locations/location.rb
201
+ - lib/rookout/augs/locations/location_exception_handler.rb
200
202
  - lib/rookout/augs/locations/location_file_line.rb
201
203
  - lib/rookout/com_ws/agent_com_ws.rb
202
204
  - lib/rookout/com_ws/backoff.rb
@@ -207,6 +209,7 @@ files:
207
209
  - lib/rookout/com_ws/pinger.rb
208
210
  - lib/rookout/com_ws/token_bucket.rb
209
211
  - lib/rookout/com_ws/websocket_client.rb
212
+ - lib/rookout/commit.rb
210
213
  - lib/rookout/config.rb
211
214
  - lib/rookout/exceptions.rb
212
215
  - lib/rookout/interface.rb