jcw 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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