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