grpc_opencensus_interceptor 0.0.1 → 0.0.2

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: c84957ff2c9d44336456778af7145cc38d1bbd74e54375d1a5bb3c1d56c323be
4
- data.tar.gz: bccd9a4397ce695db700d6b0893d5abd6144bb9d4c288a20d94d1a8daae63aaa
3
+ metadata.gz: 858e38644b3a323462339607aed2c45ae1cdb317de12d345094911a5a6a733ef
4
+ data.tar.gz: d43818860944836bdc399e7a54c642a572c4da4df416a8c710bddd1d0c4b172b
5
5
  SHA512:
6
- metadata.gz: ba6e5cb703795e1c5f755dba71010b7df80ad3bc4a0c4afc31779a8315099949695ab847382338ac106d1208b15fa81311465e1c81ab514af37b16521f55d85f
7
- data.tar.gz: '08e725b44a73ac30b62c5751563bb9ca3c2d58ba3e6f60118e64bfda711bdda3b87e346d8222827c14dc8e242ed64b522611a07486945255c39667dc6b27d302'
6
+ metadata.gz: 9b73ac05b6a2b37dba65cfda255b93d01d30a050bb2c76a2c1e50ee3a44c8431909361e11b14a0f2e93894524bf60a484d1d50d4136539cb757a9ea9a39ad27c
7
+ data.tar.gz: 511f290f14c2d0ad8ae92fe31a40e694b10483b96431a86315315bd4f5da40991eb6c599aa004bab78c033950d7b9ba969b9c6ed601e8aa347fde9f4c183f52d
@@ -4,4 +4,7 @@ language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
6
  - 2.6.3
7
- before_install: gem install bundler -v 2.0.2
7
+ before_install:
8
+ - gem install bundler -v 2.0.2
9
+ script:
10
+ - bundle exec rspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grpc_opencensus_interceptor (0.0.1)
4
+ grpc_opencensus_interceptor (0.0.2)
5
5
  grpc
6
6
  opencensus
7
7
 
@@ -10,11 +10,11 @@ GEM
10
10
  specs:
11
11
  coderay (1.1.2)
12
12
  diff-lcs (1.3)
13
- google-protobuf (3.11.2)
13
+ google-protobuf (3.11.4)
14
14
  googleapis-common-protos-types (1.0.4)
15
15
  google-protobuf (~> 3.0)
16
- grpc (1.26.0)
17
- google-protobuf (~> 3.8)
16
+ grpc (1.27.0)
17
+ google-protobuf (~> 3.11)
18
18
  googleapis-common-protos-types (~> 1.0)
19
19
  method_source (0.9.2)
20
20
  opencensus (0.5.0)
@@ -24,7 +24,7 @@ GEM
24
24
  pry-doc (1.0.0)
25
25
  pry (~> 0.11)
26
26
  yard (~> 0.9.11)
27
- rake (10.5.0)
27
+ rake (13.0.1)
28
28
  rspec (3.9.0)
29
29
  rspec-core (~> 3.9.0)
30
30
  rspec-expectations (~> 3.9.0)
@@ -48,7 +48,7 @@ DEPENDENCIES
48
48
  grpc_opencensus_interceptor!
49
49
  pry
50
50
  pry-doc
51
- rake (~> 10.0)
51
+ rake (~> 13.0)
52
52
  rspec (~> 3.0)
53
53
 
54
54
  BUNDLED WITH
data/README.md CHANGED
@@ -19,6 +19,7 @@ Or install it yourself as:
19
19
 
20
20
  ## Usage
21
21
 
22
+ ### Server
22
23
  Please set a `GrpcOpencensusInterceptor` as an interceptor of your gRPC application.
23
24
 
24
25
  ```ruby
@@ -27,13 +28,25 @@ require 'grpc_opencensus_interceptor'
27
28
 
28
29
  server = GRPC::RpcServer.new(
29
30
  interceptors: [
30
- GrpcOpencensusInterceptor.new,
31
+ GrpcOpencensusInterceptor::ServerInterceptor.new,
31
32
  ]
32
33
  )
33
34
  server.handle(MyHandler.new)
34
35
  server.run_till_terminated_or_interrupted(['SIGINT'])
35
36
  ```
36
37
 
38
+ ### Client
39
+
40
+ ```ruby
41
+ require 'grpc'
42
+ require 'grpc_opencensus_interceptor'
43
+ url = "dns:test-service:80"
44
+ stub = TestService::Stub.new(url, :this_channel_is_insecure, interceptors: [
45
+ GrpcOpencensusInterceptor::ClientInterceptor.new,
46
+ ])
47
+ stub.hello_rpc
48
+ ```
49
+
37
50
  ## Development
38
51
 
39
52
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.require_paths = ["lib"]
27
27
 
28
28
  spec.add_development_dependency "bundler", "~> 2.0"
29
- spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rake", "~> 13.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
31
  spec.add_development_dependency "pry"
32
32
  spec.add_development_dependency "pry-doc"
@@ -1,5 +1,10 @@
1
- require "grpc_opencensus_interceptor/version"
1
+ require "opencensus"
2
+ require "grpc"
3
+
4
+ require "grpc_opencensus_interceptor/client_interceptor"
2
5
  require "grpc_opencensus_interceptor/server_interceptor"
6
+ require "grpc_opencensus_interceptor/util"
7
+ require "grpc_opencensus_interceptor/version"
3
8
 
4
9
  module GrpcOpencensusInterceptor
5
10
  class << self
@@ -0,0 +1,83 @@
1
+ module GrpcOpencensusInterceptor
2
+ class ClientInterceptor < GRPC::ClientInterceptor
3
+ # @param [SpanContext] span_context The span context within which
4
+ # to create spans. Optional: If omitted, spans are created in the
5
+ # current thread-local span context.
6
+ # @param [#call] sampler The sampler to use when creating spans.
7
+ # Optional: If omitted, uses the sampler in the current config.
8
+ def initialize(span_context: nil, sampler: nil)
9
+ @span_context = span_context || OpenCensus::Trace
10
+ @sampler = sampler
11
+ @serializer = OpenCensus::Trace::Formatters::Binary.new
12
+ end
13
+
14
+ ##
15
+ # Intercept a unary request response call
16
+ #
17
+ # @param [Object] request
18
+ # @param [GRPC::ActiveCall] call
19
+ # @param [String] method
20
+ # @param [Hash] metadata
21
+ #
22
+ def request_response(request:, call:, method:, metadata:)
23
+ span_context = @span_context
24
+ if span_context == OpenCensus::Trace && !span_context.span_context
25
+ return yield
26
+ end
27
+
28
+ # NOTE: Use method as span name
29
+ span_name = method
30
+
31
+ span = span_context.start_span span_name, sampler: @sampler
32
+ start_request span, method, metadata
33
+ begin
34
+ grpc_ex = GRPC::Ok.new
35
+ yield
36
+ rescue StandardError => e
37
+ grpc_ex = Util.to_grpc_ex(e)
38
+ raise e
39
+ ensure
40
+ finish_request span, grpc_ex
41
+ span_context.end_span span
42
+ end
43
+ end
44
+
45
+ # NOTE: For now, we don't support server_streamer, client_streamer and bidi_streamer
46
+
47
+ private
48
+
49
+ ##
50
+ # @private Set span attributes
51
+ #
52
+ # @param [OpenCensus::Trace::SpanBuilder] span
53
+ # @param [String] method
54
+ # @param [Hash] metadata
55
+ #
56
+ def start_request span, method, metadata
57
+ span.kind = OpenCensus::Trace::SpanBuilder::CLIENT
58
+ span.put_attribute "http.method", "POST" # NOTE: Always use POST
59
+
60
+ span.put_attribute "http.path", method
61
+
62
+ # TODO(south37) Set attributes
63
+ # span.put_message_event SpanBuilder::SENT, 1, body_size
64
+
65
+ trace_context = @serializer.serialize span.context.trace_context
66
+ metadata[Util::OPENCENSUS_TRACE_BIN_KEY] = trace_context
67
+ end
68
+
69
+ ##
70
+ # @private Set span attributes from response
71
+ #
72
+ # @param [OpenCensus::Trace::SpanBuilder] span
73
+ # @param [GRPC::BadStatus] exception
74
+ #
75
+ def finish_request span, exception
76
+ span.set_status exception.code
77
+ span.put_attribute "http.status_code", Util.to_http_status(exception)
78
+
79
+ # TODO(south37) Set attributes
80
+ # span.put_message_event SpanBuilder::RECEIVED, 1, body_size
81
+ end
82
+ end
83
+ end
@@ -1,10 +1,7 @@
1
- require "opencensus"
2
- require "grpc"
3
1
  require "grpc_opencensus_interceptor/server_interceptor/span_modifier"
4
2
 
5
3
  module GrpcOpencensusInterceptor
6
4
  class ServerInterceptor < GRPC::ServerInterceptor
7
- OPENCENSUS_TRACE_BIN_KEY = "grpc-trace-bin".freeze
8
5
 
9
6
  # @param [#export] exporter The exported used to export captured spans
10
7
  # at the end of the request. Optional: If omitted, uses the exporter
@@ -26,11 +23,11 @@ module GrpcOpencensusInterceptor
26
23
  # @param [Method] method
27
24
  #
28
25
  def request_response(request:, call:, method:)
29
- context_bin = call.metadata[OPENCENSUS_TRACE_BIN_KEY]
26
+ context_bin = call.metadata[Util::OPENCENSUS_TRACE_BIN_KEY]
30
27
  if context_bin
31
28
  context = deserialize(context_bin)
32
29
  else
33
- cojntext = nil
30
+ context = nil
34
31
  end
35
32
 
36
33
  OpenCensus::Trace.start_request_trace(
@@ -45,7 +42,7 @@ module GrpcOpencensusInterceptor
45
42
  grpc_ex = GRPC::Ok.new
46
43
  yield
47
44
  rescue StandardError => e
48
- grpc_ex = to_grpc_ex(e)
45
+ grpc_ex = Util.to_grpc_ex(e)
49
46
  raise e
50
47
  ensure
51
48
  finish_request(span, grpc_ex)
@@ -67,6 +64,7 @@ module GrpcOpencensusInterceptor
67
64
  @deserializer.deserialize(context_bin)
68
65
  end
69
66
 
67
+ ##
70
68
  # Span name is represented as $package.$service/$method
71
69
  # cf. https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/gRPC.md#spans
72
70
  #
@@ -88,6 +86,7 @@ module GrpcOpencensusInterceptor
88
86
  term.split("_").map(&:capitalize).join
89
87
  end
90
88
 
89
+ ##
91
90
  # Modify span by custom span modifier
92
91
  #
93
92
  # @param [OpenCensus::Trace::SpanBuilder] span
@@ -116,56 +115,7 @@ module GrpcOpencensusInterceptor
116
115
  # Set gRPC server status
117
116
  # https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/gRPC.md#spans
118
117
  span.set_status exception.code
119
- span.put_attribute "http.status_code", to_http_status(exception)
120
- end
121
-
122
- # cf. https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
123
- # cf. https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/HTTP.md#mapping-from-http-status-codes-to-trace-status-codes
124
- #
125
- # @param [GRPC::BadStatus] exception
126
- # @return [Integer]
127
- def to_http_status(exception)
128
- case exception
129
- when GRPC::Ok
130
- 200
131
- when GRPC::InvalidArgument
132
- 400
133
- when GRPC::DeadlineExceeded
134
- 504
135
- when GRPC::NotFound
136
- 404
137
- when GRPC::PermissionDenied
138
- 403
139
- when GRPC::Unauthenticated
140
- 401
141
- when GRPC::Aborted
142
- # For GRPC::Aborted, grpc-gateway uses 409. We do the same.
143
- # cf. https://github.com/grpc-ecosystem/grpc-gateway/blob/e8db07a3923d3f5c77dbcea96656afe43a2757a8/runtime/errors.go#L17-L58
144
- 409
145
- when GRPC::ResourceExhausted
146
- 429
147
- when GRPC::Unimplemented
148
- 501
149
- when GRPC::Unavailable
150
- 503
151
- when GRPC::Unknown
152
- # NOTE: This is not same with the correct mapping
153
- 500
154
- else
155
- # NOTE: Here, we use 500 temporarily.
156
- 500
157
- end
158
- end
159
-
160
- # @param [Exception] e
161
- # @return [GRPC::BadStatus] e
162
- def to_grpc_ex(e)
163
- case e
164
- when GRPC::BadStatus
165
- e
166
- else
167
- GRPC::Unknown.new(e.message)
168
- end
118
+ span.put_attribute "http.status_code", Util.to_http_status(exception)
169
119
  end
170
120
  end
171
121
  end
@@ -0,0 +1,56 @@
1
+ module GrpcOpencensusInterceptor
2
+ module Util
3
+ OPENCENSUS_TRACE_BIN_KEY = "grpc-trace-bin".freeze
4
+
5
+ class << self
6
+ # cf. https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
7
+ # cf. https://github.com/census-instrumentation/opencensus-specs/blob/master/trace/HTTP.md#mapping-from-http-status-codes-to-trace-status-codes
8
+ #
9
+ # @param [GRPC::BadStatus] exception
10
+ # @return [Integer]
11
+ def to_http_status(exception)
12
+ case exception
13
+ when GRPC::Ok
14
+ 200
15
+ when GRPC::InvalidArgument
16
+ 400
17
+ when GRPC::DeadlineExceeded
18
+ 504
19
+ when GRPC::NotFound
20
+ 404
21
+ when GRPC::PermissionDenied
22
+ 403
23
+ when GRPC::Unauthenticated
24
+ 401
25
+ when GRPC::Aborted
26
+ # For GRPC::Aborted, grpc-gateway uses 409. We do the same.
27
+ # cf. https://github.com/grpc-ecosystem/grpc-gateway/blob/e8db07a3923d3f5c77dbcea96656afe43a2757a8/runtime/errors.go#L17-L58
28
+ 409
29
+ when GRPC::ResourceExhausted
30
+ 429
31
+ when GRPC::Unimplemented
32
+ 501
33
+ when GRPC::Unavailable
34
+ 503
35
+ when GRPC::Unknown
36
+ # NOTE: This is not same with the correct mapping
37
+ 500
38
+ else
39
+ # NOTE: Here, we use 500 temporarily.
40
+ 500
41
+ end
42
+ end
43
+
44
+ # @param [Exception] e
45
+ # @return [GRPC::BadStatus] e
46
+ def to_grpc_ex(e)
47
+ case e
48
+ when GRPC::BadStatus
49
+ e
50
+ else
51
+ GRPC::Unknown.new(e.message)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,3 +1,3 @@
1
1
  module GrpcOpencensusInterceptor
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc_opencensus_interceptor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nao Minami
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-16 00:00:00.000000000 Z
11
+ date: 2020-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
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: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,8 +128,10 @@ files:
128
128
  - bin/setup
129
129
  - grpc_opencensus_interceptor.gemspec
130
130
  - lib/grpc_opencensus_interceptor.rb
131
+ - lib/grpc_opencensus_interceptor/client_interceptor.rb
131
132
  - lib/grpc_opencensus_interceptor/server_interceptor.rb
132
133
  - lib/grpc_opencensus_interceptor/server_interceptor/span_modifier.rb
134
+ - lib/grpc_opencensus_interceptor/util.rb
133
135
  - lib/grpc_opencensus_interceptor/version.rb
134
136
  homepage: https://github.com/south37/grpc_opencensus_interceptor
135
137
  licenses: