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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7621b3db92b4172f29ae46a914d6f5a33611f276dfaa17d1effeff36f16c68b
4
- data.tar.gz: c9ac2ea12ee2862fcb762673dd5285e7422b86fe91c38a39f9fa66bd890fa83c
3
+ metadata.gz: b501043d4201dca7900d5c39c79aa5ca89996188a68c02774011ea6b10baf73f
4
+ data.tar.gz: 52bfd8000dd934155eddf3722ac6881f06988d7a84f660f71a66226a3218d529
5
5
  SHA512:
6
- metadata.gz: e6558c6b64a50a283c6e9a97024ee8191fd595bb73b071ae84259ec7a61d51ab4046b6f70e33f335bedf7888f791f170375e2b7f3ab428a373259716c9acfe19
7
- data.tar.gz: c5d6da1d532632920fdce571c254737654d0e37c7aca2d89bf8852126ae15882c3f4965461b341ecfcbf04add3a366010b103d5cd83cf2fe1df8b9c71860e15d
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.1.3)
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/blob/main/cado_labs_logo.png" alt="Supported by Cado Labs" />
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JCW
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.0"
5
5
  end
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.1.3
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-05 00:00:00.000000000 Z
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