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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/lib/network_resiliency/adapter/http.rb +3 -2
- data/lib/network_resiliency/adapter/redis.rb +1 -1
- data/lib/network_resiliency/syncer.rb +39 -0
- data/lib/network_resiliency/version.rb +1 -1
- data/lib/network_resiliency.rb +27 -20
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8052be9b61b7e5b4a1106fb70275a788ad70ac19369064863ba9e14a266f7271
|
4
|
+
data.tar.gz: 71c787616cd4d2da2e33cb49b9a41891940215afd978bb33d1efdeb6be6e0d88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5140b18fff31f7dd33da2cdc158b89c1e7e573f85ada027fea92adfe9f7a43cf2ac64889269cae102409e7d62aa89183ef11ba803e9c1e91d2d00478e0d9d7fd
|
7
|
+
data.tar.gz: 4bcba60c3a1d0737f5765f8043939f9a6557bd0946afc18b266d418749abf7f8b3f7cb3b9bbc68b7dc92ff8d28b21750927a91331d882f1b1afefc967ddfaa48
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -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)
|
@@ -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
|
data/lib/network_resiliency.rb
CHANGED
@@ -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
|
-
|
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.
|
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-
|
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
|