gruf 2.8.1 → 2.9.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 +4 -4
- data/CHANGELOG.md +14 -3
- data/README.md +3 -3
- data/gruf.gemspec +25 -7
- data/lib/gruf/cli/executor.rb +1 -1
- data/lib/gruf/client.rb +1 -1
- data/lib/gruf/client/error.rb +2 -0
- data/lib/gruf/configuration.rb +2 -2
- data/lib/gruf/controllers/base.rb +2 -0
- data/lib/gruf/controllers/request.rb +8 -6
- data/lib/gruf/controllers/service_binder.rb +1 -1
- data/lib/gruf/error.rb +1 -1
- data/lib/gruf/hooks/executor.rb +1 -1
- data/lib/gruf/interceptors/client_interceptor.rb +8 -16
- data/lib/gruf/interceptors/context.rb +4 -4
- data/lib/gruf/interceptors/instrumentation/output_metadata_timer.rb +2 -4
- data/lib/gruf/interceptors/instrumentation/request_logging/interceptor.rb +12 -14
- data/lib/gruf/interceptors/instrumentation/statsd.rb +2 -4
- data/lib/gruf/interceptors/timer.rb +5 -2
- data/lib/gruf/server.rb +2 -2
- data/lib/gruf/timer.rb +5 -4
- data/lib/gruf/version.rb +1 -1
- metadata +223 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 77be459526bb01a2e709cb26663e0b2bbdc614eb28de7084a132c14d741fef66
|
|
4
|
+
data.tar.gz: b36e8446fd325c42b9c494370b09fd9ecd2364d5a84194683f5d9d81961dd5b2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9d11c575a288e18321aeee6de57b9b9c8a9db09e2c200ce3c5a50d7331e7e1af2975bcba2ae276917e0bf087bbc7c1f0726b4df13d9861bab361c66069a691f9
|
|
7
|
+
data.tar.gz: baed74a1e86746ae86314f4fa33065f1b0a3d9ae479c8f288f444444be24e78d76a9f0337cdcfe62b9637d53e6709cf031122cf8728bf709abaa4e6fd79ad788
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@ Changelog for the gruf gem. This includes internal history before the gem was ma
|
|
|
2
2
|
|
|
3
3
|
### Pending release
|
|
4
4
|
|
|
5
|
+
### 2.9.0
|
|
6
|
+
|
|
7
|
+
- Change to racially neutral terminology across library
|
|
8
|
+
- blacklist->blocklist
|
|
9
|
+
- master->main branch
|
|
10
|
+
- Explicitly declare development dependencies in gemspec
|
|
11
|
+
- Add script/e2e test for full e2e test in regression suite
|
|
12
|
+
- Explicitly declare [json gem](https://rubygems.org/gems/json) dependency
|
|
13
|
+
- Update to Rubocop 1.4, add in rubocop-rspec for spec tests
|
|
14
|
+
- Add Ruby 2.7, 3.0 support
|
|
15
|
+
|
|
5
16
|
### 2.8.1
|
|
6
17
|
|
|
7
18
|
- Fix issue with --suppress-default-interceptors not working [#95]
|
|
@@ -145,11 +156,11 @@ Gruf 2.0 is a major shift from Gruf 1.0. See [UPGRADING.md](UPGRADING.md) for de
|
|
|
145
156
|
### 1.2.4
|
|
146
157
|
|
|
147
158
|
- Loosen explicit Protobuf dependency now that 3.4.0.2 is released
|
|
148
|
-
- Guard against nil params in logger
|
|
159
|
+
- Guard against nil params in logger blocklist
|
|
149
160
|
|
|
150
161
|
### 1.2.3
|
|
151
162
|
|
|
152
|
-
- Support nested
|
|
163
|
+
- Support nested blocklist parameters in path.to.key format
|
|
153
164
|
|
|
154
165
|
### 1.2.2
|
|
155
166
|
|
|
@@ -171,7 +182,7 @@ Gruf 2.0 is a major shift from Gruf 1.0. See [UPGRADING.md](UPGRADING.md) for de
|
|
|
171
182
|
- Add configuration to set the error message when an uncaught exception is
|
|
172
183
|
handled by gruf.
|
|
173
184
|
- Add a request logging hook for Rails-style request logging, with optional
|
|
174
|
-
parameter logging,
|
|
185
|
+
parameter logging, blocklists, and formatter support
|
|
175
186
|
- Optimizations around Symbol casting within service calls
|
|
176
187
|
|
|
177
188
|
### 1.1.0
|
data/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# gruf - gRPC Ruby Framework
|
|
2
2
|
|
|
3
|
-
[](https://circleci.com/gh/bigcommerce/gruf/tree/main) [](https://badge.fury.io/rb/gruf) [](https://inch-ci.org/github/bigcommerce/gruf?branch=main)
|
|
4
4
|
|
|
5
|
-
gruf is a Ruby framework that wraps the [gRPC Ruby library](https://github.com/grpc/grpc/tree/
|
|
5
|
+
gruf is a Ruby framework that wraps the [gRPC Ruby library](https://github.com/grpc/grpc/tree/main/src/ruby) to
|
|
6
6
|
provide a more streamlined integration into Ruby and Ruby on Rails applications.
|
|
7
7
|
|
|
8
8
|
It provides an abstracted server and client for gRPC services, along with other tools to help get gRPC services in Ruby
|
|
@@ -17,7 +17,7 @@ up fast and efficiently at scale. Some of its features include:
|
|
|
17
17
|
still preserving gRPC BadStatus codes
|
|
18
18
|
* Server and client execution timings in responses
|
|
19
19
|
|
|
20
|
-
gruf currently has active support for gRPC 1.10.x+. gruf is compatible and tested with Ruby 2.2-2.
|
|
20
|
+
gruf currently has active support for gRPC 1.10.x+. gruf is compatible and tested with Ruby 2.2-2.7.
|
|
21
21
|
gruf is also not [Rails](https://github.com/rails/rails)-specific, and can be used in any Ruby framework
|
|
22
22
|
(such as [Grape](https://github.com/ruby-grape/grape) or [dry-rb](https://dry-rb.org/), for instance).
|
|
23
23
|
|
data/gruf.gemspec
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
16
16
|
# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
17
17
|
#
|
|
18
|
-
|
|
18
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
|
19
19
|
require 'gruf/version'
|
|
20
20
|
|
|
21
21
|
Gem::Specification.new do |spec|
|
|
@@ -30,19 +30,37 @@ Gem::Specification.new do |spec|
|
|
|
30
30
|
spec.homepage = 'https://github.com/bigcommerce/gruf'
|
|
31
31
|
|
|
32
32
|
spec.files = Dir['README.md', 'CHANGELOG.md', 'CODE_OF_CONDUCT.md', 'lib/**/*', 'gruf.gemspec']
|
|
33
|
-
spec.executables
|
|
33
|
+
spec.executables << 'gruf'
|
|
34
34
|
spec.require_paths = ['lib']
|
|
35
35
|
|
|
36
|
-
spec.required_ruby_version = '
|
|
36
|
+
spec.required_ruby_version = '>= 2.4', '< 3.1'
|
|
37
37
|
|
|
38
38
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
|
39
|
+
spec.add_development_dependency 'bundler-audit', '>= 0.6'
|
|
40
|
+
# rubocop:disable Gemspec/RubyVersionGlobalsUsage
|
|
41
|
+
spec.add_development_dependency(
|
|
42
|
+
'factory_bot',
|
|
43
|
+
(Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5') ? '>= 6.1' : '~> 5.2')
|
|
44
|
+
)
|
|
45
|
+
# rubocop:enable Gemspec/RubyVersionGlobalsUsage
|
|
46
|
+
spec.add_development_dependency 'ffaker', '>= 2.15'
|
|
47
|
+
spec.add_development_dependency 'pry', '~> 0.12'
|
|
48
|
+
spec.add_development_dependency 'pry-byebug', '>= 3.9'
|
|
39
49
|
spec.add_development_dependency 'rake', '>= 10.0'
|
|
40
|
-
spec.add_development_dependency '
|
|
50
|
+
spec.add_development_dependency 'rspec', '>= 3.8'
|
|
51
|
+
spec.add_development_dependency 'rspec_junit_formatter', '>= 0.4'
|
|
52
|
+
spec.add_development_dependency 'rubocop', '>= 1.0'
|
|
53
|
+
spec.add_development_dependency 'rubocop-performance', '>= 0.0.1'
|
|
54
|
+
spec.add_development_dependency 'rubocop-rspec', '>= 2.0'
|
|
55
|
+
spec.add_development_dependency 'rubocop-thread_safety', '>= 0.3'
|
|
56
|
+
spec.add_development_dependency 'simplecov', '>= 0.16'
|
|
41
57
|
|
|
42
|
-
spec.add_runtime_dependency 'grpc', '~> 1.10'
|
|
43
|
-
spec.add_runtime_dependency 'grpc-tools', '~> 1.10'
|
|
44
58
|
spec.add_runtime_dependency 'activesupport', '> 4'
|
|
45
|
-
|
|
46
59
|
spec.add_runtime_dependency 'concurrent-ruby', '> 1'
|
|
60
|
+
spec.add_runtime_dependency 'e2mmap', '~> 0.1'
|
|
61
|
+
spec.add_runtime_dependency 'grpc', '~> 1.10'
|
|
62
|
+
spec.add_runtime_dependency 'grpc-tools', '~> 1.10'
|
|
63
|
+
spec.add_runtime_dependency 'json', '>= 2.3'
|
|
47
64
|
spec.add_runtime_dependency 'slop', '~> 4.6'
|
|
65
|
+
spec.add_runtime_dependency 'thwait', '~> 0.1'
|
|
48
66
|
end
|
data/lib/gruf/cli/executor.rb
CHANGED
|
@@ -38,7 +38,7 @@ module Gruf
|
|
|
38
38
|
@services = services || Gruf.services
|
|
39
39
|
@hook_executor = hook_executor || Gruf::Hooks::Executor.new(hooks: Gruf.hooks&.prepare)
|
|
40
40
|
@server = server || Gruf::Server.new(Gruf.server_options)
|
|
41
|
-
@logger = logger || Gruf.logger || ::Logger.new(
|
|
41
|
+
@logger = logger || Gruf.logger || ::Logger.new($stderr)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
##
|
data/lib/gruf/client.rb
CHANGED
|
@@ -63,7 +63,7 @@ module Gruf
|
|
|
63
63
|
@opts[:channel_credentials] = @opts.fetch(:channel_credentials, Gruf.default_channel_credentials)
|
|
64
64
|
@error_factory = Gruf::Client::ErrorFactory.new
|
|
65
65
|
client_options[:timeout] = client_options[:timeout].to_i if client_options.key?(:timeout)
|
|
66
|
-
client = "#{service}::Stub".constantize.new(@opts[:hostname], build_ssl_credentials, client_options)
|
|
66
|
+
client = "#{service}::Stub".constantize.new(@opts[:hostname], build_ssl_credentials, **client_options)
|
|
67
67
|
super(client)
|
|
68
68
|
end
|
|
69
69
|
|
data/lib/gruf/client/error.rb
CHANGED
|
@@ -33,6 +33,7 @@ module Gruf
|
|
|
33
33
|
#
|
|
34
34
|
def initialize(error)
|
|
35
35
|
@error = error
|
|
36
|
+
super
|
|
36
37
|
end
|
|
37
38
|
end
|
|
38
39
|
|
|
@@ -57,6 +58,7 @@ module Gruf
|
|
|
57
58
|
class FailedPrecondition < Error; end
|
|
58
59
|
class Internal < Error; end
|
|
59
60
|
class PermissionDenied < Error; end
|
|
61
|
+
class ResourceExhausted < Error; end
|
|
60
62
|
class Unauthenticated < Error; end
|
|
61
63
|
class Unavailable < Error; end
|
|
62
64
|
class Unimplemented < Error; end
|
data/lib/gruf/configuration.rb
CHANGED
|
@@ -98,7 +98,7 @@ module Gruf
|
|
|
98
98
|
#
|
|
99
99
|
def reset
|
|
100
100
|
VALID_CONFIG_KEYS.each do |k, v|
|
|
101
|
-
send(
|
|
101
|
+
send("#{k}=", v)
|
|
102
102
|
end
|
|
103
103
|
self.interceptors = Gruf::Interceptors::Registry.new
|
|
104
104
|
self.hooks = Gruf::Hooks::Registry.new
|
|
@@ -107,7 +107,7 @@ module Gruf
|
|
|
107
107
|
self.logger = Rails.logger
|
|
108
108
|
else
|
|
109
109
|
require 'logger'
|
|
110
|
-
self.logger = ::Logger.new(
|
|
110
|
+
self.logger = ::Logger.new($stdout)
|
|
111
111
|
end
|
|
112
112
|
self.grpc_logger = logger if grpc_logger.nil?
|
|
113
113
|
self.ssl_crt_file = "#{root_path}config/ssl/#{environment}.crt"
|
|
@@ -65,7 +65,9 @@ module Gruf
|
|
|
65
65
|
def self.bind(service)
|
|
66
66
|
service_class = service.name.constantize
|
|
67
67
|
Gruf.services << service_class
|
|
68
|
+
# rubocop:disable ThreadSafety/InstanceVariableInClassMethod
|
|
68
69
|
@bound_service = service_class
|
|
70
|
+
# rubocop:enable ThreadSafety/InstanceVariableInClassMethod
|
|
69
71
|
ServiceBinder.new(service_class).bind!(self)
|
|
70
72
|
end
|
|
71
73
|
|
|
@@ -58,7 +58,7 @@ module Gruf
|
|
|
58
58
|
# @param [Class] service The class of the service being executed against
|
|
59
59
|
# @param [GRPC::RpcDesc] rpc_desc The RPC descriptor of the call
|
|
60
60
|
# @param [GRPC::ActiveCall] active_call The restricted view of the call
|
|
61
|
-
# @param [Object] message The protobuf message (or messages) of the request
|
|
61
|
+
# @param [Object|Google::Protobuf::MessageExts] message The protobuf message (or messages) of the request
|
|
62
62
|
#
|
|
63
63
|
def initialize(method_key:, service:, rpc_desc:, active_call:, message:)
|
|
64
64
|
@method_key = method_key
|
|
@@ -99,21 +99,23 @@ module Gruf
|
|
|
99
99
|
# @return [String] The parsed service method name
|
|
100
100
|
#
|
|
101
101
|
def method_name
|
|
102
|
-
"#{service_key}.#{method_key}"
|
|
102
|
+
"#{service_key}.#{@method_key}"
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
##
|
|
106
106
|
# Return all messages for this request, properly handling different request types
|
|
107
107
|
#
|
|
108
|
-
# @return Enumerable<Object> All messages for this request
|
|
108
|
+
# @return [Enumerable<Object>] All messages for this request
|
|
109
109
|
#
|
|
110
110
|
def messages
|
|
111
111
|
if client_streamer?
|
|
112
|
-
|
|
112
|
+
# rubocop:disable Style/ExplicitBlockArgument
|
|
113
|
+
@message.call { |msg| yield msg }
|
|
114
|
+
# rubocop:enable Style/ExplicitBlockArgument
|
|
113
115
|
elsif bidi_streamer?
|
|
114
|
-
message
|
|
116
|
+
@message
|
|
115
117
|
else
|
|
116
|
-
[message]
|
|
118
|
+
[@message]
|
|
117
119
|
end
|
|
118
120
|
end
|
|
119
121
|
end
|
|
@@ -38,7 +38,7 @@ module Gruf
|
|
|
38
38
|
##
|
|
39
39
|
# Bind all methods on the service to the passed controller
|
|
40
40
|
#
|
|
41
|
-
# @param [Gruf::Controllers::Base] controller
|
|
41
|
+
# @param [Class<Gruf::Controllers::Base>] controller
|
|
42
42
|
#
|
|
43
43
|
def bind!(controller)
|
|
44
44
|
rpc_methods.each { |name, desc| bind_method(controller, name, desc) }
|
data/lib/gruf/error.rb
CHANGED
data/lib/gruf/hooks/executor.rb
CHANGED
|
@@ -43,7 +43,7 @@ module Gruf
|
|
|
43
43
|
# @param [Hash] metadata A hash of outgoing metadata
|
|
44
44
|
# @return [Object] The response message
|
|
45
45
|
#
|
|
46
|
-
def request_response(request: nil, call: nil, method: nil, metadata: nil)
|
|
46
|
+
def request_response(request: nil, call: nil, method: nil, metadata: nil, &block)
|
|
47
47
|
rc = Gruf::Outbound::RequestContext.new(
|
|
48
48
|
type: :request_response,
|
|
49
49
|
requests: [request],
|
|
@@ -51,9 +51,7 @@ module Gruf
|
|
|
51
51
|
method: method,
|
|
52
52
|
metadata: metadata
|
|
53
53
|
)
|
|
54
|
-
call(request_context: rc)
|
|
55
|
-
yield
|
|
56
|
-
end
|
|
54
|
+
call(request_context: rc, &block)
|
|
57
55
|
end
|
|
58
56
|
|
|
59
57
|
##
|
|
@@ -65,7 +63,7 @@ module Gruf
|
|
|
65
63
|
# @param [Hash] metadata A hash of outgoing metadata
|
|
66
64
|
# @return [Object] The response message
|
|
67
65
|
#
|
|
68
|
-
def client_streamer(requests: nil, call: nil, method: nil, metadata: nil)
|
|
66
|
+
def client_streamer(requests: nil, call: nil, method: nil, metadata: nil, &block)
|
|
69
67
|
rc = Gruf::Outbound::RequestContext.new(
|
|
70
68
|
type: :client_streamer,
|
|
71
69
|
requests: requests,
|
|
@@ -73,9 +71,7 @@ module Gruf
|
|
|
73
71
|
method: method,
|
|
74
72
|
metadata: metadata
|
|
75
73
|
)
|
|
76
|
-
call(request_context: rc)
|
|
77
|
-
yield
|
|
78
|
-
end
|
|
74
|
+
call(request_context: rc, &block)
|
|
79
75
|
end
|
|
80
76
|
|
|
81
77
|
##
|
|
@@ -87,7 +83,7 @@ module Gruf
|
|
|
87
83
|
# @param [Hash] metadata A hash of outgoing metadata
|
|
88
84
|
# @return [Object] The response message
|
|
89
85
|
#
|
|
90
|
-
def server_streamer(request: nil, call: nil, method: nil, metadata: nil)
|
|
86
|
+
def server_streamer(request: nil, call: nil, method: nil, metadata: nil, &block)
|
|
91
87
|
rc = Gruf::Outbound::RequestContext.new(
|
|
92
88
|
type: :server_streamer,
|
|
93
89
|
requests: [request],
|
|
@@ -95,9 +91,7 @@ module Gruf
|
|
|
95
91
|
method: method,
|
|
96
92
|
metadata: metadata
|
|
97
93
|
)
|
|
98
|
-
call(request_context: rc)
|
|
99
|
-
yield
|
|
100
|
-
end
|
|
94
|
+
call(request_context: rc, &block)
|
|
101
95
|
end
|
|
102
96
|
|
|
103
97
|
##
|
|
@@ -108,7 +102,7 @@ module Gruf
|
|
|
108
102
|
# @param [Method] method The method being called
|
|
109
103
|
# @param [Hash] metadata A hash of outgoing metadata
|
|
110
104
|
#
|
|
111
|
-
def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil)
|
|
105
|
+
def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil, &block)
|
|
112
106
|
rc = Gruf::Outbound::RequestContext.new(
|
|
113
107
|
type: :bidi_streamer,
|
|
114
108
|
requests: requests,
|
|
@@ -116,9 +110,7 @@ module Gruf
|
|
|
116
110
|
method: method,
|
|
117
111
|
metadata: metadata
|
|
118
112
|
)
|
|
119
|
-
call(request_context: rc)
|
|
120
|
-
yield
|
|
121
|
-
end
|
|
113
|
+
call(request_context: rc, &block)
|
|
122
114
|
end
|
|
123
115
|
end
|
|
124
116
|
end
|
|
@@ -28,14 +28,14 @@ module Gruf
|
|
|
28
28
|
#
|
|
29
29
|
# @param [Array<Gruf::Interceptors::ServerInterceptor>] interceptors
|
|
30
30
|
#
|
|
31
|
-
def initialize(interceptors =
|
|
32
|
-
@interceptors = interceptors
|
|
31
|
+
def initialize(interceptors = nil)
|
|
32
|
+
@interceptors = interceptors || []
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
##
|
|
36
36
|
# Intercept the given request and run interceptors in a FIFO execution order
|
|
37
37
|
#
|
|
38
|
-
def intercept!
|
|
38
|
+
def intercept!(&block)
|
|
39
39
|
return yield if @interceptors.none?
|
|
40
40
|
|
|
41
41
|
i = @interceptors.pop
|
|
@@ -45,7 +45,7 @@ module Gruf
|
|
|
45
45
|
|
|
46
46
|
i.call do
|
|
47
47
|
if @interceptors.any?
|
|
48
|
-
intercept!
|
|
48
|
+
intercept!(&block)
|
|
49
49
|
else
|
|
50
50
|
yield
|
|
51
51
|
end
|
|
@@ -27,12 +27,10 @@ module Gruf
|
|
|
27
27
|
##
|
|
28
28
|
# Handle the instrumented response. Note: this will only instrument timings of _successful_ responses.
|
|
29
29
|
#
|
|
30
|
-
def call
|
|
30
|
+
def call(&block)
|
|
31
31
|
return unless active_call.respond_to?(:output_metadata)
|
|
32
32
|
|
|
33
|
-
result = Gruf::Interceptors::Timer.time
|
|
34
|
-
yield
|
|
35
|
-
end
|
|
33
|
+
result = Gruf::Interceptors::Timer.time(&block)
|
|
36
34
|
output_metadata.update(metadata_key => result.elapsed.to_s)
|
|
37
35
|
|
|
38
36
|
raise result.message unless result.successful?
|
|
@@ -61,12 +61,10 @@ module Gruf
|
|
|
61
61
|
#
|
|
62
62
|
# @return [String]
|
|
63
63
|
#
|
|
64
|
-
def call
|
|
65
|
-
return yield if options.fetch(:ignore_methods, [])
|
|
64
|
+
def call(&block)
|
|
65
|
+
return yield if options.fetch(:ignore_methods, [])&.include?(request.method_name)
|
|
66
66
|
|
|
67
|
-
result = Gruf::Interceptors::Timer.time
|
|
68
|
-
yield
|
|
69
|
-
end
|
|
67
|
+
result = Gruf::Interceptors::Timer.time(&block)
|
|
70
68
|
|
|
71
69
|
# Fetch log level options and merge with default...
|
|
72
70
|
log_level_map = LOG_LEVEL_MAP.merge(options.fetch(:log_levels, {}))
|
|
@@ -113,7 +111,7 @@ module Gruf
|
|
|
113
111
|
# @return [::Gruf::Logger]
|
|
114
112
|
#
|
|
115
113
|
def logger
|
|
116
|
-
@logger ||= options.fetch(:logger,
|
|
114
|
+
@logger ||= (options.fetch(:logger, nil) || Gruf.logger)
|
|
117
115
|
end
|
|
118
116
|
|
|
119
117
|
##
|
|
@@ -164,26 +162,26 @@ module Gruf
|
|
|
164
162
|
end
|
|
165
163
|
|
|
166
164
|
##
|
|
167
|
-
# Redact any
|
|
165
|
+
# Redact any blocklisted params and return an updated hash
|
|
168
166
|
#
|
|
169
167
|
# @param [Hash] params The hash of parameters to sanitize
|
|
170
168
|
# @return [Hash] The sanitized params in hash form
|
|
171
169
|
#
|
|
172
170
|
def sanitize(params = {})
|
|
173
|
-
|
|
174
|
-
redacted_string = options.fetch(:redacted_string, 'REDACTED'
|
|
175
|
-
|
|
176
|
-
parts =
|
|
171
|
+
blocklists = (options.fetch(:blocklist, []) || []).map(&:to_s)
|
|
172
|
+
redacted_string = options.fetch(:redacted_string, nil) || 'REDACTED'
|
|
173
|
+
blocklists.each do |blocklist|
|
|
174
|
+
parts = blocklist.split('.').map(&:to_sym)
|
|
177
175
|
redact!(parts, 0, params, redacted_string)
|
|
178
176
|
end
|
|
179
177
|
params
|
|
180
178
|
end
|
|
181
179
|
|
|
182
180
|
##
|
|
183
|
-
# Helper method to recursively redact based on the
|
|
181
|
+
# Helper method to recursively redact based on the blocklist
|
|
184
182
|
#
|
|
185
|
-
# @param [Array] parts The
|
|
186
|
-
# @param [Integer] idx The current index of the
|
|
183
|
+
# @param [Array] parts The blocklist. ex. 'data.schema' -> [:data, :schema]
|
|
184
|
+
# @param [Integer] idx The current index of the blocklist
|
|
187
185
|
# @param [Hash] params The hash of parameters to sanitize
|
|
188
186
|
# @param [String] redacted_string The custom redact string
|
|
189
187
|
#
|
|
@@ -25,7 +25,7 @@ module Gruf
|
|
|
25
25
|
##
|
|
26
26
|
# Push data to StatsD, only doing so if a client is set
|
|
27
27
|
#
|
|
28
|
-
def call
|
|
28
|
+
def call(&block)
|
|
29
29
|
unless client
|
|
30
30
|
Gruf.logger.error 'Statsd module loaded, but no client configured!'
|
|
31
31
|
return yield
|
|
@@ -33,9 +33,7 @@ module Gruf
|
|
|
33
33
|
|
|
34
34
|
client.increment(route_key)
|
|
35
35
|
|
|
36
|
-
result = Gruf::Interceptors::Timer.time
|
|
37
|
-
yield
|
|
38
|
-
end
|
|
36
|
+
result = Gruf::Interceptors::Timer.time(&block)
|
|
39
37
|
|
|
40
38
|
client.increment("#{route_key}.#{postfix(result.successful?)}")
|
|
41
39
|
client.timing(route_key, result.elapsed)
|
|
@@ -24,9 +24,12 @@ module Gruf
|
|
|
24
24
|
##
|
|
25
25
|
# Represents a timed result for an interceptor
|
|
26
26
|
#
|
|
27
|
+
# @property [Object] message The protobuf message
|
|
28
|
+
# @property [Float] elapsed The elapsed time of the request
|
|
29
|
+
#
|
|
27
30
|
class Result
|
|
28
|
-
attr_reader :message
|
|
29
|
-
|
|
31
|
+
attr_reader :message,
|
|
32
|
+
:elapsed
|
|
30
33
|
|
|
31
34
|
##
|
|
32
35
|
# @param [Object] message The protobuf message
|
data/lib/gruf/server.rb
CHANGED
|
@@ -69,9 +69,9 @@ module Gruf
|
|
|
69
69
|
|
|
70
70
|
server = if @event_listener_proc
|
|
71
71
|
server_options[:event_listener_proc] = @event_listener_proc
|
|
72
|
-
Gruf::InstrumentableGrpcServer.new(server_options)
|
|
72
|
+
Gruf::InstrumentableGrpcServer.new(**server_options)
|
|
73
73
|
else
|
|
74
|
-
GRPC::RpcServer.new(server_options)
|
|
74
|
+
GRPC::RpcServer.new(**server_options)
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
@port = server.add_http2_port(@hostname, ssl_credentials)
|
data/lib/gruf/timer.rb
CHANGED
|
@@ -29,11 +29,12 @@ module Gruf
|
|
|
29
29
|
# result.time # => 1.10123
|
|
30
30
|
# result.result # => 'my_thing_is_done'
|
|
31
31
|
#
|
|
32
|
+
# @property [Object] result The result of the block that was called
|
|
33
|
+
# @property [Float] time The time, in ms, of the block execution
|
|
34
|
+
#
|
|
32
35
|
class Result
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# @return [Float] time The time, in ms, of the block execution
|
|
36
|
-
attr_reader :time
|
|
36
|
+
attr_reader :result,
|
|
37
|
+
:time
|
|
37
38
|
|
|
38
39
|
##
|
|
39
40
|
# Initialize the result object
|
data/lib/gruf/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gruf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.9.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Shaun McCormick
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-03-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -25,61 +25,187 @@ dependencies:
|
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '1.11'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
28
|
+
name: bundler-audit
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '0.6'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '0.6'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: factory_bot
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '6.1'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '6.1'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: ffaker
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '2.15'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '2.15'
|
|
41
69
|
- !ruby/object:Gem::Dependency
|
|
42
70
|
name: pry
|
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
|
44
72
|
requirements:
|
|
45
73
|
- - "~>"
|
|
46
74
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0.
|
|
75
|
+
version: '0.12'
|
|
48
76
|
type: :development
|
|
49
77
|
prerelease: false
|
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
79
|
requirements:
|
|
52
80
|
- - "~>"
|
|
53
81
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0.
|
|
82
|
+
version: '0.12'
|
|
55
83
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
84
|
+
name: pry-byebug
|
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
|
58
86
|
requirements:
|
|
59
|
-
- - "
|
|
87
|
+
- - ">="
|
|
60
88
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
62
|
-
type: :
|
|
89
|
+
version: '3.9'
|
|
90
|
+
type: :development
|
|
63
91
|
prerelease: false
|
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
93
|
requirements:
|
|
66
|
-
- - "
|
|
94
|
+
- - ">="
|
|
67
95
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
96
|
+
version: '3.9'
|
|
69
97
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
98
|
+
name: rake
|
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
|
72
100
|
requirements:
|
|
73
|
-
- - "
|
|
101
|
+
- - ">="
|
|
74
102
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
76
|
-
type: :
|
|
103
|
+
version: '10.0'
|
|
104
|
+
type: :development
|
|
77
105
|
prerelease: false
|
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
107
|
requirements:
|
|
80
|
-
- - "
|
|
108
|
+
- - ">="
|
|
81
109
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
110
|
+
version: '10.0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: rspec
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - ">="
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '3.8'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - ">="
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '3.8'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: rspec_junit_formatter
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - ">="
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0.4'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - ">="
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0.4'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: rubocop
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - ">="
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '1.0'
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - ">="
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '1.0'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: rubocop-performance
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: 0.0.1
|
|
160
|
+
type: :development
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - ">="
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: 0.0.1
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: rubocop-rspec
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - ">="
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '2.0'
|
|
174
|
+
type: :development
|
|
175
|
+
prerelease: false
|
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - ">="
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '2.0'
|
|
181
|
+
- !ruby/object:Gem::Dependency
|
|
182
|
+
name: rubocop-thread_safety
|
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
|
184
|
+
requirements:
|
|
185
|
+
- - ">="
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: '0.3'
|
|
188
|
+
type: :development
|
|
189
|
+
prerelease: false
|
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - ">="
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '0.3'
|
|
195
|
+
- !ruby/object:Gem::Dependency
|
|
196
|
+
name: simplecov
|
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
|
198
|
+
requirements:
|
|
199
|
+
- - ">="
|
|
200
|
+
- !ruby/object:Gem::Version
|
|
201
|
+
version: '0.16'
|
|
202
|
+
type: :development
|
|
203
|
+
prerelease: false
|
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
205
|
+
requirements:
|
|
206
|
+
- - ">="
|
|
207
|
+
- !ruby/object:Gem::Version
|
|
208
|
+
version: '0.16'
|
|
83
209
|
- !ruby/object:Gem::Dependency
|
|
84
210
|
name: activesupport
|
|
85
211
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -108,6 +234,62 @@ dependencies:
|
|
|
108
234
|
- - ">"
|
|
109
235
|
- !ruby/object:Gem::Version
|
|
110
236
|
version: '1'
|
|
237
|
+
- !ruby/object:Gem::Dependency
|
|
238
|
+
name: e2mmap
|
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
|
240
|
+
requirements:
|
|
241
|
+
- - "~>"
|
|
242
|
+
- !ruby/object:Gem::Version
|
|
243
|
+
version: '0.1'
|
|
244
|
+
type: :runtime
|
|
245
|
+
prerelease: false
|
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
247
|
+
requirements:
|
|
248
|
+
- - "~>"
|
|
249
|
+
- !ruby/object:Gem::Version
|
|
250
|
+
version: '0.1'
|
|
251
|
+
- !ruby/object:Gem::Dependency
|
|
252
|
+
name: grpc
|
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
|
254
|
+
requirements:
|
|
255
|
+
- - "~>"
|
|
256
|
+
- !ruby/object:Gem::Version
|
|
257
|
+
version: '1.10'
|
|
258
|
+
type: :runtime
|
|
259
|
+
prerelease: false
|
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
261
|
+
requirements:
|
|
262
|
+
- - "~>"
|
|
263
|
+
- !ruby/object:Gem::Version
|
|
264
|
+
version: '1.10'
|
|
265
|
+
- !ruby/object:Gem::Dependency
|
|
266
|
+
name: grpc-tools
|
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
|
268
|
+
requirements:
|
|
269
|
+
- - "~>"
|
|
270
|
+
- !ruby/object:Gem::Version
|
|
271
|
+
version: '1.10'
|
|
272
|
+
type: :runtime
|
|
273
|
+
prerelease: false
|
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
275
|
+
requirements:
|
|
276
|
+
- - "~>"
|
|
277
|
+
- !ruby/object:Gem::Version
|
|
278
|
+
version: '1.10'
|
|
279
|
+
- !ruby/object:Gem::Dependency
|
|
280
|
+
name: json
|
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
|
282
|
+
requirements:
|
|
283
|
+
- - ">="
|
|
284
|
+
- !ruby/object:Gem::Version
|
|
285
|
+
version: '2.3'
|
|
286
|
+
type: :runtime
|
|
287
|
+
prerelease: false
|
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
289
|
+
requirements:
|
|
290
|
+
- - ">="
|
|
291
|
+
- !ruby/object:Gem::Version
|
|
292
|
+
version: '2.3'
|
|
111
293
|
- !ruby/object:Gem::Dependency
|
|
112
294
|
name: slop
|
|
113
295
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -122,6 +304,20 @@ dependencies:
|
|
|
122
304
|
- - "~>"
|
|
123
305
|
- !ruby/object:Gem::Version
|
|
124
306
|
version: '4.6'
|
|
307
|
+
- !ruby/object:Gem::Dependency
|
|
308
|
+
name: thwait
|
|
309
|
+
requirement: !ruby/object:Gem::Requirement
|
|
310
|
+
requirements:
|
|
311
|
+
- - "~>"
|
|
312
|
+
- !ruby/object:Gem::Version
|
|
313
|
+
version: '0.1'
|
|
314
|
+
type: :runtime
|
|
315
|
+
prerelease: false
|
|
316
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
317
|
+
requirements:
|
|
318
|
+
- - "~>"
|
|
319
|
+
- !ruby/object:Gem::Version
|
|
320
|
+
version: '0.1'
|
|
125
321
|
description: gRPC Ruby Framework for building complex gRPC applications at scale
|
|
126
322
|
email:
|
|
127
323
|
- splittingred@gmail.com
|
|
@@ -181,23 +377,26 @@ homepage: https://github.com/bigcommerce/gruf
|
|
|
181
377
|
licenses:
|
|
182
378
|
- MIT
|
|
183
379
|
metadata: {}
|
|
184
|
-
post_install_message:
|
|
380
|
+
post_install_message:
|
|
185
381
|
rdoc_options: []
|
|
186
382
|
require_paths:
|
|
187
383
|
- lib
|
|
188
384
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
189
385
|
requirements:
|
|
190
|
-
- - "
|
|
386
|
+
- - ">="
|
|
191
387
|
- !ruby/object:Gem::Version
|
|
192
388
|
version: '2.4'
|
|
389
|
+
- - "<"
|
|
390
|
+
- !ruby/object:Gem::Version
|
|
391
|
+
version: '3.1'
|
|
193
392
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
393
|
requirements:
|
|
195
394
|
- - ">="
|
|
196
395
|
- !ruby/object:Gem::Version
|
|
197
396
|
version: '0'
|
|
198
397
|
requirements: []
|
|
199
|
-
rubygems_version: 3.0.
|
|
200
|
-
signing_key:
|
|
398
|
+
rubygems_version: 3.0.9
|
|
399
|
+
signing_key:
|
|
201
400
|
specification_version: 4
|
|
202
401
|
summary: gRPC Ruby Framework
|
|
203
402
|
test_files: []
|