network_resiliency 0.6.1 → 0.6.3

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: a94a624ababefe0045c52a57be145826d8072f8367d494afdef4892eb81af066
4
- data.tar.gz: dc1412ead0b212c14d1707236cb76b5d19935ab6d9562cee01ef6a761c70bcb5
3
+ metadata.gz: 8052be9b61b7e5b4a1106fb70275a788ad70ac19369064863ba9e14a266f7271
4
+ data.tar.gz: 71c787616cd4d2da2e33cb49b9a41891940215afd978bb33d1efdeb6be6e0d88
5
5
  SHA512:
6
- metadata.gz: 2db8772835afb0358179255e94960499fbfa4bcebcd6bba532e38a0a533b658e9dfd2a94a12de5d7ef29aef372d671e14d04a226b19acddc1621d80617056d7a
7
- data.tar.gz: b9aa489ff41eecde7aa9bee4e0b8377a8952827dff9a0911272d987bd487fb4b5bdcde02974414bc6ad25b7c6490585282baa4dd189e66a76d5b549743af088f
6
+ metadata.gz: 5140b18fff31f7dd33da2cdc158b89c1e7e573f85ada027fea92adfe9f7a43cf2ac64889269cae102409e7d62aa89183ef11ba803e9c1e91d2d00478e0d9d7fd
7
+ data.tar.gz: 4bcba60c3a1d0737f5765f8043939f9a6557bd0946afc18b266d418749abf7f8b3f7cb3b9bbc68b7dc92ff8d28b21750927a91331d882f1b1afefc967ddfaa48
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### v0.6.3 (2023-11-27)
2
+ - custom request normalization
3
+
4
+ ### v0.6.2 (2023-11-26)
5
+ - syncer
6
+ - redis without_reconnect
7
+
1
8
  ### v0.6.1 (2023-11-21)
2
9
  - bugfix
3
10
  - redis system errors
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- network_resiliency (0.6.1)
4
+ network_resiliency (0.6.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,15 +17,16 @@ module NetworkResiliency
17
17
 
18
18
  ID_REGEX = %r{/[0-9]+(?=/|$)}.freeze
19
19
  UUID_REGEX = %r`/\h{8}-\h{4}-(\h{4})-\h{4}-\h{12}(?=/|$)`.freeze
20
+
20
21
  refine Net::HTTP do
21
22
  def normalize_path(path)
22
- path.gsub(
23
+ NetworkResiliency.normalize_request(:http, path).gsub(
23
24
  Regexp.union(
24
25
  NetworkResiliency::Adapter::HTTP::ID_REGEX,
25
26
  NetworkResiliency::Adapter::HTTP::UUID_REGEX,
26
27
  ),
27
28
  '/x',
28
- )
29
+ ).gsub(%r{//+}, "/")
29
30
  end
30
31
 
31
32
  def with_resilience(action, destination, idempotent, &block)
@@ -82,7 +82,7 @@ module NetworkResiliency
82
82
 
83
83
  @options[timeout_key] = timeouts.shift
84
84
 
85
- yield
85
+ without_reconnect { yield }
86
86
  rescue ::Redis::BaseConnectionError, SystemCallError => e
87
87
  # capture error
88
88
 
@@ -0,0 +1,39 @@
1
+ module NetworkResiliency
2
+ class Syncer < Thread
3
+ class << self
4
+ def start(redis)
5
+ @instance&.shutdown
6
+ @instance = new(redis)
7
+ end
8
+
9
+ def stop
10
+ @instance&.shutdown
11
+ @instance = nil
12
+ end
13
+ end
14
+
15
+ def initialize(redis)
16
+ @redis = redis
17
+
18
+ super { sync }
19
+ end
20
+
21
+ def shutdown
22
+ @shutdown = true
23
+
24
+ # prevent needless delay
25
+ raise Interrupt if status == "sleep"
26
+ end
27
+
28
+ private
29
+
30
+ def sync
31
+ until @shutdown
32
+ StatsEngine.sync(@redis)
33
+
34
+ sleep(3)
35
+ end
36
+ rescue Interrupt
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module NetworkResiliency
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.3"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require "network_resiliency/refinements"
2
2
  require "network_resiliency/stats"
3
3
  require "network_resiliency/stats_engine"
4
+ require "network_resiliency/syncer"
4
5
  require "network_resiliency/version"
5
6
 
6
7
  using NetworkResiliency::Refinements
@@ -14,6 +15,7 @@ module NetworkResiliency
14
15
  autoload :Postgres, "network_resiliency/adapter/postgres"
15
16
  end
16
17
 
18
+ ADAPTERS = [ :http, :faraday, :redis, :mysql, :postgres ].freeze
17
19
  MODE = [ :observe, :resilient ].freeze
18
20
  RESILIENCY_SIZE_THRESHOLD = 1_000
19
21
 
@@ -24,7 +26,7 @@ module NetworkResiliency
24
26
  def configure
25
27
  yield self if block_given?
26
28
 
27
- start_syncing if redis
29
+ Syncer.start(redis) if redis
28
30
  end
29
31
 
30
32
  def patch(*adapters)
@@ -102,6 +104,28 @@ module NetworkResiliency
102
104
  @mode = mode
103
105
  end
104
106
 
107
+ def normalize_request(adapter, request = nil, &block)
108
+ unless ADAPTERS.include?(adapter)
109
+ raise ArgumentError, "invalid adapter: #{adapter}"
110
+ end
111
+
112
+ if request && block_given?
113
+ raise ArgumentError, "specify request or block, but not both"
114
+ end
115
+
116
+ @normalize_request ||= {}
117
+ @normalize_request[adapter] ||= []
118
+ @normalize_request[adapter] << block if block_given?
119
+
120
+ if request
121
+ @normalize_request[adapter].reduce(request) do |req, block|
122
+ block.call(req)
123
+ end
124
+ else
125
+ @normalize_request[adapter]
126
+ end
127
+ end
128
+
105
129
  # private
106
130
 
107
131
  def record(adapter:, action:, destination:, duration:, error:, timeout:, attempts: 1)
@@ -290,13 +314,10 @@ module NetworkResiliency
290
314
  def reset
291
315
  @enabled = nil
292
316
  @mode = nil
317
+ @normalize_request = nil
293
318
  Thread.current["network_resiliency"] = nil
294
319
  StatsEngine.reset
295
-
296
- if @sync_worker
297
- @sync_worker.kill
298
- @sync_worker = nil
299
- end
320
+ Syncer.stop
300
321
  end
301
322
 
302
323
  # private
@@ -304,18 +325,4 @@ module NetworkResiliency
304
325
  def thread_state
305
326
  Thread.current["network_resiliency"] ||= {}
306
327
  end
307
-
308
- def start_syncing
309
- @sync_worker.kill if @sync_worker
310
-
311
- raise "Redis not configured" unless redis
312
-
313
- @sync_worker = Thread.new do
314
- loop do
315
- StatsEngine.sync(redis)
316
-
317
- sleep(3)
318
- end
319
- end
320
- end
321
328
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: network_resiliency
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-21 00:00:00.000000000 Z
11
+ date: 2023-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -198,6 +198,7 @@ files:
198
198
  - lib/network_resiliency/refinements.rb
199
199
  - lib/network_resiliency/stats.rb
200
200
  - lib/network_resiliency/stats_engine.rb
201
+ - lib/network_resiliency/syncer.rb
201
202
  - lib/network_resiliency/version.rb
202
203
  - network_resiliency.gemspec
203
204
  homepage: https://github.com/dpep/network_resiliency_rb