rookout 0.1.25 → 0.1.29

Sign up to get free protection for your applications and to get access to all the features.
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