garage_client 2.3.3 → 2.4.4
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 +5 -5
- data/.travis.yml +4 -2
- data/CHANGELOG.md +17 -0
- data/README.md +16 -1
- data/garage_client.gemspec +1 -3
- data/lib/garage_client.rb +0 -1
- data/lib/garage_client/cachers/base.rb +7 -1
- data/lib/garage_client/client.rb +14 -3
- data/lib/garage_client/railtie.rb +7 -1
- data/lib/garage_client/request/propagate_request_id.rb +2 -2
- data/lib/garage_client/resource.rb +12 -1
- data/lib/garage_client/version.rb +1 -1
- data/spec/features/tracing_spec.rb +83 -0
- data/spec/garage_client/cacher_spec.rb +2 -6
- data/spec/garage_client/request/propagate_request_id_spec.rb +4 -4
- data/spec/garage_client/resource_spec.rb +6 -0
- data/spec/spec_helper.rb +1 -1
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 580980067ed04267e85d03e5a9f0fdfef39ebac8142e9110a9bc42f622e2fb02
|
4
|
+
data.tar.gz: 59bc77a7d6499d2f22e7bb3434b0756d2315abfe104cbd883bef653fe2cda52b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a7cba1f1cba35a7bf16bb0c2f00bbcb046a759ed372bddea33878a355bef8a7e39f8b9914645d2d25e86a36e66544632122b186b966afc7f37527d469fb3518
|
7
|
+
data.tar.gz: e58414b3291d9b60dae0d7d82f516e7b587b9005facc1b2f889a6fa0f3632111109f2cac3e434c68409765f7d31a8c7f4f12bc9f0e7c4a8de45b0622581f6c43
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 2.4.4
|
2
|
+
- Remove activesupport dependency
|
3
|
+
- Fix request ID not being propagated
|
4
|
+
|
5
|
+
## 2.4.3
|
6
|
+
- Support query methods on GarageClient::Resource
|
7
|
+
- Use Module#module_parent_name for Rails 6.0
|
8
|
+
|
9
|
+
## 2.4.2
|
10
|
+
- Fixes for latest aws-xray gem. Require `aws/xray/faraday`.
|
11
|
+
|
12
|
+
## 2.4.1
|
13
|
+
- Record http request/response even if API returns errors.
|
14
|
+
|
15
|
+
## 2.4.0
|
16
|
+
- Support distributed tracing.
|
17
|
+
|
1
18
|
## 2.3.3
|
2
19
|
- Fix a bug to not resolve application name when garage_client-rails is bundled.
|
3
20
|
- Stop to support ruby version < 2.2.2.
|
data/README.md
CHANGED
@@ -93,10 +93,12 @@ There are the following options:
|
|
93
93
|
- `adapter` - faraday adapter for http client (default: `:net_http`)
|
94
94
|
- `cacher` - take a cacher class in which caching logic is defined (default: nil)
|
95
95
|
- `name` - Client's application name, which is embedded in User-Agent by default (default: nil. For Rails, `Rails.application.class.parent_name.underscore` is set by default.)
|
96
|
+
- `name` must be configured globally.
|
96
97
|
- `headers` - default http headers (default: `{ "Accept" => "application/json", "User-Agent" => "garage_client #{VERSION} #{name}" }`)
|
97
98
|
- `endpoint` - Garage application API endpoint (default: nil)
|
98
99
|
- `path_prefix` - API path prefix (default: `'/v1'`)
|
99
100
|
- `verbose` - Enable verbose http log (default: `false`)
|
101
|
+
- `tracing` - (client instance only) Enable distributed tracing and set a logical name of the down stream service. See detail in "Tracing" section below.
|
100
102
|
|
101
103
|
You can configure the global settings:
|
102
104
|
|
@@ -115,7 +117,6 @@ client = GarageClient::Client.new(
|
|
115
117
|
adapter: :test,
|
116
118
|
headers: { "Host" => "garage.example.com" },
|
117
119
|
endpoint: "http://localhost:3000",
|
118
|
-
name: 'my-awesome-client',
|
119
120
|
path_prefix: "/v2",
|
120
121
|
verbose: true,
|
121
122
|
)
|
@@ -199,3 +200,17 @@ end
|
|
199
200
|
|
200
201
|
GarageClient::Client.new(cacher: MyCacher)
|
201
202
|
```
|
203
|
+
|
204
|
+
## Tracing
|
205
|
+
GarageClient supports distributed tracing. To enable tracing, specify `tracing.tracer` option for `GarageClient::Client` instance.
|
206
|
+
Choose one of supported tracers from below. If you want to add new tracer, please give us a PR.
|
207
|
+
|
208
|
+
### aws-xray
|
209
|
+
Bundle [aws-xray](https://github.com/taiki45/aws-xray) gem in your `Gemfile`, then configure `GarageClient::Client` instance with `tracing.service` option:
|
210
|
+
|
211
|
+
```ruby
|
212
|
+
require 'aws/xray/faraday'
|
213
|
+
GarageClient::Client.new(..., tracing: { tracer: 'aws-xray', service: 'user' })
|
214
|
+
```
|
215
|
+
|
216
|
+
`service` will be `name` of the sub segments.
|
data/garage_client.gemspec
CHANGED
@@ -16,14 +16,11 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.authors = ['Cookpad Inc.']
|
17
17
|
s.email = ['kaihatsu@cookpad.com']
|
18
18
|
|
19
|
-
s.add_dependency 'activesupport', '> 3.2.0'
|
20
19
|
s.add_dependency 'faraday', '>= 0.8.0'
|
21
20
|
s.add_dependency 'faraday_middleware'
|
22
21
|
s.add_dependency 'hashie', '>= 1.2.0'
|
23
22
|
s.add_dependency 'link_header'
|
24
23
|
|
25
|
-
s.add_dependency 'system_timer' if RUBY_VERSION < '1.9'
|
26
|
-
|
27
24
|
s.add_development_dependency "rails"
|
28
25
|
s.add_development_dependency "rake", ">= 0.9.2"
|
29
26
|
s.add_development_dependency "rspec"
|
@@ -32,4 +29,5 @@ Gem::Specification.new do |s|
|
|
32
29
|
s.add_development_dependency "pry"
|
33
30
|
# Until bug fixed: https://github.com/colszowka/simplecov/issues/281
|
34
31
|
s.add_development_dependency "simplecov", "~> 0.7.1"
|
32
|
+
s.add_development_dependency "aws-xray", ">= 0.30.0"
|
35
33
|
end
|
data/lib/garage_client.rb
CHANGED
@@ -11,7 +11,13 @@ module GarageClient
|
|
11
11
|
if response
|
12
12
|
# Faraday::Response#marshal_dump is drop request object and url
|
13
13
|
# https://github.com/lostisland/faraday/blob/edacd5eb57ea13accab3097649690ae5f48f421a/lib/faraday/response.rb#L74
|
14
|
-
|
14
|
+
#
|
15
|
+
# XXX: We can't use #merge! here because Faraday::Env does not implement
|
16
|
+
# the method as same as Hash#merge! with Faraday v0.12.1.
|
17
|
+
@env.each do |k, v|
|
18
|
+
original = response.env[k]
|
19
|
+
response.env[k] = v if !original && v
|
20
|
+
end
|
15
21
|
else
|
16
22
|
response = yield
|
17
23
|
store.write(key, response, options) if written_to_cache?
|
data/lib/garage_client/client.rb
CHANGED
@@ -20,6 +20,7 @@ module GarageClient
|
|
20
20
|
property :path_prefix
|
21
21
|
property :verbose
|
22
22
|
|
23
|
+
# @option opts [Hash] :tracing enable tracing. See README for detail.
|
23
24
|
def initialize(options = {})
|
24
25
|
require_necessaries(options)
|
25
26
|
@options = options
|
@@ -69,6 +70,19 @@ module GarageClient
|
|
69
70
|
builder.use GarageClient::Request::JsonEncoded
|
70
71
|
builder.use GarageClient::Request::PropagateRequestId
|
71
72
|
|
73
|
+
# Tracing Middlewares
|
74
|
+
if options[:tracing]
|
75
|
+
case options[:tracing][:tracer]
|
76
|
+
when 'aws-xray'
|
77
|
+
service = options[:tracing][:service]
|
78
|
+
raise 'Configure target service name with `tracing.service`' unless service
|
79
|
+
require 'aws/xray/faraday'
|
80
|
+
builder.use Aws::Xray::Faraday, service
|
81
|
+
else
|
82
|
+
raise "`tracing` option specified but GarageClient does not support the tracer: #{options[:tracing][:tracer]}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
72
86
|
# Low-level Middlewares
|
73
87
|
apply_auth_middleware builder
|
74
88
|
builder.adapter(*adapter)
|
@@ -85,9 +99,6 @@ module GarageClient
|
|
85
99
|
if !options[:endpoint] && !default_options.endpoint
|
86
100
|
raise "Missing endpoint configuration"
|
87
101
|
end
|
88
|
-
if !options[:name] && !default_options.name
|
89
|
-
raise "Missing name configuration"
|
90
|
-
end
|
91
102
|
end
|
92
103
|
|
93
104
|
def default_options
|
@@ -9,7 +9,13 @@ module GarageClient
|
|
9
9
|
def self.set_default_name
|
10
10
|
unless GarageClient.configuration.options[:name]
|
11
11
|
GarageClient.configure do |c|
|
12
|
-
|
12
|
+
klass = ::Rails.application.class
|
13
|
+
parent_name = if klass.respond_to?(:module_parent_name)
|
14
|
+
klass.module_parent_name
|
15
|
+
else
|
16
|
+
klass.parent_name
|
17
|
+
end
|
18
|
+
c.name = parent_name.underscore
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
@@ -2,8 +2,8 @@ module GarageClient
|
|
2
2
|
module Request
|
3
3
|
class PropagateRequestId < Faraday::Middleware
|
4
4
|
def call(env)
|
5
|
-
if Thread.current[:request_id] && !env[:request_headers]["
|
6
|
-
env[:request_headers]["
|
5
|
+
if Thread.current[:request_id] && !env[:request_headers]["X-Request-Id"]
|
6
|
+
env[:request_headers]["X-Request-Id"] = Thread.current[:request_id]
|
7
7
|
end
|
8
8
|
@app.call(env)
|
9
9
|
end
|
@@ -41,6 +41,8 @@ module GarageClient
|
|
41
41
|
else
|
42
42
|
value
|
43
43
|
end
|
44
|
+
elsif query_method?(name)
|
45
|
+
data.__send__(name)
|
44
46
|
elsif links.include?(name)
|
45
47
|
path = data._links[name].href
|
46
48
|
client.get(path, *args)
|
@@ -53,11 +55,20 @@ module GarageClient
|
|
53
55
|
end
|
54
56
|
|
55
57
|
def respond_to_missing?(name, include_private)
|
56
|
-
!!(properties.include?(name) || links.include?(name) || nested_resource_creation_method?(name))
|
58
|
+
!!(properties.include?(name) || query_method?(name) || links.include?(name) || nested_resource_creation_method?(name))
|
57
59
|
end
|
58
60
|
|
59
61
|
def nested_resource_creation_method?(name)
|
60
62
|
!!(name =~ /\Acreate_(.+)\z/ && links.include?($1.to_sym))
|
61
63
|
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def query_method?(name)
|
68
|
+
if name.to_s.end_with?('?')
|
69
|
+
key = name.to_s[0..-2]
|
70
|
+
properties.include?(key.to_sym)
|
71
|
+
end
|
72
|
+
end
|
62
73
|
end
|
63
74
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/xray'
|
3
|
+
|
4
|
+
RSpec.describe 'Tracing support' do
|
5
|
+
context 'when `tracing` option is specified' do
|
6
|
+
around do |ex|
|
7
|
+
Aws::Xray.config.client_options = { sock: io }
|
8
|
+
Aws::Xray.config.sampling_rate = 1
|
9
|
+
Aws::Xray.trace(name: 'test-app') { ex.run }
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:io) { Aws::Xray::TestSocket.new }
|
13
|
+
let(:client) do
|
14
|
+
GarageClient::Client.new(
|
15
|
+
adapter: [:test, stubs],
|
16
|
+
endpoint: 'http://127.0.0.1',
|
17
|
+
tracing: {
|
18
|
+
tracer: 'aws-xray',
|
19
|
+
service: 'target-app',
|
20
|
+
},
|
21
|
+
)
|
22
|
+
end
|
23
|
+
let(:stubs) do
|
24
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
25
|
+
stub.get('/campaign') { |env| [200, {'Content-Type' => 'application/json'}, '{"campaign": false}'] }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
specify 'client enables tracing and sends trace data to a local agent' do
|
30
|
+
res = client.get('/campaign')
|
31
|
+
expect(res.body.campaign).to eq(false)
|
32
|
+
|
33
|
+
io.rewind
|
34
|
+
sent_jsons = io.read.split("\n")
|
35
|
+
expect(sent_jsons.size).to eq(2)
|
36
|
+
body = JSON.parse(sent_jsons[1])
|
37
|
+
expect(body['name']).to eq('target-app')
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'API returns client errors' do
|
41
|
+
let(:stubs) do
|
42
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
43
|
+
stub.get('/campaign') { |env| [404, {'Content-Type' => 'application/json'}, '{"error": "not_found"}'] }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
specify 'client traces HTTP request and response and records errors' do
|
48
|
+
expect { client.get('/campaign') }.to raise_error(GarageClient::NotFound)
|
49
|
+
|
50
|
+
io.rewind
|
51
|
+
sent_jsons = io.read.split("\n")
|
52
|
+
expect(sent_jsons.size).to eq(2)
|
53
|
+
body = JSON.parse(sent_jsons[1])
|
54
|
+
expect(body['name']).to eq('target-app')
|
55
|
+
expect(body['error']).to eq(true)
|
56
|
+
expect(body['http']['request']['method']).to eq('GET')
|
57
|
+
expect(body['http']['response']['status']).to eq(404)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'API returns server errors' do
|
62
|
+
let(:stubs) do
|
63
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
64
|
+
stub.get('/campaign') { |env| [500, {'Content-Type' => 'application/json'}, '{"error": "internal_server_error"}'] }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
specify 'client traces HTTP request and response and marks as fault' do
|
69
|
+
expect { client.get('/campaign') }.to raise_error(GarageClient::InternalServerError)
|
70
|
+
|
71
|
+
io.rewind
|
72
|
+
sent_jsons = io.read.split("\n")
|
73
|
+
expect(sent_jsons.size).to eq(2)
|
74
|
+
body = JSON.parse(sent_jsons[1])
|
75
|
+
expect(body['name']).to eq('target-app')
|
76
|
+
expect(body['error']).to eq(false)
|
77
|
+
expect(body['fault']).to eq(true)
|
78
|
+
expect(body['http']['request']['method']).to eq('GET')
|
79
|
+
expect(body['http']['response']['status']).to eq(500)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -64,10 +64,6 @@ describe GarageClient::Cachers::Base do
|
|
64
64
|
|
65
65
|
# Check dump data. Because cache data not broken on the version up of faraday.
|
66
66
|
describe "check Faraday::Response marshal" do
|
67
|
-
specify do
|
68
|
-
expect(Faraday::VERSION).to be < "1.0.0", "This spec is no longer needed. Delete this 'describe' section!"
|
69
|
-
end
|
70
|
-
|
71
67
|
context "v0.9.1's marshal data" do
|
72
68
|
let(:res) do
|
73
69
|
Marshal.load(File.read(File.expand_path('../fixtures/faraday_0.9.1_response.dump', __dir__)))
|
@@ -75,7 +71,7 @@ describe GarageClient::Cachers::Base do
|
|
75
71
|
|
76
72
|
it "load data" do
|
77
73
|
expect(res).to be_instance_of Faraday::Response
|
78
|
-
expect(res.env[:body]).to eq fixture("example.yaml")[
|
74
|
+
expect(res.env[:body]).to eq fixture("example.yaml")["body"]
|
79
75
|
end
|
80
76
|
end
|
81
77
|
|
@@ -86,7 +82,7 @@ describe GarageClient::Cachers::Base do
|
|
86
82
|
|
87
83
|
it "load data" do
|
88
84
|
expect(res).to be_instance_of Faraday::Response
|
89
|
-
expect(res.env[:body]).to eq fixture("example.yaml")[
|
85
|
+
expect(res.env[:body]).to eq fixture("example.yaml")["body"]
|
90
86
|
end
|
91
87
|
end
|
92
88
|
end
|
@@ -13,7 +13,7 @@ describe GarageClient::Request::PropagateRequestId do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'sends request_id via header' do
|
16
|
-
stub_get("/examples").with(headers: { '
|
16
|
+
stub_get("/examples").with(headers: { 'X-Request-Id' => 'request_id' })
|
17
17
|
expect { client.get("/examples") }.not_to raise_error
|
18
18
|
end
|
19
19
|
|
@@ -24,7 +24,7 @@ describe GarageClient::Request::PropagateRequestId do
|
|
24
24
|
|
25
25
|
it 'does not send request_id via header' do
|
26
26
|
stub_get("/examples").with do |request|
|
27
|
-
!request.headers.include?('
|
27
|
+
!request.headers.include?('X-Request-Id')
|
28
28
|
end
|
29
29
|
expect { client.get("/examples") }.not_to raise_error
|
30
30
|
end
|
@@ -32,11 +32,11 @@ describe GarageClient::Request::PropagateRequestId do
|
|
32
32
|
|
33
33
|
context 'if already has request_id' do
|
34
34
|
let(:client) do
|
35
|
-
GarageClient::Client.new(headers: { '
|
35
|
+
GarageClient::Client.new(headers: { 'X-Request-Id' => 'another_id' })
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'does not overwrite request_id' do
|
39
|
-
stub_get("/examples").with(headers: { '
|
39
|
+
stub_get("/examples").with(headers: { 'X-Request-Id' => 'another_id' })
|
40
40
|
expect { client.get("/examples") }.not_to raise_error
|
41
41
|
end
|
42
42
|
end
|
@@ -84,6 +84,12 @@ describe GarageClient::Resource do
|
|
84
84
|
resource.user.should be_kind_of(GarageClient::Resource)
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
context 'with property query' do
|
89
|
+
it 'returns presence' do
|
90
|
+
resource.name?.should == true
|
91
|
+
end
|
92
|
+
end
|
87
93
|
end
|
88
94
|
|
89
95
|
describe 'link' do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garage_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cookpad Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activesupport
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 3.2.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 3.2.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: faraday
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +164,20 @@ dependencies:
|
|
178
164
|
- - "~>"
|
179
165
|
- !ruby/object:Gem::Version
|
180
166
|
version: 0.7.1
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: aws-xray
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.30.0
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.30.0
|
181
181
|
description: Ruby client library for the Garage API
|
182
182
|
email:
|
183
183
|
- kaihatsu@cookpad.com
|
@@ -210,6 +210,7 @@ files:
|
|
210
210
|
- lib/garage_client/response/raise_http_exception.rb
|
211
211
|
- lib/garage_client/version.rb
|
212
212
|
- spec/features/configuration_spec.rb
|
213
|
+
- spec/features/tracing_spec.rb
|
213
214
|
- spec/fixtures/example.yaml
|
214
215
|
- spec/fixtures/examples.yaml
|
215
216
|
- spec/fixtures/examples_dictionary.yaml
|
@@ -245,13 +246,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
246
|
- !ruby/object:Gem::Version
|
246
247
|
version: '0'
|
247
248
|
requirements: []
|
248
|
-
|
249
|
-
rubygems_version: 2.5.1
|
249
|
+
rubygems_version: 3.1.4
|
250
250
|
signing_key:
|
251
251
|
specification_version: 4
|
252
252
|
summary: Ruby client library for the Garage API
|
253
253
|
test_files:
|
254
254
|
- spec/features/configuration_spec.rb
|
255
|
+
- spec/features/tracing_spec.rb
|
255
256
|
- spec/fixtures/example.yaml
|
256
257
|
- spec/fixtures/examples.yaml
|
257
258
|
- spec/fixtures/examples_dictionary.yaml
|