rookout 0.1.23 → 0.1.27

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: 8b41a3be6ece6ef09531502db594ac06453723797d3c9c0f33e61ffe15a67587
4
- data.tar.gz: a772b70e1fd6df14a51f1bf74e4938a576ef9b7989692eaf09d658c190789ce2
3
+ metadata.gz: 29081116b19d38b4ff177eb1355605b69c735aa29cfe4b883d05099fe3556a5b
4
+ data.tar.gz: e39b5d4e540c790d194aea231ddf33a4d2743fa67ce2b42c2043c561e569873c
5
5
  SHA512:
6
- metadata.gz: 7b81e9fb7362fdf9abb57988d9dc2eb0acc099c5149243b1bf4d787c4e05d5aa4f3bc3602214eba23742ba152ac90fc18342a6abd5b872189b53626f007cea71
7
- data.tar.gz: 012b9eb8d6a15ba2f267190bc1edd1adea15472bc288e78d936cb592a2726b9bac66ba06067ab111e3757fc3562b8df95d69b013e38a2567f0b4c47385900106
6
+ metadata.gz: 1cc4883a3543f2c6026e7c739662ab8a2ca418bad4b9335a285b7bc1b45e2c30ff63359bcd6ebd4b2a490a72dbacd9b8500b7656a343ac5ddf6d8217fbf63e2e
7
+ data.tar.gz: 0dffd5e418e7f81f467b1667df7370806458de425e9b2998991798226bbe7ee9367bf639b15c30b53244aa6c3dae0dc7616dd97cce70beef65ac2429cf877109
@@ -10,6 +10,7 @@ module Rookout
10
10
  require_relative "locations/location_exception_handler"
11
11
  require_relative "aug_rate_limiter"
12
12
  require_relative "aug"
13
+ require_relative "../utils"
13
14
 
14
15
  class AugFactory
15
16
  def initialize output
@@ -34,7 +35,8 @@ module Rookout
34
35
 
35
36
  rate_limit = create_rate_limit configuration
36
37
 
37
- aug = Aug.new aug_id, action, condition, rate_limit, max_aug_time
38
+ max_aug_time_ns = Utils.milliseconds_to_nanoseconds max_aug_time
39
+ aug = Aug.new aug_id, action, condition, rate_limit, max_aug_time_ns
38
40
 
39
41
  location_configuration = configuration["location"]
40
42
  raise Exceptions::RookAugInvalidKey.new("location", configuration) unless location_configuration.is_a? Hash
@@ -72,7 +74,10 @@ module Rookout
72
74
 
73
75
  rate_limit_modifier = configuration["rateLimitModifier"] || 5
74
76
 
75
- AugRateLimiter.new window_quota, window_size, rate_limit_modifier
77
+ window_quota_ns = Utils.milliseconds_to_nanoseconds window_quota
78
+ window_size_ns = Utils.milliseconds_to_nanoseconds window_size
79
+
80
+ AugRateLimiter.new window_quota_ns, window_size_ns, rate_limit_modifier
76
81
  end
77
82
  end
78
83
  end
@@ -1,10 +1,12 @@
1
1
  module Rookout
2
2
  module Augs
3
3
  require_relative "../exceptions"
4
+ require_relative "../utils"
4
5
 
5
6
  class AugRateLimiter
6
7
  def initialize quota, window_size, active_limit
7
8
  @quota = quota
9
+ @has_quota = !@quota.nil? && (@quota > 0)
8
10
  @window_size = window_size
9
11
  @active_weight = quota / active_limit
10
12
 
@@ -18,24 +20,22 @@ module Rookout
18
20
  start_time ||= Time.now
19
21
 
20
22
  # If quota, verify it
21
- if @quota && @quota > 0
23
+ if @has_quota
22
24
  # Get current time
23
- now_ms = (start_time.to_f * 1000).to_i
25
+ now_ns = Utils.time_to_nanoseconds start_time
24
26
 
25
27
  # Calculate window keys
26
- current_window_key = (now_ms / @window_size) * @window_size
27
- prev_window_key = current_window_key - @window_size
28
+ current_window_key, prev_window_key = timestamp_to_window_keys now_ns
28
29
 
29
30
  @mutex.synchronize do
30
31
  # Clean old windows
31
- cleanup now_ms
32
-
32
+ cleanup now_ns
33
33
  # Increase active count
34
34
  @active_count += 1
35
35
  active = true
36
36
 
37
37
  # If exceeding quota
38
- if current_usage(now_ms, current_window_key, prev_window_key) > @quota
38
+ if current_usage(now_ns, current_window_key, prev_window_key) > @quota
39
39
  warning = Processor::RookError.new Exceptions::RookRuleRateLimited.new
40
40
  UserWarnings.notify_warning warning
41
41
  return
@@ -46,7 +46,9 @@ module Rookout
46
46
  begin
47
47
  yield
48
48
  ensure
49
- @mutex.synchronize { record_usage current_window_key, (Time.now - start_time) * 1000 } if @quota && @quota > 0
49
+ if @has_quota
50
+ @mutex.synchronize { record_usage current_window_key, Utils.time_to_nanoseconds(Time.now) - now_ns }
51
+ end
50
52
  end
51
53
  ensure
52
54
  # Reduce active count
@@ -55,7 +57,15 @@ module Rookout
55
57
 
56
58
  private
57
59
 
58
- def current_usage now_ms, current_window_key, prev_window_key
60
+ attr_reader :windows # will be used only in tests using <OBJ>.send(:windows)
61
+
62
+ def timestamp_to_window_keys now_ns
63
+ current_window_key = (now_ns / @window_size) * @window_size
64
+ prev_window_key = current_window_key - @window_size
65
+ [current_window_key, prev_window_key]
66
+ end
67
+
68
+ def current_usage now_ns, current_window_key, prev_window_key
59
69
  # Get usage information
60
70
  current_window_usage = @windows[current_window_key]
61
71
  if current_window_usage.nil?
@@ -65,7 +75,7 @@ module Rookout
65
75
  prev_window_usage = @windows[prev_window_key] || 0
66
76
 
67
77
  # Previous window weight
68
- prev_weight = 1 - (now_ms - current_window_key) / @window_size.to_f
78
+ prev_weight = 1 - (now_ns - current_window_key) / @window_size.to_f
69
79
 
70
80
  # Final weighted usage
71
81
  (prev_window_usage * prev_weight) + (@active_count * @active_weight) + current_window_usage
@@ -80,16 +90,8 @@ module Rookout
80
90
  @windows[current_window_key] += [duration, 5].max.to_f
81
91
  end
82
92
 
83
- def cleanup now_ms
84
- # Don't bother with contention
85
- return if @mutex.locked?
86
-
87
- @mutex.synchronize do
88
- # every 5 windows-times, clear windows older than 10 window-times
89
- if @windows.length > 10
90
- @windows.reject! { |key, _| key < (now_ms - @window_size * 5) }
91
- end
92
- end
93
+ def cleanup now_ns
94
+ @windows.reject! { |key, _| key < (now_ns - @window_size * 5) } if @windows.length > 10
93
95
  end
94
96
  end
95
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
 
@@ -128,6 +135,7 @@ module Rookout
128
135
  Logger.instance.debug "Reconnecting"
129
136
  end
130
137
  end
138
+ # rubocop:enable Style/StderrPuts
131
139
 
132
140
  def open_new_connection
133
141
  client = WebsocketClient.new @uri, @proxy, @token
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- COMMIT = "5319eced619aa4b48a8cbc41e22e0687dc48897c".freeze
2
+ COMMIT = "25edb2f6d66577295d8ee34842e067d6ad046d12".freeze
3
3
  end
@@ -25,7 +25,7 @@ module Rookout
25
25
  Rookout::Config.agent_com_ping_interval = 10
26
26
  Rookout::Config.agent_com_ping_timeout = 30
27
27
  Rookout::Config.agent_com_flush_timeout = 3
28
- Rookout::Config.agent_com_max_queued_messages = 500
28
+ Rookout::Config.agent_com_max_queued_messages = 100
29
29
 
30
30
  attr_accessor :backoff_factor, :backoff_reset_time, :backoff_max_time
31
31
  Rookout::Config.backoff_factor = 0.2
@@ -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
@@ -113,8 +113,11 @@ module Rookout
113
113
  end
114
114
 
115
115
  def build_handlers
116
- @handlers.push new_file_handler unless Config.logger_filename.nil? || Config.logger_filename.empty?
117
- @handlers.push new_stderr_handler if Config.logger_log_to_stderr
116
+ if Config.logger_log_to_stderr
117
+ @handlers.push new_file_handler unless Config.logger_filename.nil? || Config.logger_filename.empty?
118
+ @handlers.push new_stderr_handler
119
+ end
120
+
118
121
  @handlers.push new_remote_handler
119
122
  end
120
123
 
@@ -49,6 +49,8 @@ module Rookout
49
49
  @dump_config = OBJECT_DUMP_CONFIG_STRING
50
50
  elsif @obj.is_a?(Hash) || @obj.is_a?(Array)
51
51
  @dump_config = OBJECT_DUMP_CONFIG_COLLECTION
52
+ else
53
+ @dump_config = OBJECT_DUMP_CONFIG_TOLERANT
52
54
  end
53
55
  self
54
56
  end
@@ -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
 
data/lib/rookout/utils.rb CHANGED
@@ -6,4 +6,15 @@ module Utils
6
6
  def uuid
7
7
  SecureRandom.uuid.gsub(/-/, "")
8
8
  end
9
+
10
+ def milliseconds_to_nanoseconds milliseconds
11
+ nano = milliseconds * (10**6)
12
+ nano.to_i
13
+ end
14
+
15
+ def time_to_nanoseconds time_obj
16
+ secs = time_obj.to_i
17
+ nsecs = time_obj.nsec
18
+ (10**9) * secs + nsecs
19
+ end
9
20
  end
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- VERSION = "0.1.23".freeze
2
+ VERSION = "0.1.27".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.23
4
+ version: 0.1.27
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-07-19 00:00:00.000000000 Z
11
+ date: 2021-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: binding_of_caller
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 3.9.2
75
+ version: 3.17.3
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 3.9.2
82
+ version: 3.17.3
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: google-style
85
85
  requirement: !ruby/object:Gem::Requirement