faraday_throttler 0.0.2 → 0.0.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/lib/faraday_throttler/middleware.rb +28 -2
- data/lib/faraday_throttler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0751994072b42e01e211a07884eed4e8e1e3a2e9
|
4
|
+
data.tar.gz: 8591da828d84bf43b0bccff3df9785819529d999
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6393d8dc8915d6a9434ec83f85df65e19baff9d430da5ac0aed2be0383b5b5432e3d7c8f1566a63d54725d2a6e2f7d1b1b5fd4aac78cf120aed4a1f61e1ed06b
|
7
|
+
data.tar.gz: eaebf1976fcb54977e419f012f475de3ee0f2a7ec1b21b58e29a4afbb4827ec9635a5b20aa63e908b0716702acb355f6668b5ca784537e0ed81fb7e36dcb9628
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'timeout'
|
2
2
|
require 'faraday'
|
3
|
+
require 'logger'
|
3
4
|
require 'faraday_throttler/key_resolver'
|
4
5
|
require 'faraday_throttler/mem_lock'
|
5
6
|
require 'faraday_throttler/cache'
|
@@ -89,7 +90,18 @@ module FaradayThrottler
|
|
89
90
|
# Otherwise the fallback response will be returned.
|
90
91
|
# The main difference is that, when async: false, a fresh request will block until it gets data from the server.
|
91
92
|
# When async: true, a fresh request will try to respond with (possibly stale) cached data ASAP while the new response is cached in the background.
|
92
|
-
async: false
|
93
|
+
async: false,
|
94
|
+
|
95
|
+
# Pass your own Logger instance (for example Rails.logger in a Rails app).
|
96
|
+
# Defaults to STDOUT.
|
97
|
+
# http://ruby-doc.org/stdlib-2.1.0/libdoc/logger/rdoc/Logger.html
|
98
|
+
# Interface:
|
99
|
+
# #debug(msg String, &block)
|
100
|
+
# #warn(msg String, &block)
|
101
|
+
# #error(msg String, &block)
|
102
|
+
# #info(msg String, &block)
|
103
|
+
# #fatal(msg String, &block)
|
104
|
+
logger: Logger.new(STDOUT)
|
93
105
|
)
|
94
106
|
|
95
107
|
validate_dep! lock, :lock, :set
|
@@ -97,6 +109,7 @@ module FaradayThrottler
|
|
97
109
|
validate_dep! lock_key_resolver, :lock_key_resolver, :call
|
98
110
|
validate_dep! cache_key_resolver, :cache_key_resolver, :call
|
99
111
|
validate_dep! fallbacks, :fallbacks, :call
|
112
|
+
validate_dep! logger, :info, :error, :warn, :debug
|
100
113
|
|
101
114
|
@lock = lock
|
102
115
|
@cache = cache
|
@@ -108,6 +121,7 @@ module FaradayThrottler
|
|
108
121
|
@fallbacks = fallbacks
|
109
122
|
@gauge = gauge || Gauge.new(rate: @rate, wait: @wait)
|
110
123
|
@async = async
|
124
|
+
@logger = logger
|
111
125
|
validate_dep! @gauge, :gauge, :start, :update, :finish
|
112
126
|
|
113
127
|
super app
|
@@ -124,28 +138,32 @@ module FaradayThrottler
|
|
124
138
|
gauge.start cache_key, start
|
125
139
|
|
126
140
|
if lock.set(lock_key, gauge.rate(cache_key))
|
141
|
+
logger.debug logline(cache_key, "A.1. start backend request. async: #{async?}")
|
127
142
|
if async?
|
128
143
|
handle_async(request_env, cache_key, start)
|
129
144
|
else
|
130
145
|
handle_sync(request_env, cache_key, start)
|
131
146
|
end
|
132
147
|
else
|
148
|
+
logger.debug logline(cache_key, "A.2. lock already set. Wait for cache.")
|
133
149
|
serve_from_cache_or_fallback request_env, cache_key, start
|
134
150
|
end
|
135
151
|
end
|
136
152
|
|
137
153
|
private
|
138
|
-
attr_reader :app, :lock, :cache, :lock_key_resolver, :cache_key_resolver, :rate, :wait, :timeout, :fallbacks, :gauge
|
154
|
+
attr_reader :app, :lock, :cache, :lock_key_resolver, :cache_key_resolver, :rate, :wait, :timeout, :fallbacks, :gauge, :logger
|
139
155
|
|
140
156
|
def async?
|
141
157
|
@async
|
142
158
|
end
|
143
159
|
|
144
160
|
def handle_sync(request_env, cache_key, start)
|
161
|
+
logger.debug logline(cache_key, "B.1.1. handle sync. Timeout: #{timeout}")
|
145
162
|
with_timeout(timeout) {
|
146
163
|
fetch_and_cache(request_env, cache_key, start)
|
147
164
|
}
|
148
165
|
rescue ::Timeout::Error => e
|
166
|
+
logger.error logline(cache_key, "B.1.2. timeout error. Timeout: #{timeout}. Message: #{e.message}")
|
149
167
|
gauge.update cache_key, :timeout
|
150
168
|
serve_from_cache_or_fallback request_env, cache_key, start
|
151
169
|
end
|
@@ -153,6 +171,7 @@ module FaradayThrottler
|
|
153
171
|
def handle_async(request_env, cache_key, start)
|
154
172
|
Thread.new do
|
155
173
|
fetch_and_cache(request_env, cache_key, start)
|
174
|
+
logger.debug logline(cache_key, "B.2.1. finished async fetch and cache")
|
156
175
|
end
|
157
176
|
serve_from_cache_or_fallback request_env, cache_key, start
|
158
177
|
end
|
@@ -161,15 +180,18 @@ module FaradayThrottler
|
|
161
180
|
app.call(request_env).on_complete do |response_env|
|
162
181
|
cache.set cache_key, response_env
|
163
182
|
gauge.finish cache_key, :fresh
|
183
|
+
logger.debug logline(cache_key, "C.1.1. finished fetch and cache. Took #{Time.now - start}")
|
164
184
|
debug_headers response_env, :fresh, start
|
165
185
|
end
|
166
186
|
end
|
167
187
|
|
168
188
|
def serve_from_cache_or_fallback(request_env, cache_key, start)
|
169
189
|
if cached_response = cache.get(cache_key, gauge.wait(cache_key))
|
190
|
+
logger.debug logline(cache_key, "C.2.1. serving cached response. Took #{Time.now - start}")
|
170
191
|
gauge.finish cache_key, :cached
|
171
192
|
resp cached_response, :cached, start
|
172
193
|
else
|
194
|
+
logger.debug logline(cache_key, "C.2.2. no cached response. Serving fallback response")
|
173
195
|
gauge.finish cache_key, :fallback
|
174
196
|
resp fallbacks.call(request_env), :fallback, start
|
175
197
|
end
|
@@ -201,6 +223,10 @@ module FaradayThrottler
|
|
201
223
|
::Timeout.timeout(seconds, &block)
|
202
224
|
end
|
203
225
|
end
|
226
|
+
|
227
|
+
def logline(cache_key, line)
|
228
|
+
"[Throttler:#{cache_key}] #{line}"
|
229
|
+
end
|
204
230
|
end
|
205
231
|
|
206
232
|
Faraday::Middleware.register_middleware throttler: ->{ Middleware }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday_throttler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ismael Celis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|