rookout 0.1.25 → 0.1.29

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: a2bdf85b56744c08bb1dbd03f5e877a1e5ff9408f10f7ebc496c90616630d782
4
- data.tar.gz: 8f8fd300f8ef303fb3f2ef136687ecb408aa490588af126d4ce0a6702932a948
3
+ metadata.gz: 49682fe35cb88044623330221963d1796926bd4d43274e52c6f5d2b9798939da
4
+ data.tar.gz: '08146067813084fe74e9c89b8cf4a242b2932a9c2c057144de1cf3a6893fa5a8'
5
5
  SHA512:
6
- metadata.gz: 6e82f777a0498faee329e943cceed997111f1cb0ea75e9103294aac7b0cc53c4bd05d0af4060f748869159a1179586b0c8b0337b3652e83682f033fe2c3323a5
7
- data.tar.gz: a765e0817ae1d2959a90c6c13902b42bb02566b1d5c1a7932fb2ca044c1c3fd1ea5882804555dca0d9c2afd6052aaa52d2dc178323b19302f0ebe8b28a25a1e2
6
+ metadata.gz: 02ca398a95c761881102ef4d1bf8e3dcc71b38ef65379651e2687dd583ea06bd5bd7fd7843745de1a4568055158cc10d021d9e510134d9d93d63c35578b09818
7
+ data.tar.gz: 55f7755051f8d26c407f4b0076975c20782d49b5427a8b55b7dad5e96f576e03519964a967665dd750e551765fc510551739a1a82b2a7582a308044f5fbb2cfd
@@ -30,7 +30,6 @@ module Rookout
30
30
  @mutex.synchronize do
31
31
  # Clean old windows
32
32
  cleanup now_ns
33
-
34
33
  # Increase active count
35
34
  @active_count += 1
36
35
  active = true
@@ -58,6 +57,8 @@ module Rookout
58
57
 
59
58
  private
60
59
 
60
+ attr_reader :windows # will be used only in tests using <OBJ>.send(:windows)
61
+
61
62
  def timestamp_to_window_keys now_ns
62
63
  current_window_key = (now_ns / @window_size) * @window_size
63
64
  prev_window_key = current_window_key - @window_size
@@ -90,15 +91,7 @@ module Rookout
90
91
  end
91
92
 
92
93
  def cleanup now_ns
93
- # Don't bother with contention
94
- return if @mutex.locked?
95
-
96
- @mutex.synchronize do
97
- # every 5 windows-times, clear windows older than 10 window-times
98
- if @windows.length > 10
99
- @windows.reject! { |key, _| key < (now_ns - @window_size * 5) }
100
- end
101
- end
94
+ @windows.reject! { |key, _| key < (now_ns - @window_size * 5) } if @windows.length > 10
102
95
  end
103
96
  end
104
97
  end
@@ -25,7 +25,7 @@ module Rookout
25
25
 
26
26
  attr_reader :pending_messages
27
27
 
28
- def initialize output, agent_host, agent_port, proxy, token, labels
28
+ def initialize output, agent_host, agent_port, proxy, token, labels, print_on_connect
29
29
  agent_host_with_protocl = agent_host.include?("://") ? agent_host : "ws://#{agent_host}"
30
30
  @uri = "#{agent_host_with_protocl}:#{agent_port}/v1"
31
31
  if proxy.nil? || proxy.empty?
@@ -48,6 +48,8 @@ module Rookout
48
48
  @running = false
49
49
  @ready_event = Concurrent::Event.new
50
50
  once("Com::Rookout::InitialAugsCommand") { @ready_event.set }
51
+
52
+ @print_on_initial_connection = print_on_connect
51
53
  end
52
54
 
53
55
  def add message
@@ -101,6 +103,7 @@ module Rookout
101
103
 
102
104
  private
103
105
 
106
+ # rubocop:disable Style/StderrPuts
104
107
  def connection_thread
105
108
  backoff = Backoff.new
106
109
 
@@ -108,6 +111,10 @@ module Rookout
108
111
  begin
109
112
  client = open_new_connection
110
113
 
114
+ if @print_on_initial_connection
115
+ @print_on_initial_connection = false
116
+ STDERR.puts "[Rookout] Successfully connected to controller"
117
+ end
111
118
  Logger.instance.debug "WebSocket connected successfully"
112
119
  Logger.instance.info "Finished initialization"
113
120
 
@@ -127,7 +134,10 @@ module Rookout
127
134
  backoff.after_disconnect
128
135
  Logger.instance.debug "Reconnecting"
129
136
  end
137
+ rescue Exception => e
138
+ Logger.instance.error "Unexpected error in connection_thread", e
130
139
  end
140
+ # rubocop:enable Style/StderrPuts
131
141
 
132
142
  def open_new_connection
133
143
  client = WebsocketClient.new @uri, @proxy, @token
@@ -149,7 +159,14 @@ module Rookout
149
159
  ].freeze
150
160
 
151
161
  def connection_pump client
152
- on_outgoing_exit = proc { client.close }
162
+ on_outgoing_exit = proc {
163
+ begin
164
+ client.close
165
+ rescue Exception => e
166
+ Logger.instance.error "Unexpected error exiting outgoing thread", e
167
+ end
168
+ }
169
+
153
170
  @outgoing_thread = Thread.new { outgoing client, on_outgoing_exit }
154
171
  @outgoing_thread.name = "rookout-outgoing-thread"
155
172
 
@@ -17,7 +17,7 @@ module Rookout
17
17
  @labels["rookout_debug"] = "on" if Config.debug
18
18
 
19
19
  k8_namespace = create_cluster_namespace k8s_file_path
20
- unless k8_namespace == ""
20
+ unless k8_namespace == "" || @labels.key?("k8s_namespace")
21
21
  @labels["k8s_namespace"] = k8_namespace
22
22
  end
23
23
 
@@ -5,7 +5,6 @@ module Rookout
5
5
  require "uri"
6
6
 
7
7
  require_relative "../config"
8
- require_relative "../logger"
9
8
  require_relative "../exceptions"
10
9
 
11
10
  class WebsocketClient
@@ -65,7 +64,7 @@ module Rookout
65
64
 
66
65
  begin
67
66
  @driver.close
68
- rescue RuntimeError, Errno::EPIPE
67
+ rescue RuntimeError, Errno::EPIPE, OpenSSL::OpenSSLError
69
68
  # Protocol close may fail if the connection is already closed
70
69
  nil
71
70
  end
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- COMMIT = "940d70afca76883c64c4a1e2892bfbca591e9cee".freeze
2
+ COMMIT = "7d24d368fe1a95d7c6b7e51a2f4ea2e143792b97".freeze
3
3
  end
@@ -32,6 +32,7 @@ module Rookout
32
32
  configure options
33
33
 
34
34
  rook = RookoutSingleton.instance
35
+ @start_options[throw_errors: throw_errors]
35
36
  rook.connect(**@start_options)
36
37
  rescue LoadError
37
38
  raise if throw_errors
@@ -99,6 +99,7 @@ module Rookout
99
99
  end
100
100
  end
101
101
 
102
+ # rubocop:disable Style/RescueStandardError
102
103
  def log level, message, args
103
104
  level_no = LOG_LEVELS.index level
104
105
  if level_no.nil?
@@ -110,7 +111,11 @@ module Rookout
110
111
 
111
112
  record = LogRecord.new level, message, args
112
113
  @handlers.each { |handler| handler.call record }
114
+ rescue
115
+ # Log may never throw
116
+ nil
113
117
  end
118
+ # rubocop:enable Style/RescueStandardError
114
119
 
115
120
  def build_handlers
116
121
  if Config.logger_log_to_stderr
@@ -62,20 +62,20 @@ module Rookout
62
62
  end
63
63
 
64
64
  def read_key key
65
- if @obj.is_a? Array
65
+ if @obj.is_a?(Array) || @obj.is_a?(String)
66
66
  key_int = key.to_i
67
67
  return RubyObjectNamespace.new @obj[key_int] if key_int >= 0 && key_int < @obj.length
68
68
  raise Exceptions::RookKeyNotFound, key
69
69
 
70
70
  elsif @obj.is_a? Hash
71
71
  return RubyObjectNamespace.new @obj[key] if @obj.key? key
72
- return RubyObjectNamespace.new @obj[key.to_sym] if key.is_a?(String) && @obj.key?(key.to_sym)
72
+ return RubyObjectNamespace.new @obj[key.to_sym] if @obj.key? key.to_s.to_sym
73
73
 
74
74
  @obj.each { |it, value| return RubyObjectNamespace.new value if it.to_s == key }
75
75
 
76
76
  raise Exceptions::RookKeyNotFound, key
77
77
  else
78
- raise Exceptions::RookInvalidObjectForAccess.new(obj.class.to_s, "ReadKey")
78
+ raise Exceptions::RookInvalidObjectForAccess.new(@obj.class.to_s, "ReadKey")
79
79
  end
80
80
  end
81
81
 
@@ -40,7 +40,8 @@ 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, fork: false
43
+ def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, fork: false,
44
+ throw_errors: false
44
45
  raise Exceptions::RookInterfaceException, "Multiple connection attempts not supported!" unless @agent_com.nil?
45
46
 
46
47
  if fork
@@ -52,7 +53,7 @@ module Rookout
52
53
 
53
54
  Logger.instance.debug "Initiating AgentCom-\t#{host}:#{port}"
54
55
 
55
- @agent_com = ComWs::AgentComWs.new @output, host, port, proxy, token, labels
56
+ @agent_com = ComWs::AgentComWs.new @output, host, port, proxy, token, labels, !throw_errors
56
57
  @output.agent_com = @agent_com
57
58
  @command_handler = ComWs::CommandHandler.new @agent_com, @aug_manager
58
59
 
@@ -18,6 +18,7 @@ module Rookout
18
18
  def initialize tracer
19
19
  @tracer = tracer
20
20
  @augs = {}
21
+ @augs_lock = Mutex.new
21
22
  @iseqs = []
22
23
  @trace_point = TracePoint.new :script_compiled do |tp|
23
24
  begin
@@ -41,7 +42,7 @@ module Rookout
41
42
  def add_aug location
42
43
  positions = evaluate_all_scripts_to_location location
43
44
  @tracer.add_breakpoint_aug positions, location unless positions.empty?
44
- @augs[location.id] = location
45
+ @augs_lock.synchronize { @augs[location.id] = location }
45
46
  end
46
47
 
47
48
  def remove_aug aug_id
@@ -73,11 +74,13 @@ module Rookout
73
74
  filename = iseq.absolute_path
74
75
  return if filename.nil?
75
76
 
76
- @augs.each_value do |location|
77
- position = evaluate_script_to_location iseq, filename, location
78
- next if position.nil?
77
+ @augs_lock.synchronize do
78
+ @augs.each_value do |location|
79
+ position = evaluate_script_to_location iseq, filename, location
80
+ next if position.nil?
79
81
 
80
- @tracer.add_breakpoint_aug [position], location
82
+ @tracer.add_breakpoint_aug [position], location
83
+ end
81
84
  end
82
85
  end
83
86
 
@@ -101,7 +104,7 @@ module Rookout
101
104
  PositionMarker.new lineno, iseq
102
105
  elsif suggested_match? location, filename
103
106
  warning = Exceptions::RookSourceFilePathSuggestion.new location.filename, filename
104
- location.notify_warning warning
107
+ location.notify_warning Processor::RookError.new warning
105
108
  # Must return nil in order to skip this script
106
109
  nil
107
110
  end
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- VERSION = "0.1.25".freeze
2
+ VERSION = "0.1.29".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.25
4
+ version: 0.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liran Haimovitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-26 00:00:00.000000000 Z
11
+ date: 2022-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: binding_of_caller