network_resiliency 0.6.1 → 0.6.3

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: 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