rookout 0.1.21 → 0.1.25

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: 2c221072b65f45a39f76d5e19eef6fa16acca2195e24ccc5556e28891800bf2e
4
- data.tar.gz: 5d4bc9847e1492098888bd80433ed5bf62375a7a3ef22a22b3edbabc51157524
3
+ metadata.gz: a2bdf85b56744c08bb1dbd03f5e877a1e5ff9408f10f7ebc496c90616630d782
4
+ data.tar.gz: 8f8fd300f8ef303fb3f2ef136687ecb408aa490588af126d4ce0a6702932a948
5
5
  SHA512:
6
- metadata.gz: eca7de50c075553184cc1b6d5ad394d3fdd63d8869a50d0fe654f72a7d332ca0a941ca54ae030b516193df0f06ed8069e898572a7ed770fb51191e097b3e291f
7
- data.tar.gz: 610f1de91359daa7b31f0554840fcde57f0506396a4deb9524bcfdb6dbc24eb981a6a42534e63ff65a3444d19fe64ea2148aae8c49cf81fe5abbb223a190f526
6
+ metadata.gz: 6e82f777a0498faee329e943cceed997111f1cb0ea75e9103294aac7b0cc53c4bd05d0af4060f748869159a1179586b0c8b0337b3652e83682f033fe2c3323a5
7
+ data.tar.gz: a765e0817ae1d2959a90c6c13902b42bb02566b1d5c1a7932fb2ca044c1c3fd1ea5882804555dca0d9c2afd6052aaa52d2dc178323b19302f0ebe8b28a25a1e2
@@ -28,6 +28,11 @@ module Rookout
28
28
  def execute frame, extracted, output
29
29
  return unless @enabled
30
30
 
31
+ if output.user_messages_queue_full?
32
+ Logger.instance.warning "Skipping aug-\t#{id} execution because the queue is full"
33
+ return
34
+ end
35
+
31
36
  namespace = create_namespaces frame, extracted
32
37
  return if @condition && !@condition.evaluate(namespace)
33
38
 
@@ -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
@@ -45,7 +47,7 @@ module Rookout
45
47
 
46
48
  def create_location configuration, aug
47
49
  name = configuration["name"]
48
- raise Exceptions.RookObjectNameMissing if name.nil?
50
+ raise Exceptions::RookObjectNameMissing if name.nil?
49
51
 
50
52
  case name
51
53
  when "file_line"
@@ -53,7 +55,7 @@ module Rookout
53
55
  when "exception_handler"
54
56
  return Locations::LocationExceptionHandler.new configuration, @output, aug
55
57
  else
56
- raise Exceptions.RookUnsupportedLocation if name != "file_line"
58
+ raise Exceptions::RookUnsupportedLocation if name != "file_line"
57
59
  end
58
60
  end
59
61
 
@@ -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,23 @@ 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
+ cleanup now_ns
32
33
 
33
34
  # Increase active count
34
35
  @active_count += 1
35
36
  active = true
36
37
 
37
38
  # If exceeding quota
38
- if current_usage(now_ms, current_window_key, prev_window_key) > @quota
39
+ if current_usage(now_ns, current_window_key, prev_window_key) > @quota
39
40
  warning = Processor::RookError.new Exceptions::RookRuleRateLimited.new
40
41
  UserWarnings.notify_warning warning
41
42
  return
@@ -46,7 +47,9 @@ module Rookout
46
47
  begin
47
48
  yield
48
49
  ensure
49
- @mutex.synchronize { record_usage current_window_key, (Time.now - start_time) * 1000 } if @quota && @quota > 0
50
+ if @has_quota
51
+ @mutex.synchronize { record_usage current_window_key, Utils.time_to_nanoseconds(Time.now) - now_ns }
52
+ end
50
53
  end
51
54
  ensure
52
55
  # Reduce active count
@@ -55,7 +58,13 @@ module Rookout
55
58
 
56
59
  private
57
60
 
58
- def current_usage now_ms, current_window_key, prev_window_key
61
+ def timestamp_to_window_keys now_ns
62
+ current_window_key = (now_ns / @window_size) * @window_size
63
+ prev_window_key = current_window_key - @window_size
64
+ [current_window_key, prev_window_key]
65
+ end
66
+
67
+ def current_usage now_ns, current_window_key, prev_window_key
59
68
  # Get usage information
60
69
  current_window_usage = @windows[current_window_key]
61
70
  if current_window_usage.nil?
@@ -65,7 +74,7 @@ module Rookout
65
74
  prev_window_usage = @windows[prev_window_key] || 0
66
75
 
67
76
  # Previous window weight
68
- prev_weight = 1 - (now_ms - current_window_key) / @window_size.to_f
77
+ prev_weight = 1 - (now_ns - current_window_key) / @window_size.to_f
69
78
 
70
79
  # Final weighted usage
71
80
  (prev_window_usage * prev_weight) + (@active_count * @active_weight) + current_window_usage
@@ -80,14 +89,14 @@ module Rookout
80
89
  @windows[current_window_key] += [duration, 5].max.to_f
81
90
  end
82
91
 
83
- def cleanup now_ms
92
+ def cleanup now_ns
84
93
  # Don't bother with contention
85
94
  return if @mutex.locked?
86
95
 
87
96
  @mutex.synchronize do
88
97
  # every 5 windows-times, clear windows older than 10 window-times
89
98
  if @windows.length > 10
90
- @windows.reject! { |key, _| key < (now_ms - @window_size * 5) }
99
+ @windows.reject! { |key, _| key < (now_ns - @window_size * 5) }
91
100
  end
92
101
  end
93
102
  end
@@ -23,6 +23,8 @@ module Rookout
23
23
  class AgentComWs
24
24
  include EventEmitter
25
25
 
26
+ attr_reader :pending_messages
27
+
26
28
  def initialize output, agent_host, agent_port, proxy, token, labels
27
29
  agent_host_with_protocl = agent_host.include?("://") ? agent_host : "ws://#{agent_host}"
28
30
  @uri = "#{agent_host_with_protocl}:#{agent_port}/v1"
@@ -62,6 +64,10 @@ module Rookout
62
64
  @pending_messages.push buffer if @pending_messages.length < Config.agent_com_max_queued_messages
63
65
  end
64
66
 
67
+ def queue_full?
68
+ @pending_messages.length >= Config.agent_com_max_queued_messages
69
+ end
70
+
65
71
  def connect
66
72
  @running = true
67
73
 
@@ -11,11 +11,16 @@ module Rookout
11
11
  require_relative "git"
12
12
  include Git
13
13
 
14
- def initialize labels
14
+ def initialize labels, k8s_file_path = "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
15
15
  @agent_id = nil
16
16
  @labels = labels.clone
17
17
  @labels["rookout_debug"] = "on" if Config.debug
18
18
 
19
+ k8_namespace = create_cluster_namespace k8s_file_path
20
+ unless k8_namespace == ""
21
+ @labels["k8s_namespace"] = k8_namespace
22
+ end
23
+
19
24
  @ip_addr = local_ip
20
25
 
21
26
  @scm_info = create_scm_information
@@ -49,7 +54,7 @@ module Rookout
49
54
  scm: @scm_info
50
55
  end
51
56
 
52
- attr_accessor :agent_id
57
+ attr_accessor :agent_id, :labels
53
58
 
54
59
  private
55
60
 
@@ -65,6 +70,18 @@ module Rookout
65
70
  end
66
71
  # rubocop:enable Style/ParallelAssignment
67
72
 
73
+ def create_cluster_namespace k8s_file_path
74
+ return_value = ""
75
+
76
+ # No Kubernetes is valid
77
+ if File.file? k8s_file_path
78
+ # Read the file contents and return it as result
79
+ return_value = File.read k8s_file_path
80
+ end
81
+
82
+ return_value
83
+ end
84
+
68
85
  def create_scm_information
69
86
  user_git_origin = Config.user_git_origin || ENV["ROOKOUT_REMOTE_ORIGIN"]
70
87
  user_git_commit = Config.user_git_commit || ENV["ROOKOUT_COMMIT"]
@@ -49,6 +49,10 @@ module Rookout
49
49
  Logger.instance.remove_output self
50
50
  end
51
51
 
52
+ def user_messages_queue_full?
53
+ @user_message_bucket.exhausted? || (!@agent_com.nil? && @agent_com.queue_full?)
54
+ end
55
+
52
56
  def send_warning rule_id, error
53
57
  send_rule_status rule_id, :Warning, error
54
58
  end
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- COMMIT = "5fd8b00c48eceb85c0e6c633ed13b7dbddf6715d".freeze
2
+ COMMIT = "940d70afca76883c64c4a1e2892bfbca591e9cee".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
@@ -201,5 +201,23 @@ module Rookout
201
201
  super "Bad protobuf platform: #{platform}"
202
202
  end
203
203
  end
204
+
205
+ class RookObjectNameMissing < ToolException
206
+ def initialize configuration
207
+ super "Failed to find object name",
208
+ {
209
+ "configuration" => configuration
210
+ }
211
+ end
212
+ end
213
+
214
+ class RookUnsupportedLocation < ToolException
215
+ def initialize location
216
+ super "Unsupported aug location was specified: #{location}",
217
+ {
218
+ "location" => location
219
+ }
220
+ end
221
+ end
204
222
  end
205
223
  end
@@ -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
@@ -20,7 +20,7 @@ module Rookout
20
20
 
21
21
  begin
22
22
  trace_point.enable target: position.method, target_line: position.lineno
23
- rescue ArgumentError => e
23
+ rescue RuntimeError, ArgumentError => e
24
24
  raise Exceptions::RookSetTracepointFailed.new(position.lineno, e)
25
25
  end
26
26
 
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.21".freeze
2
+ VERSION = "0.1.25".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.21
4
+ version: 0.1.25
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-03-14 00:00:00.000000000 Z
11
+ date: 2021-08-26 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
@@ -268,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
268
  - !ruby/object:Gem::Version
269
269
  version: '0'
270
270
  requirements: []
271
- rubygems_version: 3.1.4
271
+ rubygems_version: 3.1.6
272
272
  signing_key:
273
273
  specification_version: 4
274
274
  summary: rookout is the Ruby SDK for the Rookout Debugging Platform