rookout 0.1.22 → 0.1.26
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 +4 -4
- data/lib/rookout/augs/aug.rb +5 -0
- data/lib/rookout/augs/aug_factory.rb +7 -2
- data/lib/rookout/augs/aug_rate_limiter.rb +22 -20
- data/lib/rookout/com_ws/agent_com_ws.rb +6 -0
- data/lib/rookout/com_ws/information.rb +19 -2
- data/lib/rookout/com_ws/output.rb +4 -0
- data/lib/rookout/commit.rb +1 -1
- data/lib/rookout/config.rb +1 -1
- data/lib/rookout/logger.rb +5 -2
- data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +2 -0
- data/lib/rookout/services/tracer.rb +1 -1
- data/lib/rookout/utils.rb +11 -0
- data/lib/rookout/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71a48ffc9af42b9e823c1bb8511514e95954425a6ff43495b0f90f7defc98f9c
|
4
|
+
data.tar.gz: a525931c98fc3f8d23068f7d774a18c1b33b2edb756a1abea72a07efe8f2bef6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7fac6cf5a613e6dc45c6071d5c6f6e133568911fa1ee6a66e17e50e22c61523dcd0706c1126ea8390320137e44ca832cb78946c4c57c2608fee0b4d590755b2
|
7
|
+
data.tar.gz: baad1dcec8ec04456aeb993825e36b5025d9c901aaf56970709b51801b55e397f25be02e14153a31978433f8127576e02484af4cdfcb4f34229a22463524669a
|
data/lib/rookout/augs/aug.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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 @
|
23
|
+
if @has_quota
|
22
24
|
# Get current time
|
23
|
-
|
25
|
+
now_ns = Utils.time_to_nanoseconds start_time
|
24
26
|
|
25
27
|
# Calculate window keys
|
26
|
-
current_window_key =
|
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
|
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(
|
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
|
-
|
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
|
-
|
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 - (
|
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
|
84
|
-
|
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
|
@@ -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
|
data/lib/rookout/commit.rb
CHANGED
data/lib/rookout/config.rb
CHANGED
@@ -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 =
|
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
|
data/lib/rookout/logger.rb
CHANGED
@@ -113,8 +113,11 @@ module Rookout
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def build_handlers
|
116
|
-
|
117
|
-
|
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
|
|
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
|
data/lib/rookout/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.26
|
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-
|
11
|
+
date: 2021-09-14 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.
|
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.
|
82
|
+
version: 3.17.3
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: google-style
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|