gruf 2.9.0 → 2.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +2 -2
- data/gruf.gemspec +8 -7
- data/lib/gruf/client/error.rb +2 -1
- data/lib/gruf/client.rb +29 -4
- data/lib/gruf/configuration.rb +98 -16
- data/lib/gruf/controllers/base.rb +6 -3
- data/lib/gruf/controllers/request.rb +12 -6
- data/lib/gruf/error.rb +16 -8
- data/lib/gruf/errors/debug_info.rb +4 -2
- data/lib/gruf/errors/field.rb +6 -3
- data/lib/gruf/interceptors/base.rb +6 -3
- data/lib/gruf/interceptors/context.rb +1 -1
- data/lib/gruf/interceptors/timer.rb +7 -3
- data/lib/gruf/outbound/request_context.rb +12 -7
- data/lib/gruf/response.rb +12 -6
- data/lib/gruf/serializers/errors/base.rb +2 -1
- data/lib/gruf/server.rb +4 -2
- data/lib/gruf/synchronized_client.rb +2 -0
- data/lib/gruf/timer.rb +6 -2
- data/lib/gruf/version.rb +1 -1
- data/lib/gruf.rb +1 -1
- metadata +24 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fbcc0f1b3083a00fa413c9d16bdb126e04a37f5a1cdee3ae05573698e4deb67
|
4
|
+
data.tar.gz: 5327ddd7497e82d991eba1a7ce37e35c62e9810ae5803227563fa4e6ebee31b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ab52c50feb431404c3cbde8b67de6f456b8310ce21a857d9ffcc4b820055773c908d3329a0b965c5b3459583658103f5be7bf3debc5acea541d84b516937c2c
|
7
|
+
data.tar.gz: 898363f243233aace1aeffd4163b996bd280462a2c444db4c75ad472010ac7bc99f50d5945a2126380a6676a80daeb72b401b94c97010d6920dc796c4b661b2b
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,34 @@ Changelog for the gruf gem. This includes internal history before the gem was ma
|
|
2
2
|
|
3
3
|
### Pending release
|
4
4
|
|
5
|
+
### 2.12.0
|
6
|
+
|
7
|
+
- Fixed interceptor order to be FIFO as documented, instead of FILO (fixes #139)
|
8
|
+
|
9
|
+
### 2.11.0
|
10
|
+
|
11
|
+
- Restrict grpc gem to <= 1.41.0 due to regressions in grpc 1.42.x
|
12
|
+
- Fallback to stdout logger at INFO if no logger is setup
|
13
|
+
- Better handling of namespace collisions with Rails
|
14
|
+
- Add `GRPC_SERVER_HOST` and `GRPC_SERVER_PORT` for ENV configuration of the server host+port
|
15
|
+
- Add `GRPC_BACKTRACE_ON_ERROR` as available ENV configuration
|
16
|
+
- Add default ENV-based configuration of the GRPC server pool
|
17
|
+
- `GRPC_SERVER_POOL_SIZE` - sets the size of the GRPC server pool
|
18
|
+
- `GRPC_SERVER_POOL_KEEP_ALIVE` - keep alive time for threads spawned by the server pool
|
19
|
+
- `GRPC_SERVER_POLL_PERIOD` - period in seconds to poll for workers in the gRPC server pool
|
20
|
+
- Improve Yardoc support across the library
|
21
|
+
- Added attribute-based documentation for Gruf configuration options
|
22
|
+
- Add mfa required for gemspec metadata
|
23
|
+
|
24
|
+
### 2.10.0
|
25
|
+
|
26
|
+
- Drop support for Ruby 2.4/2.5 to align with Ruby EOL schedule, supporting 2.6+ only
|
27
|
+
- Allow for float/TimeSpec timeout values on clients
|
28
|
+
|
29
|
+
### 2.9.1
|
30
|
+
|
31
|
+
- Allow for float/TimeSpec timeout values on clients (backport from 2.10.0)
|
32
|
+
|
5
33
|
### 2.9.0
|
6
34
|
|
7
35
|
- Change to racially neutral terminology across library
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
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/master/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-
|
20
|
+
gruf currently has active support for gRPC 1.10.x+. gruf is compatible and tested with Ruby 2.2-3.0.
|
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
@@ -33,9 +33,10 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.executables << 'gruf'
|
34
34
|
spec.require_paths = ['lib']
|
35
35
|
|
36
|
-
spec.required_ruby_version = '>= 2.
|
36
|
+
spec.required_ruby_version = '>= 2.6', '< 3.1'
|
37
|
+
|
38
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
37
39
|
|
38
|
-
spec.add_development_dependency 'bundler', '~> 1.11'
|
39
40
|
spec.add_development_dependency 'bundler-audit', '>= 0.6'
|
40
41
|
# rubocop:disable Gemspec/RubyVersionGlobalsUsage
|
41
42
|
spec.add_development_dependency(
|
@@ -57,10 +58,10 @@ Gem::Specification.new do |spec|
|
|
57
58
|
|
58
59
|
spec.add_runtime_dependency 'activesupport', '> 4'
|
59
60
|
spec.add_runtime_dependency 'concurrent-ruby', '> 1'
|
60
|
-
spec.add_runtime_dependency 'e2mmap', '
|
61
|
-
spec.add_runtime_dependency 'grpc', '~> 1.10'
|
62
|
-
spec.add_runtime_dependency 'grpc-tools', '~> 1.10'
|
61
|
+
spec.add_runtime_dependency 'e2mmap', '>= 0.1'
|
62
|
+
spec.add_runtime_dependency 'grpc', '~> 1.10', '<= 1.41.0'
|
63
|
+
spec.add_runtime_dependency 'grpc-tools', '~> 1.10', '<= 1.41.0'
|
63
64
|
spec.add_runtime_dependency 'json', '>= 2.3'
|
64
|
-
spec.add_runtime_dependency 'slop', '
|
65
|
-
spec.add_runtime_dependency 'thwait', '
|
65
|
+
spec.add_runtime_dependency 'slop', '>= 4.6'
|
66
|
+
spec.add_runtime_dependency 'thwait', '>= 0.1'
|
66
67
|
end
|
data/lib/gruf/client/error.rb
CHANGED
data/lib/gruf/client.rb
CHANGED
@@ -38,11 +38,14 @@ module Gruf
|
|
38
38
|
class Client < SimpleDelegator
|
39
39
|
include Gruf::Loggable
|
40
40
|
|
41
|
-
#
|
41
|
+
# @!attribute [r] base_klass
|
42
|
+
# @return [Class] The base, friendly name of the service being requested
|
42
43
|
attr_reader :base_klass
|
43
|
-
#
|
44
|
+
# @!attribute [r] service_klass
|
45
|
+
# @return [Class] The class name of the gRPC service being requested
|
44
46
|
attr_reader :service_klass
|
45
|
-
#
|
47
|
+
# @!attribute [r] opts
|
48
|
+
# @return [Hash] A hash of options for the client
|
46
49
|
attr_reader :opts
|
47
50
|
|
48
51
|
##
|
@@ -62,7 +65,7 @@ module Gruf
|
|
62
65
|
@opts[:hostname] = @opts.fetch(:hostname, Gruf.default_client_host)
|
63
66
|
@opts[:channel_credentials] = @opts.fetch(:channel_credentials, Gruf.default_channel_credentials)
|
64
67
|
@error_factory = Gruf::Client::ErrorFactory.new
|
65
|
-
client_options[:timeout] = client_options[:timeout]
|
68
|
+
client_options[:timeout] = parse_timeout(client_options[:timeout]) if client_options.key?(:timeout)
|
66
69
|
client = "#{service}::Stub".constantize.new(@opts[:hostname], build_ssl_credentials, **client_options)
|
67
70
|
super(client)
|
68
71
|
end
|
@@ -216,5 +219,27 @@ module Gruf
|
|
216
219
|
Gruf::Serializers::Errors::Json
|
217
220
|
end
|
218
221
|
end
|
222
|
+
|
223
|
+
##
|
224
|
+
# Handle various timeout values and prevent improper value setting
|
225
|
+
#
|
226
|
+
# @see GRPC::Core::TimeConsts#from_relative_time
|
227
|
+
# @param [mixed] timeout
|
228
|
+
# @return [Float]
|
229
|
+
# @return [GRPC::Core::TimeSpec]
|
230
|
+
#
|
231
|
+
def parse_timeout(timeout)
|
232
|
+
if timeout.nil?
|
233
|
+
GRPC::Core::TimeConsts::ZERO
|
234
|
+
elsif timeout.is_a?(GRPC::Core::TimeSpec)
|
235
|
+
timeout
|
236
|
+
elsif timeout.is_a?(Numeric) # rubocop:disable Lint/DuplicateBranch
|
237
|
+
timeout
|
238
|
+
elsif timeout.respond_to?(:to_f)
|
239
|
+
timeout.to_f
|
240
|
+
else
|
241
|
+
raise ArgumentError, 'timeout is not a valid value: does not respond to to_f'
|
242
|
+
end
|
243
|
+
end
|
219
244
|
end
|
220
245
|
end
|
data/lib/gruf/configuration.rb
CHANGED
@@ -20,6 +20,63 @@ module Gruf
|
|
20
20
|
# Represents configuration settings for the system
|
21
21
|
#
|
22
22
|
module Configuration
|
23
|
+
# @!attribute root_path
|
24
|
+
# @return [String] The root path for your application
|
25
|
+
# @!attribute server_binding_url
|
26
|
+
# @return [String] The full hostname:port that the gRPC server should bind to
|
27
|
+
# @!attribute server_options
|
28
|
+
# @return [Hash] A hash of options to pass to the server instance
|
29
|
+
# @!attribute interceptors
|
30
|
+
# @return [::Gruf::Interceptors::Registry] A registry of Gruf server interceptors
|
31
|
+
# @!attribute hooks
|
32
|
+
# @return [::Gruf::Hooks::Registry] A registry of Gruf hooks for the server
|
33
|
+
# @!attribute default_channel_credentials
|
34
|
+
# @return [NilClass]
|
35
|
+
# @return [Symbol]
|
36
|
+
# @return [Hash]
|
37
|
+
# @!attribute default_client_host
|
38
|
+
# @return [String] The default host for all new Gruf::Client objects to use as their target host
|
39
|
+
# @!attribute use_ssl
|
40
|
+
# @return [Boolean] If true, will setup the server to use TLS
|
41
|
+
# @!attribute ssl_crt_file
|
42
|
+
# @return [String] If use_ssl is true, the relative path from the root_path to the CRT file for the server
|
43
|
+
# @!attribute ssl_key_file
|
44
|
+
# @return [String] If use_ssl is true, the relative path from the root_path to the key file for the server
|
45
|
+
# @!attribute controllers_path
|
46
|
+
# @return [String] The relative path from root_path to locate Gruf Controllers in
|
47
|
+
# @!attribute services
|
48
|
+
# @return [Array<Class>] An array of services to serve with this Gruf server
|
49
|
+
# @!attribute logger
|
50
|
+
# @return [Logger] The logger class for Gruf-based logging
|
51
|
+
# @!attribute grpc_logger
|
52
|
+
# @return [Logger] The logger to use with GRPC's core logger (which logs plaintext). It is recommended to set
|
53
|
+
# this to an STDOUT logger and use a logging pipeline that can translate plaintext logs given GRPC's
|
54
|
+
# unformatted logging.
|
55
|
+
# @!attribute error_metadata_key
|
56
|
+
# @return [Symbol] The metadata key to use for error messages sent back in trailing metadata.
|
57
|
+
# @!attribute error_serializer
|
58
|
+
# @return [NilClass|::Gruf::Serializers::Errors::Base] The error serializer to use for error messages sent
|
59
|
+
# back in trailing metadata. Defaults to the base JSON serializer.
|
60
|
+
# @!attribute append_server_errors_to_trailing_metadata
|
61
|
+
# @return [Boolean] If true, will append all server error information into the trailing metadata in the response
|
62
|
+
# from the server
|
63
|
+
# @!attribute use_default_interceptors
|
64
|
+
# @return [Boolean] If true, will use the default ActiveRecord and Timer interceptors for servers
|
65
|
+
# @!attribute backtrace_on_error
|
66
|
+
# @return [Boolean] If true, will return the backtrace on any errors in servers in the trailing metadata
|
67
|
+
# @!attribute backtrace_limit
|
68
|
+
# @return [Integer] The limit of lines to use in backtraces returned
|
69
|
+
# @!attribute use_exception_message
|
70
|
+
# @return [String] If true, will pass the actual exception message from the error in a server
|
71
|
+
# @!attribute internal_error_message
|
72
|
+
# @return [String] If use_exception_message is false, this message will be used instead as a replacement
|
73
|
+
# @!attribute event_listener_proc
|
74
|
+
# @return [NilClass]
|
75
|
+
# @return [Proc] If set, this will be used during GRPC events (such as pool exhaustions)
|
76
|
+
# @!attribute synchronized_client_internal_cache_expiry
|
77
|
+
# @return [Integer] Internal cache expiry period (in seconds) for the SynchronizedClient
|
78
|
+
# @!attribute rpc_server_options
|
79
|
+
# @return [Hash] A hash of RPC options for GRPC server configuration
|
23
80
|
VALID_CONFIG_KEYS = {
|
24
81
|
root_path: '',
|
25
82
|
server_binding_url: '0.0.0.0:9001',
|
@@ -61,8 +118,8 @@ module Gruf
|
|
61
118
|
# Whenever this is extended into a class, setup the defaults
|
62
119
|
#
|
63
120
|
def self.extended(base)
|
64
|
-
if defined?(Rails)
|
65
|
-
Gruf::Integrations::Rails::Railtie.config.before_initialize { base.reset }
|
121
|
+
if defined?(::Rails)
|
122
|
+
::Gruf::Integrations::Rails::Railtie.config.before_initialize { base.reset }
|
66
123
|
else
|
67
124
|
base.reset
|
68
125
|
end
|
@@ -100,22 +157,28 @@ module Gruf
|
|
100
157
|
VALID_CONFIG_KEYS.each do |k, v|
|
101
158
|
send("#{k}=", v)
|
102
159
|
end
|
103
|
-
self.
|
104
|
-
|
105
|
-
self.
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
require 'logger'
|
110
|
-
self.logger = ::Logger.new($stdout)
|
111
|
-
end
|
112
|
-
self.grpc_logger = logger if grpc_logger.nil?
|
160
|
+
self.server_binding_url = "#{::ENV.fetch('GRPC_SERVER_HOST',
|
161
|
+
'0.0.0.0')}:#{::ENV.fetch('GRPC_SERVER_PORT', 9_001)}"
|
162
|
+
self.interceptors = ::Gruf::Interceptors::Registry.new
|
163
|
+
self.hooks = ::Gruf::Hooks::Registry.new
|
164
|
+
self.root_path = ::Rails.root.to_s.chomp('/') if defined?(::Rails)
|
165
|
+
determine_loggers
|
113
166
|
self.ssl_crt_file = "#{root_path}config/ssl/#{environment}.crt"
|
114
167
|
self.ssl_key_file = "#{root_path}config/ssl/#{environment}.key"
|
115
168
|
self.controllers_path = root_path.to_s.empty? ? 'app/rpc' : "#{root_path}/app/rpc"
|
169
|
+
self.backtrace_on_error = ::ENV.fetch('GRPC_BACKTRACE_ON_ERROR', 0).to_i.positive?
|
170
|
+
self.rpc_server_options = {
|
171
|
+
max_waiting_requests: ::ENV.fetch('GRPC_SERVER_MAX_WAITING_REQUESTS',
|
172
|
+
GRPC::RpcServer::DEFAULT_MAX_WAITING_REQUESTS).to_i,
|
173
|
+
pool_size: ::ENV.fetch('GRPC_SERVER_POOL_SIZE', GRPC::RpcServer::DEFAULT_POOL_SIZE).to_i,
|
174
|
+
pool_keep_alive: ::ENV.fetch('GRPC_SERVER_POOL_KEEP_ALIVE', GRPC::Pool::DEFAULT_KEEP_ALIVE),
|
175
|
+
poll_period: ::ENV.fetch('GRPC_SERVER_POLL_PERIOD', GRPC::RpcServer::DEFAULT_POLL_PERIOD),
|
176
|
+
connect_md_proc: nil,
|
177
|
+
server_args: {}
|
178
|
+
}
|
116
179
|
if use_default_interceptors
|
117
|
-
interceptors.use(Gruf::Interceptors::ActiveRecord::ConnectionReset)
|
118
|
-
interceptors.use(Gruf::Interceptors::Instrumentation::OutputMetadataTimer)
|
180
|
+
interceptors.use(::Gruf::Interceptors::ActiveRecord::ConnectionReset)
|
181
|
+
interceptors.use(::Gruf::Interceptors::Instrumentation::OutputMetadataTimer)
|
119
182
|
end
|
120
183
|
options
|
121
184
|
end
|
@@ -128,11 +191,30 @@ module Gruf
|
|
128
191
|
# @return [String] The current Ruby environment
|
129
192
|
#
|
130
193
|
def environment
|
131
|
-
if defined?(Rails)
|
132
|
-
Rails.env.to_s
|
194
|
+
if defined?(::Rails)
|
195
|
+
::Rails.env.to_s
|
133
196
|
else
|
134
197
|
(ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development').to_s
|
135
198
|
end
|
136
199
|
end
|
200
|
+
|
201
|
+
##
|
202
|
+
# Dynamically determine the appropriate logger
|
203
|
+
#
|
204
|
+
def determine_loggers
|
205
|
+
if defined?(::Rails) && ::Rails.logger
|
206
|
+
self.logger = ::Rails.logger
|
207
|
+
else
|
208
|
+
require 'logger'
|
209
|
+
self.logger = ::Logger.new($stdout)
|
210
|
+
log_level = ::ENV.fetch('LOG_LEVEL', 'info').to_s.upcase
|
211
|
+
begin
|
212
|
+
logger.level = ::Logger::Severity.const_get(log_level)
|
213
|
+
rescue NameError => _e
|
214
|
+
logger.level = ::Logger::Severity::INFO
|
215
|
+
end
|
216
|
+
end
|
217
|
+
self.grpc_logger = logger if grpc_logger.nil?
|
218
|
+
end
|
137
219
|
end
|
138
220
|
end
|
@@ -26,13 +26,16 @@ module Gruf
|
|
26
26
|
class Base
|
27
27
|
include Gruf::Errors::Helpers
|
28
28
|
|
29
|
-
#
|
29
|
+
# @!attribute [r] request
|
30
|
+
# @return [Gruf::Controller::Request] The incoming request
|
30
31
|
attr_reader :request
|
31
|
-
#
|
32
|
+
# @!attribute [r] error
|
33
|
+
# @return [Gruf::Error] The current error on the controller
|
32
34
|
attr_reader :error
|
33
35
|
|
34
36
|
class << self
|
35
|
-
#
|
37
|
+
# @!attribute [r] bound_service
|
38
|
+
# @return [GRPC::GenericService] bound_service The bound gRPC service class
|
36
39
|
attr_reader :bound_service
|
37
40
|
end
|
38
41
|
|
@@ -21,15 +21,20 @@ module Gruf
|
|
21
21
|
# Encapsulates a request for a controller
|
22
22
|
#
|
23
23
|
class Request
|
24
|
-
#
|
24
|
+
# @!attribute [r] message
|
25
|
+
# @return [Object] The protobuf message in the request
|
25
26
|
attr_reader :message
|
26
|
-
#
|
27
|
+
# @!attribute [r] active_call
|
28
|
+
# @return [GRPC::ActiveCall] The active call object used for this request
|
27
29
|
attr_reader :active_call
|
28
|
-
#
|
30
|
+
# @!attribute [r] method_key
|
31
|
+
# @return [Symbol] The method name being requested
|
29
32
|
attr_reader :method_key
|
30
|
-
#
|
33
|
+
# @!attribute [r] type
|
34
|
+
# @return [Gruf::Controllers::Request::Type] The type of request
|
31
35
|
attr_reader :type
|
32
|
-
#
|
36
|
+
# @!attribute [r] service
|
37
|
+
# @return [Class] The GRPC service class for this request
|
33
38
|
attr_reader :service
|
34
39
|
|
35
40
|
delegate :metadata, to: :active_call
|
@@ -76,7 +81,7 @@ module Gruf
|
|
76
81
|
# @return [String] The mapped service key
|
77
82
|
#
|
78
83
|
def service_key
|
79
|
-
@service.name.underscore.tr('/', '.').gsub('.service', '')
|
84
|
+
@service.name.to_s.underscore.tr('/', '.').gsub('.service', '')
|
80
85
|
end
|
81
86
|
|
82
87
|
##
|
@@ -106,6 +111,7 @@ module Gruf
|
|
106
111
|
# Return all messages for this request, properly handling different request types
|
107
112
|
#
|
108
113
|
# @return [Enumerable<Object>] All messages for this request
|
114
|
+
# @return [Object] If a bidi streamed request, will return the message object
|
109
115
|
#
|
110
116
|
def messages
|
111
117
|
if client_streamer?
|
data/lib/gruf/error.rb
CHANGED
@@ -59,20 +59,28 @@ module Gruf
|
|
59
59
|
METADATA_SIZE_EXCEEDED_CODE = 'metadata_size_exceeded'
|
60
60
|
METADATA_SIZE_EXCEEDED_MSG = 'Metadata too long, risks exceeding http2 trailing metadata limit.'
|
61
61
|
|
62
|
-
#
|
62
|
+
# @!attribute code
|
63
|
+
# @return [Symbol] The given internal gRPC code for the error
|
63
64
|
attr_accessor :code
|
64
|
-
#
|
65
|
+
# @!attribute app_code
|
66
|
+
# @return [Symbol] An arbitrary application code that can be used for logical processing of the error
|
67
|
+
# by the client
|
65
68
|
attr_accessor :app_code
|
66
|
-
#
|
69
|
+
# @!attribute message
|
70
|
+
# @return [String] The error message returned by the server
|
67
71
|
attr_accessor :message
|
68
|
-
#
|
72
|
+
# @!attribute field_errors
|
73
|
+
# @return [Array] An array of field errors that can be returned by the server
|
69
74
|
attr_accessor :field_errors
|
70
|
-
#
|
71
|
-
#
|
75
|
+
# @!attribute debug_info
|
76
|
+
# @return [Errors::DebugInfo] A object containing debugging information, such as a stack trace and exception name,
|
77
|
+
# that can be used to debug an given error response. This is sent by the server over the trailing metadata.
|
72
78
|
attr_accessor :debug_info
|
73
|
-
#
|
79
|
+
# @!attribute [w] grpc_error
|
80
|
+
# @return [GRPC::BadStatus] The gRPC BadStatus error object that was generated
|
74
81
|
attr_writer :grpc_error
|
75
|
-
#
|
82
|
+
# @!attribute [r] metadata
|
83
|
+
# @return [Hash] The trailing metadata that was attached to the error
|
76
84
|
attr_reader :metadata
|
77
85
|
|
78
86
|
##
|
@@ -21,9 +21,11 @@ module Gruf
|
|
21
21
|
# Represents debugging information for an exception that occurred in a gRPC service
|
22
22
|
#
|
23
23
|
class DebugInfo
|
24
|
-
#
|
24
|
+
# @!attribute [r] detail
|
25
|
+
# @return [String] The detail message of the exception
|
25
26
|
attr_reader :detail
|
26
|
-
#
|
27
|
+
# @!attribute [r] stack_trace
|
28
|
+
# @return [Array<String>] The stack trace generated by the exception as an array of strings
|
27
29
|
attr_reader :stack_trace
|
28
30
|
|
29
31
|
##
|
data/lib/gruf/errors/field.rb
CHANGED
@@ -21,11 +21,14 @@ module Gruf
|
|
21
21
|
# Represents a field-specific error
|
22
22
|
#
|
23
23
|
class Field
|
24
|
-
#
|
24
|
+
# @!attribute [r] field_name
|
25
|
+
# @return [Symbol] The name of the field as a Symbol
|
25
26
|
attr_reader :field_name
|
26
|
-
#
|
27
|
+
# @!attribute [r] error_code
|
28
|
+
# @return [Symbol] The application error code for the field, e.g. :job_not_found
|
27
29
|
attr_reader :error_code
|
28
|
-
#
|
30
|
+
# @!attribute [r] message
|
31
|
+
# @return [String] The error message for the field, e.g. "Job with ID 123 not found"
|
29
32
|
attr_reader :message
|
30
33
|
|
31
34
|
##
|
@@ -21,11 +21,14 @@ module Gruf
|
|
21
21
|
# Base class for interception requests
|
22
22
|
#
|
23
23
|
class Base
|
24
|
-
#
|
24
|
+
# @!attribute [r] request
|
25
|
+
# @return [Gruf::Controllers::Request] request
|
25
26
|
attr_reader :request
|
26
|
-
#
|
27
|
+
# @!attribute [r] error
|
28
|
+
# @return [Gruf::Error] error
|
27
29
|
attr_reader :error
|
28
|
-
#
|
30
|
+
# @!attribute [r] options
|
31
|
+
# @return [Hash] options
|
29
32
|
attr_reader :options
|
30
33
|
|
31
34
|
##
|
@@ -28,8 +28,12 @@ module Gruf
|
|
28
28
|
# @property [Float] elapsed The elapsed time of the request
|
29
29
|
#
|
30
30
|
class Result
|
31
|
-
|
32
|
-
|
31
|
+
# @!attribute [r] message
|
32
|
+
# @return [Object] The returned protobuf message
|
33
|
+
attr_reader :message
|
34
|
+
# @return [r] elapsed
|
35
|
+
# @return [Float] The time elapsed for this interceptor to execute
|
36
|
+
attr_reader :elapsed
|
33
37
|
|
34
38
|
##
|
35
39
|
# @param [Object] message The protobuf message
|
@@ -53,7 +57,7 @@ module Gruf
|
|
53
57
|
# @return [String] The name of the message class
|
54
58
|
#
|
55
59
|
def message_class_name
|
56
|
-
@message.class.name
|
60
|
+
@message.class.name.to_s
|
57
61
|
end
|
58
62
|
|
59
63
|
##
|
@@ -21,15 +21,20 @@ module Gruf
|
|
21
21
|
# Encapsulates the context of an outbound client request
|
22
22
|
#
|
23
23
|
class RequestContext
|
24
|
-
#
|
24
|
+
# @!attribute [r] type
|
25
|
+
# @return [Symbol]
|
25
26
|
attr_reader :type
|
26
|
-
#
|
27
|
+
# @!attribute [r] requests
|
28
|
+
# @return [Enumerable] requests
|
27
29
|
attr_reader :requests
|
28
|
-
#
|
30
|
+
# @!attribute [r] call
|
31
|
+
# @return [GRPC::ActiveCall]
|
29
32
|
attr_reader :call
|
30
|
-
#
|
33
|
+
# @!attribute [r] method
|
34
|
+
# @return [Method] method
|
31
35
|
attr_reader :method
|
32
|
-
#
|
36
|
+
# @!attribute [r] metadata
|
37
|
+
# @return [Hash] metadata
|
33
38
|
attr_reader :metadata
|
34
39
|
|
35
40
|
##
|
@@ -55,7 +60,7 @@ module Gruf
|
|
55
60
|
# @return [String]
|
56
61
|
#
|
57
62
|
def method_name
|
58
|
-
@method.to_s.split('/').last
|
63
|
+
@method.to_s.split('/').last.to_s
|
59
64
|
end
|
60
65
|
|
61
66
|
##
|
@@ -64,7 +69,7 @@ module Gruf
|
|
64
69
|
# @return [String]
|
65
70
|
#
|
66
71
|
def route_key
|
67
|
-
@method[1
|
72
|
+
@method[1..].to_s.underscore.tr('/', '.')
|
68
73
|
end
|
69
74
|
end
|
70
75
|
end
|
data/lib/gruf/response.rb
CHANGED
@@ -20,17 +20,23 @@ module Gruf
|
|
20
20
|
# Wraps the active call operation to provide metadata and timing around the request
|
21
21
|
#
|
22
22
|
class Response
|
23
|
-
#
|
23
|
+
# @!attribute [r] operation
|
24
|
+
# @return [GRPC::ActiveCall::Operation] The operation that was executed for the given request
|
24
25
|
attr_reader :operation
|
25
|
-
#
|
26
|
+
# @!attribute [r] metadata
|
27
|
+
# @return [Hash] The metadata that was attached to the operation
|
26
28
|
attr_reader :metadata
|
27
|
-
#
|
29
|
+
# @!attribute [r] trailing_metadata
|
30
|
+
# @return [Hash] The trailing metadata that the service returned
|
28
31
|
attr_reader :trailing_metadata
|
29
|
-
#
|
32
|
+
# @!attribute [r] deadline
|
33
|
+
# @return [Time] The set deadline on the call
|
30
34
|
attr_reader :deadline
|
31
|
-
#
|
35
|
+
# @!attribute [r] cancelled
|
36
|
+
# @return [Boolean] Whether or not the operation was cancelled
|
32
37
|
attr_reader :cancelled
|
33
|
-
#
|
38
|
+
# @!attribute [r] execution_time
|
39
|
+
# @return [Float] The time that the request took to execute
|
34
40
|
attr_reader :execution_time
|
35
41
|
|
36
42
|
##
|
@@ -22,7 +22,8 @@ module Gruf
|
|
22
22
|
# Base class for serialization of errors for transport across the grpc protocol
|
23
23
|
#
|
24
24
|
class Base
|
25
|
-
#
|
25
|
+
# @!attribute [r] error
|
26
|
+
# @return [Gruf::Error|String] The error being serialized
|
26
27
|
attr_reader :error
|
27
28
|
|
28
29
|
##
|
data/lib/gruf/server.rb
CHANGED
@@ -25,9 +25,11 @@ module Gruf
|
|
25
25
|
|
26
26
|
include Gruf::Loggable
|
27
27
|
|
28
|
-
#
|
28
|
+
# @!attribute [r] port
|
29
|
+
# @return [Integer] The port the server is bound to
|
29
30
|
attr_reader :port
|
30
|
-
#
|
31
|
+
# @!attribute [r] options
|
32
|
+
# @return [Hash] Hash of options passed into the server
|
31
33
|
attr_reader :options
|
32
34
|
|
33
35
|
##
|
data/lib/gruf/timer.rb
CHANGED
@@ -33,8 +33,12 @@ module Gruf
|
|
33
33
|
# @property [Float] time The time, in ms, of the block execution
|
34
34
|
#
|
35
35
|
class Result
|
36
|
-
|
37
|
-
|
36
|
+
# @!attribute [r] result
|
37
|
+
# @return [mixed]
|
38
|
+
attr_reader :result
|
39
|
+
# @!attribute [r] time
|
40
|
+
# @return [Float]
|
41
|
+
attr_reader :time
|
38
42
|
|
39
43
|
##
|
40
44
|
# Initialize the result object
|
data/lib/gruf/version.rb
CHANGED
data/lib/gruf.rb
CHANGED
@@ -40,7 +40,7 @@ require_relative 'gruf/client'
|
|
40
40
|
require_relative 'gruf/synchronized_client'
|
41
41
|
require_relative 'gruf/instrumentable_grpc_server'
|
42
42
|
require_relative 'gruf/server'
|
43
|
-
require_relative 'gruf/integrations/rails/railtie' if defined?(Rails)
|
43
|
+
require_relative 'gruf/integrations/rails/railtie' if defined?(::Rails)
|
44
44
|
|
45
45
|
##
|
46
46
|
# Initializes configuration of gruf core module
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun McCormick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.11'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.11'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler-audit
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,14 +224,14 @@ dependencies:
|
|
238
224
|
name: e2mmap
|
239
225
|
requirement: !ruby/object:Gem::Requirement
|
240
226
|
requirements:
|
241
|
-
- - "
|
227
|
+
- - ">="
|
242
228
|
- !ruby/object:Gem::Version
|
243
229
|
version: '0.1'
|
244
230
|
type: :runtime
|
245
231
|
prerelease: false
|
246
232
|
version_requirements: !ruby/object:Gem::Requirement
|
247
233
|
requirements:
|
248
|
-
- - "
|
234
|
+
- - ">="
|
249
235
|
- !ruby/object:Gem::Version
|
250
236
|
version: '0.1'
|
251
237
|
- !ruby/object:Gem::Dependency
|
@@ -255,6 +241,9 @@ dependencies:
|
|
255
241
|
- - "~>"
|
256
242
|
- !ruby/object:Gem::Version
|
257
243
|
version: '1.10'
|
244
|
+
- - "<="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: 1.41.0
|
258
247
|
type: :runtime
|
259
248
|
prerelease: false
|
260
249
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -262,6 +251,9 @@ dependencies:
|
|
262
251
|
- - "~>"
|
263
252
|
- !ruby/object:Gem::Version
|
264
253
|
version: '1.10'
|
254
|
+
- - "<="
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
version: 1.41.0
|
265
257
|
- !ruby/object:Gem::Dependency
|
266
258
|
name: grpc-tools
|
267
259
|
requirement: !ruby/object:Gem::Requirement
|
@@ -269,6 +261,9 @@ dependencies:
|
|
269
261
|
- - "~>"
|
270
262
|
- !ruby/object:Gem::Version
|
271
263
|
version: '1.10'
|
264
|
+
- - "<="
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: 1.41.0
|
272
267
|
type: :runtime
|
273
268
|
prerelease: false
|
274
269
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -276,6 +271,9 @@ dependencies:
|
|
276
271
|
- - "~>"
|
277
272
|
- !ruby/object:Gem::Version
|
278
273
|
version: '1.10'
|
274
|
+
- - "<="
|
275
|
+
- !ruby/object:Gem::Version
|
276
|
+
version: 1.41.0
|
279
277
|
- !ruby/object:Gem::Dependency
|
280
278
|
name: json
|
281
279
|
requirement: !ruby/object:Gem::Requirement
|
@@ -294,28 +292,28 @@ dependencies:
|
|
294
292
|
name: slop
|
295
293
|
requirement: !ruby/object:Gem::Requirement
|
296
294
|
requirements:
|
297
|
-
- - "
|
295
|
+
- - ">="
|
298
296
|
- !ruby/object:Gem::Version
|
299
297
|
version: '4.6'
|
300
298
|
type: :runtime
|
301
299
|
prerelease: false
|
302
300
|
version_requirements: !ruby/object:Gem::Requirement
|
303
301
|
requirements:
|
304
|
-
- - "
|
302
|
+
- - ">="
|
305
303
|
- !ruby/object:Gem::Version
|
306
304
|
version: '4.6'
|
307
305
|
- !ruby/object:Gem::Dependency
|
308
306
|
name: thwait
|
309
307
|
requirement: !ruby/object:Gem::Requirement
|
310
308
|
requirements:
|
311
|
-
- - "
|
309
|
+
- - ">="
|
312
310
|
- !ruby/object:Gem::Version
|
313
311
|
version: '0.1'
|
314
312
|
type: :runtime
|
315
313
|
prerelease: false
|
316
314
|
version_requirements: !ruby/object:Gem::Requirement
|
317
315
|
requirements:
|
318
|
-
- - "
|
316
|
+
- - ">="
|
319
317
|
- !ruby/object:Gem::Version
|
320
318
|
version: '0.1'
|
321
319
|
description: gRPC Ruby Framework for building complex gRPC applications at scale
|
@@ -376,7 +374,8 @@ files:
|
|
376
374
|
homepage: https://github.com/bigcommerce/gruf
|
377
375
|
licenses:
|
378
376
|
- MIT
|
379
|
-
metadata:
|
377
|
+
metadata:
|
378
|
+
rubygems_mfa_required: 'true'
|
380
379
|
post_install_message:
|
381
380
|
rdoc_options: []
|
382
381
|
require_paths:
|
@@ -385,7 +384,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
385
384
|
requirements:
|
386
385
|
- - ">="
|
387
386
|
- !ruby/object:Gem::Version
|
388
|
-
version: '2.
|
387
|
+
version: '2.6'
|
389
388
|
- - "<"
|
390
389
|
- !ruby/object:Gem::Version
|
391
390
|
version: '3.1'
|
@@ -395,7 +394,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
395
394
|
- !ruby/object:Gem::Version
|
396
395
|
version: '0'
|
397
396
|
requirements: []
|
398
|
-
rubygems_version: 3.
|
397
|
+
rubygems_version: 3.3.4
|
399
398
|
signing_key:
|
400
399
|
specification_version: 4
|
401
400
|
summary: gRPC Ruby Framework
|