rookout 0.1.24 → 0.1.25

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: 74fa18f4c9039ebbfe3b13b7925213882bfe694e1084854d0e9765da7f9e89de
4
- data.tar.gz: 9648b79a995a4ab76b80e4fec26a4f9208c2d5ed5aa1dca2f32fbfd07cd69d90
3
+ metadata.gz: a2bdf85b56744c08bb1dbd03f5e877a1e5ff9408f10f7ebc496c90616630d782
4
+ data.tar.gz: 8f8fd300f8ef303fb3f2ef136687ecb408aa490588af126d4ce0a6702932a948
5
5
  SHA512:
6
- metadata.gz: 9eb0e942f1522c6f13e190921ac5fdb895533ddb216dbe4a2e6920971e2281760a4c61e74eb975bf0144a73d3432222a5c9b485c1895290433ffc694f2ed2dd1
7
- data.tar.gz: c21492f79edeb64879b18590934f31cfd366b61b63fd3d16744531e5c9ae7513339aff468bf3ac6055d534e3298d18d946023ffd9cb3b436dc0500060aabba63
6
+ metadata.gz: 6e82f777a0498faee329e943cceed997111f1cb0ea75e9103294aac7b0cc53c4bd05d0af4060f748869159a1179586b0c8b0337b3652e83682f033fe2c3323a5
7
+ data.tar.gz: a765e0817ae1d2959a90c6c13902b42bb02566b1d5c1a7932fb2ca044c1c3fd1ea5882804555dca0d9c2afd6052aaa52d2dc178323b19302f0ebe8b28a25a1e2
@@ -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,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
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- COMMIT = "9ab942ecb3c996d6e4fc6516d79a95aa15bd1c95".freeze
2
+ COMMIT = "940d70afca76883c64c4a1e2892bfbca591e9cee".freeze
3
3
  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
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.24".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.24
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-07-25 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