jcw 0.1.3 → 0.2.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/Gemfile.lock +31 -1
- data/README.md +38 -1
- data/jcw.gemspec +1 -0
- data/lib/jcw/config.rb +6 -1
- data/lib/jcw/interceptors/gruf/client.rb +35 -0
- data/lib/jcw/interceptors/gruf/hpack.rb +27 -0
- data/lib/jcw/interceptors/gruf/server.rb +60 -0
- data/lib/jcw/version.rb +1 -1
- data/lib/jcw/wrapper.rb +3 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b501043d4201dca7900d5c39c79aa5ca89996188a68c02774011ea6b10baf73f
|
4
|
+
data.tar.gz: 52bfd8000dd934155eddf3722ac6881f06988d7a84f660f71a66226a3218d529
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0641456763034ef58aa571f7f017892939512a7b8abfbefe7a73859cdfeb33ddab66a4037e069abf17e9c7563339a6ec876b3a479f75cecbb6477ffd1aabb25
|
7
|
+
data.tar.gz: 7837034ab4915c1363339a58ee4e275fea2b8a3db0b61d1cf7eb209a513670b23ee55fbe417adb412fa0f6090fcb041c97c295a4eeee0eb5e416d4dfe9de022f
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
jcw (0.
|
4
|
+
jcw (0.2.0)
|
5
5
|
activesupport (>= 5.0)
|
6
|
+
gruf (~> 2.10)
|
6
7
|
httprb-opentracing (~> 0.4.0)
|
7
8
|
jaeger-client (~> 1.1.0)
|
8
9
|
rack-tracer (~> 0.9.0)
|
@@ -43,11 +44,36 @@ GEM
|
|
43
44
|
docile (1.4.0)
|
44
45
|
domain_name (0.5.20190701)
|
45
46
|
unf (>= 0.0.5, < 1.0.0)
|
47
|
+
e2mmap (0.1.0)
|
46
48
|
erubi (1.10.0)
|
47
49
|
ffi (1.15.3)
|
48
50
|
ffi-compiler (1.0.1)
|
49
51
|
ffi (>= 1.0.0)
|
50
52
|
rake
|
53
|
+
google-protobuf (3.18.1)
|
54
|
+
google-protobuf (3.18.1-universal-darwin)
|
55
|
+
google-protobuf (3.18.1-x86_64-linux)
|
56
|
+
googleapis-common-protos-types (1.2.0)
|
57
|
+
google-protobuf (~> 3.14)
|
58
|
+
grpc (1.41.0)
|
59
|
+
google-protobuf (~> 3.17)
|
60
|
+
googleapis-common-protos-types (~> 1.0)
|
61
|
+
grpc (1.41.0-universal-darwin)
|
62
|
+
google-protobuf (~> 3.17)
|
63
|
+
googleapis-common-protos-types (~> 1.0)
|
64
|
+
grpc (1.41.0-x86_64-linux)
|
65
|
+
google-protobuf (~> 3.17)
|
66
|
+
googleapis-common-protos-types (~> 1.0)
|
67
|
+
grpc-tools (1.41.0)
|
68
|
+
gruf (2.10.0)
|
69
|
+
activesupport (> 4)
|
70
|
+
concurrent-ruby (> 1)
|
71
|
+
e2mmap (~> 0.1)
|
72
|
+
grpc (~> 1.10)
|
73
|
+
grpc-tools (~> 1.10)
|
74
|
+
json (>= 2.3)
|
75
|
+
slop (~> 4.6)
|
76
|
+
thwait (~> 0.1)
|
51
77
|
http (5.0.1)
|
52
78
|
addressable (~> 2.3)
|
53
79
|
http-cookie (~> 1.0)
|
@@ -65,6 +91,7 @@ GEM
|
|
65
91
|
jaeger-client (1.1.0)
|
66
92
|
opentracing (~> 0.3)
|
67
93
|
thrift
|
94
|
+
json (2.5.1)
|
68
95
|
llhttp-ffi (0.3.1)
|
69
96
|
ffi-compiler (~> 1.0)
|
70
97
|
rake (~> 13.0)
|
@@ -163,8 +190,11 @@ GEM
|
|
163
190
|
simplecov-html (0.12.3)
|
164
191
|
simplecov-lcov (0.8.0)
|
165
192
|
simplecov_json_formatter (0.1.3)
|
193
|
+
slop (4.9.1)
|
166
194
|
thor (1.1.0)
|
167
195
|
thrift (0.15.0)
|
196
|
+
thwait (0.2.0)
|
197
|
+
e2mmap
|
168
198
|
tzinfo (2.0.4)
|
169
199
|
concurrent-ruby (~> 1.0)
|
170
200
|
unf (0.1.4)
|
data/README.md
CHANGED
@@ -80,6 +80,43 @@ end
|
|
80
80
|
```
|
81
81
|
- `config.subscribe_to` - not recommended for UDP sender, because default max packet size is 65,000 bytes.
|
82
82
|
|
83
|
+
#### GRPC Integration
|
84
|
+
|
85
|
+
Client side
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
# Add JCW::Interceptors::Gruf::Client Interceptor to Gruf Client Initializer
|
89
|
+
options = {}
|
90
|
+
client_options = { timeout: 10, interceptors: [JCW::Interceptors::Gruf::Client.new] }
|
91
|
+
|
92
|
+
client = Gruf::Client.new(
|
93
|
+
service: Test::Service, options: options, client_options: client_options
|
94
|
+
)
|
95
|
+
|
96
|
+
request_method = "some_method"
|
97
|
+
client.call(request_method)
|
98
|
+
```
|
99
|
+
|
100
|
+
Server side
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# Add Server Interceptor
|
104
|
+
Rails.configuration.to_prepare do
|
105
|
+
Gruf.configure do |config|
|
106
|
+
config.interceptors.use(JCW::Interceptors::Gruf::Server)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# Configure
|
111
|
+
::JCW::Wrapper.configure do |config|
|
112
|
+
config.service_name = "Service Name"
|
113
|
+
config.connection = { protocol: :udp, host: "127.0.0.1", port: 6831 }
|
114
|
+
config.enabled = true
|
115
|
+
config.subscribe_to = [/.*/]
|
116
|
+
config.grpc_ignore_methods = %w[grpc.ignore.method]
|
117
|
+
end
|
118
|
+
```
|
119
|
+
|
83
120
|
### Contributing
|
84
121
|
|
85
122
|
- Fork it ( https://github.com/Cado-Labs/jcw )
|
@@ -95,7 +132,7 @@ Released under MIT License.
|
|
95
132
|
## Supporting
|
96
133
|
|
97
134
|
<a href="https://github.com/Cado-Labs">
|
98
|
-
<img src="https://github.com/Cado-Labs/cado-labs-logos/
|
135
|
+
<img src="https://github.com/Cado-Labs/cado-labs-logos/raw/main/cado_labs_logo.png" alt="Supported by Cado Labs">
|
99
136
|
</a>
|
100
137
|
|
101
138
|
## Authors
|
data/jcw.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
25
|
spec.add_dependency "activesupport", ">= 5.0"
|
26
|
+
spec.add_dependency "gruf", "~> 2.10"
|
26
27
|
spec.add_dependency "httprb-opentracing", "~> 0.4.0"
|
27
28
|
spec.add_dependency "jaeger-client", "~> 1.1.0"
|
28
29
|
spec.add_dependency "rack-tracer", "~> 0.9.0"
|
data/lib/jcw/config.rb
CHANGED
@@ -7,7 +7,8 @@ module JCW
|
|
7
7
|
:subscribe_to,
|
8
8
|
:connection,
|
9
9
|
:flush_interval,
|
10
|
-
:tags
|
10
|
+
:tags,
|
11
|
+
:grpc_ignore_methods
|
11
12
|
|
12
13
|
def enabled
|
13
14
|
@enabled ||= false
|
@@ -34,5 +35,9 @@ module JCW
|
|
34
35
|
def tags
|
35
36
|
@tags ||= {}
|
36
37
|
end
|
38
|
+
|
39
|
+
def grpc_ignore_methods
|
40
|
+
@grpc_ignore_methods ||= []
|
41
|
+
end
|
37
42
|
end
|
38
43
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gruf"
|
4
|
+
|
5
|
+
module JCW
|
6
|
+
module Interceptors
|
7
|
+
module Gruf
|
8
|
+
class Client < ::Gruf::Interceptors::ClientInterceptor
|
9
|
+
def call(request_context:)
|
10
|
+
tracer = OpenTracing.global_tracer
|
11
|
+
metadata = request_context.metadata
|
12
|
+
|
13
|
+
tags = {
|
14
|
+
"component" => "gRPC",
|
15
|
+
"span.kind" => "client",
|
16
|
+
"grpc.method_type" => "request_response",
|
17
|
+
"grpc.headers" => metadata,
|
18
|
+
}
|
19
|
+
|
20
|
+
tracer.start_active_span(request_context.method.to_s, tags: tags) do |current_scope|
|
21
|
+
current_span = current_scope.span
|
22
|
+
current_span.log_kv(
|
23
|
+
event: "request",
|
24
|
+
data: request_context.requests.map { |request| request.try(:to_h) },
|
25
|
+
)
|
26
|
+
hpack_carrier = Hpack.new(metadata)
|
27
|
+
tracer.inject(current_span.context, ::OpenTracing::FORMAT_TEXT_MAP, hpack_carrier)
|
28
|
+
|
29
|
+
yield
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JCW
|
4
|
+
module Interceptors
|
5
|
+
module Gruf
|
6
|
+
class Hpack
|
7
|
+
def initialize(wrapped)
|
8
|
+
@wrapped = wrapped
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](key)
|
12
|
+
@wrapped[key.downcase]
|
13
|
+
end
|
14
|
+
|
15
|
+
def []=(key, value)
|
16
|
+
return unless value
|
17
|
+
|
18
|
+
@wrapped[key.downcase] = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
@wrapped.each(&block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gruf"
|
4
|
+
|
5
|
+
module JCW
|
6
|
+
module Interceptors
|
7
|
+
module Gruf
|
8
|
+
class Server < ::Gruf::Interceptors::ServerInterceptor
|
9
|
+
# rubocop:disable Metrics/MethodLength
|
10
|
+
def call
|
11
|
+
method = request.method_name
|
12
|
+
return yield if Wrapper.config.grpc_ignore_methods.include?(method)
|
13
|
+
|
14
|
+
tracer = OpenTracing.global_tracer
|
15
|
+
on_finish_span = options[:on_finish_span]
|
16
|
+
service_class = request.service
|
17
|
+
method_name = request.method_key
|
18
|
+
name = method_name.to_s.camelize
|
19
|
+
route = "/#{service_class.service_name}/#{name}"
|
20
|
+
|
21
|
+
begin
|
22
|
+
tags = {
|
23
|
+
"component" => "gRPC",
|
24
|
+
"span.kind" => "server",
|
25
|
+
"grpc.method_type" => "request_response",
|
26
|
+
}
|
27
|
+
hpack_carrier = Hpack.new(request.active_call.metadata)
|
28
|
+
parent_span_context = tracer.extract(::OpenTracing::FORMAT_TEXT_MAP, hpack_carrier)
|
29
|
+
current_scope = tracer.start_active_span(
|
30
|
+
route,
|
31
|
+
child_of: parent_span_context,
|
32
|
+
tags: tags,
|
33
|
+
)
|
34
|
+
current_span = current_scope.span
|
35
|
+
current_span.log_kv(event: "request", data: request.message.to_h)
|
36
|
+
|
37
|
+
response = yield
|
38
|
+
|
39
|
+
if response.try(:error_fields)
|
40
|
+
current_span.set_tag("error", true)
|
41
|
+
current_span.log_kv(event: "error", data: response.to_h)
|
42
|
+
end
|
43
|
+
rescue => e
|
44
|
+
if current_span
|
45
|
+
current_span.set_tag("error", true)
|
46
|
+
current_span.log_kv(event: "error", error_object: e)
|
47
|
+
end
|
48
|
+
raise
|
49
|
+
ensure
|
50
|
+
on_finish_span&.call(current_span)
|
51
|
+
current_scope.close if current_span
|
52
|
+
end
|
53
|
+
|
54
|
+
response
|
55
|
+
end
|
56
|
+
# rubocop:enable Metrics/MethodLength
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/jcw/version.rb
CHANGED
data/lib/jcw/wrapper.rb
CHANGED
@@ -21,5 +21,8 @@ require_relative "init"
|
|
21
21
|
require_relative "subscriber"
|
22
22
|
require_relative "http_tracer"
|
23
23
|
require_relative "rack_tracer"
|
24
|
+
require_relative "interceptors/gruf/client"
|
25
|
+
require_relative "interceptors/gruf/server"
|
26
|
+
require_relative "interceptors/gruf/hpack"
|
24
27
|
require_relative "logger"
|
25
28
|
require_relative "logger_extension"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jcw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Starovojtov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: gruf
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.10'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.10'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: httprb-opentracing
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,6 +258,9 @@ files:
|
|
244
258
|
- lib/jcw/config.rb
|
245
259
|
- lib/jcw/http_tracer.rb
|
246
260
|
- lib/jcw/init.rb
|
261
|
+
- lib/jcw/interceptors/gruf/client.rb
|
262
|
+
- lib/jcw/interceptors/gruf/hpack.rb
|
263
|
+
- lib/jcw/interceptors/gruf/server.rb
|
247
264
|
- lib/jcw/logger.rb
|
248
265
|
- lib/jcw/logger_extension.rb
|
249
266
|
- lib/jcw/rack_tracer.rb
|