the_garage 2.3.3 → 2.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a9ee99351350b8a8ee6000590003952aebc06515
4
- data.tar.gz: eba9c748cfe782a481a799857c633d663ac99e54
3
+ metadata.gz: df6a793861e979f1a7849b0d6ef3ef5764757980
4
+ data.tar.gz: df87e84d9f87372c8c2061d4aafabd6849d89b52
5
5
  SHA512:
6
- metadata.gz: 864aaa96191d81364a174f95ac5779578392d928a7c76bb8edefeb7b12df748e2b40cb3aced29415a7eba84520b161ce866dad8fceac143f1d4c0bb38b536afd
7
- data.tar.gz: bcd8e23f4aaa5728b6995bb41a83d24ad7420756b206eedee28579253aaebe67812ca26f203ef8fd8a219c4db5f695fece39989e85e9b14b19c1bb6d01fe5fc8
6
+ metadata.gz: 996522903af5c5b250cb7a99f41a8ed095a23c17b36076cd8bf34409b16d02b4f5ec6196b357238b1726452d8ceba415b481d4f2f56abbc7c19997972a557c97
7
+ data.tar.gz: c96ace465cac6ade9d7b477ab3c58b457b660e709067490213154f5b017392ca717b87980dd7058ada25ede679ad2de6c2d17ab43b20dbaf9259264c58e5b6a6
data/README.md CHANGED
@@ -47,9 +47,15 @@ class Employee < ActiveRecord::Base
47
47
  end
48
48
  ```
49
49
 
50
- In your controller class:
50
+ In your controller classes:
51
51
 
52
52
  ```ruby
53
+ class ApplicationController < ActionController::Base
54
+ include Garage::ControllerHelper
55
+
56
+ # ...
57
+ end
58
+
53
59
  class EmployeesController < ApplicationController
54
60
  include Garage::RestfulActions
55
61
 
@@ -181,6 +187,21 @@ module MyStrategy
181
187
  end
182
188
  ```
183
189
 
190
+ ## Distributed tracing
191
+ In case you use auth-server strategy, you can setup distributed tracing for the service communication between garage application and auth server.
192
+ Currently, we support following tracers:
193
+
194
+ - `aws-xray` using [aws-xray](https://github.com/taiki45/aws-xray) gem.
195
+ - Bundle `aws-xray` gem in your application.
196
+ - Configure `service` option for a logical service name of the auth server.
197
+
198
+ ```ruby
199
+ # e.g. aws-xray tracer
200
+ require 'aws/xray'
201
+ Garage::Tracer::AwsXrayTracer.service = 'your-auth-server-name'
202
+ Garage.configuration.tracer = Garage::Tracer::AwsXrayTracer
203
+ ```
204
+
184
205
  ## Development
185
206
 
186
207
  See [DEVELOPMENT.md](DEVELOPMENT.md).
data/lib/garage/config.rb CHANGED
@@ -36,6 +36,14 @@ module Garage
36
36
  instance_variable_defined?(:@strategy) ? @strategy : Garage::Strategy::NoAuthentication
37
37
  end
38
38
 
39
+ # Support distributed tracing for auth server accesses.
40
+ #
41
+ # @param [Ojbect] tracer an object which implements tracer methods. See Garage::Tracer::NullTracer.
42
+ attr_writer :tracer
43
+ def tracer
44
+ @tracer ||= Garage::Tracer::NullTracer
45
+ end
46
+
39
47
  def docs
40
48
  @docs ||= Docs::Config.new
41
49
  end
@@ -2,6 +2,8 @@ require 'json'
2
2
  require 'net/http'
3
3
  require 'uri'
4
4
 
5
+ require 'garage/tracer'
6
+
5
7
  module Garage
6
8
  module Strategy
7
9
  module AuthServer
@@ -71,8 +73,13 @@ module Garage
71
73
  private
72
74
 
73
75
  def get
74
- raw = http_client.get(path_with_query, header)
75
- Response.new(raw)
76
+ Tracer.start do |tracer|
77
+ request_header = tracer.inject_trace_context(header)
78
+ tracer.record_http_request('GET', uri.to_s, request_header['User-Agent'])
79
+ raw = http_client.get(path_with_query, request_header)
80
+ tracer.record_http_response(raw.code.to_i, raw['Content-Length'] || 0)
81
+ Response.new(raw)
82
+ end
76
83
  end
77
84
 
78
85
  def header
@@ -0,0 +1,89 @@
1
+ module Garage
2
+ module Tracer
3
+ extend self
4
+ extend Forwardable
5
+
6
+ def_delegators :tracer, :start, :inject_trace_context, :record_http_request, :record_http_response
7
+
8
+ private
9
+
10
+ def tracer
11
+ Garage.configuration.tracer
12
+ end
13
+
14
+ # Any tracers must have `.start` to start tracing context and:
15
+ # - `#inject_trace_context` to add tracing context to the given request header.
16
+ # - `#record_http_request` to record http request in tracer.
17
+ # - `#record_http_response` to recrod http response in tracer.
18
+ class NullTracer
19
+ def self.start(&block)
20
+ yield new
21
+ end
22
+
23
+ # @param [Hash] header
24
+ # @return [Hash]
25
+ def inject_trace_context(header)
26
+ header
27
+ end
28
+
29
+ # @param [String] method
30
+ # @param [String] url
31
+ # @param [String] user_agent
32
+ # @return [nil]
33
+ def record_http_request(method, url, user_agent)
34
+ end
35
+
36
+ # @param [Integer] status
37
+ # @param [Integer] content_length
38
+ def record_http_response(status, content_length)
39
+ end
40
+ end
41
+
42
+ class AwsXrayTracer
43
+ class << self
44
+ attr_accessor :service
45
+ end
46
+
47
+ def self.start(&block)
48
+ if Aws::Xray::Context.started?
49
+ Aws::Xray::Context.current.child_trace(remote: true, name: service) do |sub|
50
+ yield new(sub)
51
+ end
52
+ else
53
+ yield NullTracer.new
54
+ end
55
+ end
56
+
57
+ def initialize(sub_segment)
58
+ @sub = sub_segment
59
+ end
60
+
61
+ def inject_trace_context(header)
62
+ header.merge('X-Amzn-Trace-Id' => @sub.generate_trace.to_header_value)
63
+ end
64
+
65
+ def record_http_request(method, url, user_agent)
66
+ request = Aws::Xray::Request.build(method: method.to_s.upcase, url: url, user_agent: user_agent)
67
+ @sub.set_http_request(request)
68
+ end
69
+
70
+ def record_http_response(status, content_length)
71
+ @sub.set_http_response(status, content_length || 0)
72
+
73
+ case status
74
+ when 499
75
+ cause = Aws::Xray::Cause.new(stack: caller, message: 'Got 499', type: 'http_request_error')
76
+ @sub.set_error(error: true, throttle: true, cause: cause)
77
+ when 400..498
78
+ cause = Aws::Xray::Cause.new(stack: caller, message: 'Got 4xx', type: 'http_request_error')
79
+ @sub.set_error(error: true, cause: cause)
80
+ when 500..599
81
+ cause = Aws::Xray::Cause.new(stack: caller, message: 'Got 5xx', type: 'http_request_error')
82
+ @sub.set_error(fault: true, remote: true, cause: cause)
83
+ else
84
+ # pass
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,3 +1,3 @@
1
1
  module Garage
2
- VERSION = '2.3.3'
2
+ VERSION = '2.4.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: the_garage
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuhiko Miyagawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-01 00:00:00.000000000 Z
11
+ date: 2017-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -247,11 +247,13 @@ files:
247
247
  - lib/garage/strategy/test.rb
248
248
  - lib/garage/test/migrator.rb
249
249
  - lib/garage/token_scope.rb
250
+ - lib/garage/tracer.rb
250
251
  - lib/garage/utils.rb
251
252
  - lib/garage/version.rb
252
253
  - lib/the_garage.rb
253
254
  homepage: https://github.com/cookpad/garage
254
- licenses: []
255
+ licenses:
256
+ - MIT
255
257
  metadata: {}
256
258
  post_install_message:
257
259
  rdoc_options: []
@@ -269,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
271
  version: '0'
270
272
  requirements: []
271
273
  rubyforge_project:
272
- rubygems_version: 2.5.2
274
+ rubygems_version: 2.6.11
273
275
  signing_key:
274
276
  specification_version: 4
275
277
  summary: Garage Platform Engine