jcw 0.2.1 → 0.2.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: bc773311ab088e7276e7fb32a3f4482fe573b1395504aa2a3f65976c2554ee5d
4
- data.tar.gz: e55467a99786575009b8bb0bd87204c0349517913db982e3367235ef11b5d6ca
3
+ metadata.gz: 110c81162cbfa9b0c7320539340e3adc8f2ecb0dc76f3ebc398ab3ef9330db31
4
+ data.tar.gz: 637bfb300fc81f4e07dce12983da6e4a342dbaa2445695241c7f3bd6fdd76f69
5
5
  SHA512:
6
- metadata.gz: 1dfba6de347759d9dbd0073f7f258b7305a2257a340d26dc2248df54cdaaba7319583b18a281b688356f1fbce4ccd0144cffa7656919803418127d036af829f0
7
- data.tar.gz: a60b7db65670d6c171acda171c77cc4de936959417d484fd04678d82ed94ed638c59dafca5bc0336d27007d894af7a6ec8cc2057d28f865472520629f7d71782
6
+ metadata.gz: 1cd01757ae92d40d4e0bd2ba687fc62d612a3ce7a6b3178d1a4038c56e7c2877ff219a8415fe0f4c099b0930b341eaff81efe2345ce6361384c46dfaa16829ab
7
+ data.tar.gz: 696a1156f40a49295c53f638b2626e6269c445f30f73ad809bc725dc765673417de5c9869c39fe3cbbc58146a951ef14f4d11e7a00b6a36193358e3b73ec1c3c
data/Gemfile.lock CHANGED
@@ -1,30 +1,29 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jcw (0.2.1)
5
- activesupport (>= 5.0)
4
+ jcw (0.2.2)
5
+ activesupport (>= 5.0, < 7.0.0)
6
6
  gruf (~> 2.10)
7
7
  httprb-opentracing (~> 0.4.0)
8
8
  jaeger-client (~> 1.1.0)
9
- rack-tracer (~> 0.9.0)
10
9
 
11
10
  GEM
12
11
  remote: https://rubygems.org/
13
12
  specs:
14
- actionpack (6.1.4.1)
15
- actionview (= 6.1.4.1)
16
- activesupport (= 6.1.4.1)
13
+ actionpack (6.1.4.4)
14
+ actionview (= 6.1.4.4)
15
+ activesupport (= 6.1.4.4)
17
16
  rack (~> 2.0, >= 2.0.9)
18
17
  rack-test (>= 0.6.3)
19
18
  rails-dom-testing (~> 2.0)
20
19
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
21
- actionview (6.1.4.1)
22
- activesupport (= 6.1.4.1)
20
+ actionview (6.1.4.4)
21
+ activesupport (= 6.1.4.4)
23
22
  builder (~> 3.1)
24
23
  erubi (~> 1.4)
25
24
  rails-dom-testing (~> 2.0)
26
25
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
27
- activesupport (6.1.4.1)
26
+ activesupport (6.1.4.4)
28
27
  concurrent-ruby (~> 1.0, >= 1.0.2)
29
28
  i18n (>= 1.6, < 2)
30
29
  minitest (>= 5.1)
@@ -34,7 +33,7 @@ GEM
34
33
  public_suffix (>= 2.0.2, < 5.0)
35
34
  ast (2.4.2)
36
35
  builder (3.2.4)
37
- bundler-audit (0.8.0)
36
+ bundler-audit (0.9.0.1)
38
37
  bundler (>= 1.2.0, < 3)
39
38
  thor (~> 1.0)
40
39
  coderay (1.1.3)
@@ -46,17 +45,17 @@ GEM
46
45
  unf (>= 0.0.5, < 1.0.0)
47
46
  e2mmap (0.1.0)
48
47
  erubi (1.10.0)
49
- ffi (1.15.3)
48
+ ffi (1.15.4)
50
49
  ffi-compiler (1.0.1)
51
50
  ffi (>= 1.0.0)
52
51
  rake
53
52
  google-protobuf (3.19.1)
54
53
  googleapis-common-protos-types (1.3.0)
55
54
  google-protobuf (~> 3.14)
56
- grpc (1.41.1)
57
- google-protobuf (~> 3.17)
55
+ grpc (1.42.0)
56
+ google-protobuf (~> 3.18)
58
57
  googleapis-common-protos-types (~> 1.0)
59
- grpc-tools (1.41.1)
58
+ grpc-tools (1.42.0)
60
59
  gruf (2.10.0)
61
60
  activesupport (> 4)
62
61
  concurrent-ruby (> 1)
@@ -66,11 +65,11 @@ GEM
66
65
  json (>= 2.3)
67
66
  slop (~> 4.6)
68
67
  thwait (~> 0.1)
69
- http (5.0.1)
70
- addressable (~> 2.3)
68
+ http (5.0.4)
69
+ addressable (~> 2.8)
71
70
  http-cookie (~> 1.0)
72
71
  http-form_data (~> 2.2)
73
- llhttp-ffi (~> 0.3.0)
72
+ llhttp-ffi (~> 0.4.0)
74
73
  http-cookie (1.0.4)
75
74
  domain_name (~> 0.5)
76
75
  http-form_data (2.3.0)
@@ -78,21 +77,21 @@ GEM
78
77
  ffi-compiler (>= 1.0, < 2.0)
79
78
  httprb-opentracing (0.4.0)
80
79
  opentracing (~> 0.5.0)
81
- i18n (1.8.10)
80
+ i18n (1.8.11)
82
81
  concurrent-ruby (~> 1.0)
83
82
  jaeger-client (1.1.0)
84
83
  opentracing (~> 0.3)
85
84
  thrift
86
85
  json (2.6.1)
87
- llhttp-ffi (0.3.1)
86
+ llhttp-ffi (0.4.0)
88
87
  ffi-compiler (~> 1.0)
89
88
  rake (~> 13.0)
90
- loofah (2.12.0)
89
+ loofah (2.13.0)
91
90
  crass (~> 1.0.2)
92
91
  nokogiri (>= 1.5.9)
93
92
  method_source (1.0.0)
94
93
  mini_portile2 (2.6.1)
95
- minitest (5.14.4)
94
+ minitest (5.15.0)
96
95
  nokogiri (1.12.5)
97
96
  mini_portile2 (~> 2.6.1)
98
97
  racc (~> 1.4)
@@ -101,33 +100,33 @@ GEM
101
100
  nokogiri (1.12.5-x86_64-linux)
102
101
  racc (~> 1.4)
103
102
  opentracing (0.5.0)
104
- parallel (1.20.1)
105
- parser (3.0.2.0)
103
+ opentracing_test_tracer (0.1.1)
104
+ opentracing
105
+ parallel (1.21.0)
106
+ parser (3.0.3.2)
106
107
  ast (~> 2.4.1)
107
108
  pry (0.14.1)
108
109
  coderay (~> 1.1)
109
110
  method_source (~> 1.0)
110
111
  public_suffix (4.0.6)
111
- racc (1.5.2)
112
+ racc (1.6.0)
112
113
  rack (2.2.3)
113
114
  rack-test (1.1.0)
114
115
  rack (>= 1.0, < 3)
115
- rack-tracer (0.9.0)
116
- opentracing (~> 0.4)
117
116
  rails-dom-testing (2.0.3)
118
117
  activesupport (>= 4.2.0)
119
118
  nokogiri (>= 1.6)
120
119
  rails-html-sanitizer (1.4.2)
121
120
  loofah (~> 2.3)
122
- railties (6.1.4.1)
123
- actionpack (= 6.1.4.1)
124
- activesupport (= 6.1.4.1)
121
+ railties (6.1.4.4)
122
+ actionpack (= 6.1.4.4)
123
+ activesupport (= 6.1.4.4)
125
124
  method_source
126
125
  rake (>= 0.13)
127
126
  thor (~> 1.0)
128
127
  rainbow (3.0.0)
129
128
  rake (13.0.6)
130
- regexp_parser (2.1.1)
129
+ regexp_parser (2.2.0)
131
130
  rexml (3.2.5)
132
131
  rspec (3.10.0)
133
132
  rspec-core (~> 3.10.0)
@@ -141,7 +140,7 @@ GEM
141
140
  rspec-mocks (3.10.2)
142
141
  diff-lcs (>= 1.2.0, < 2.0)
143
142
  rspec-support (~> 3.10.0)
144
- rspec-support (3.10.2)
143
+ rspec-support (3.10.3)
145
144
  rubocop (1.17.0)
146
145
  parallel (~> 1.10)
147
146
  parser (>= 3.0.0.0)
@@ -151,7 +150,7 @@ GEM
151
150
  rubocop-ast (>= 1.7.0, < 2.0)
152
151
  ruby-progressbar (~> 1.7)
153
152
  unicode-display_width (>= 1.4.0, < 3.0)
154
- rubocop-ast (1.11.0)
153
+ rubocop-ast (1.15.0)
155
154
  parser (>= 3.0.1.1)
156
155
  rubocop-config-umbrellio (1.17.0.53)
157
156
  rubocop (= 1.17.0)
@@ -191,9 +190,9 @@ GEM
191
190
  concurrent-ruby (~> 1.0)
192
191
  unf (0.1.4)
193
192
  unf_ext
194
- unf_ext (0.0.7.7)
195
- unicode-display_width (2.0.0)
196
- zeitwerk (2.4.2)
193
+ unf_ext (0.0.8)
194
+ unicode-display_width (2.1.0)
195
+ zeitwerk (2.5.1)
197
196
 
198
197
  PLATFORMS
199
198
  ruby
@@ -206,6 +205,7 @@ DEPENDENCIES
206
205
  http
207
206
  http-parser
208
207
  jcw!
208
+ opentracing_test_tracer
209
209
  pry
210
210
  railties
211
211
  rake
data/README.md CHANGED
@@ -42,10 +42,11 @@ UDP Sender(default):
42
42
  hostname: "custom-hostname",
43
43
  custom_tag: "custom-tag-value",
44
44
  }
45
+ config.rack_ignore_paths = %w[/api/test]
45
46
  end
46
47
 
47
- # Set middleware for wrapping all requests(gem RackTracer)
48
- Rails.application.middleware.use(JCW::RackTracer)
48
+ # Set middleware for wrapping all requests
49
+ Rails.application.middleware.use(JCW::Rack::Tracer)
49
50
  ```
50
51
 
51
52
  TCP Sender:
@@ -59,16 +60,17 @@ TCP Sender:
59
60
  hostname: "custom-hostname",
60
61
  custom_tag: "custom-tag-value",
61
62
  }
63
+ config.rack_ignore_paths = %w[/api/test]
62
64
  end
63
65
 
64
66
  # Set middleware for wrapping all requests
65
- Rails.application.middleware.use(JCW::RackTracer)
67
+ Rails.application.middleware.use(JCW::Rack::Tracer)
66
68
 
67
69
  # If you need send all logs with spans set on_finish_span and extend JaegerLoggerExtension
68
70
  # Not recommended for UDP sender, because default max packet size is 65,000 bytes.
69
71
  Rails.application.config.tap do |config|
70
72
  config.middleware.use(
71
- JCW::RackTracer,
73
+ JCW::Rack::Tracer,
72
74
  on_finish_span: lambda do |span|
73
75
  JCW::Logger.current.logs.each { |log| span.log_kv(**log) }
74
76
  JCW::Logger.current.clear # Do not forget to avoid memory leaks
data/jcw.gemspec CHANGED
@@ -22,16 +22,16 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_dependency "activesupport", ">= 5.0"
25
+ spec.add_dependency "activesupport", ">= 5.0", "< 7.0.0"
26
26
  spec.add_dependency "gruf", "~> 2.10"
27
27
  spec.add_dependency "httprb-opentracing", "~> 0.4.0"
28
28
  spec.add_dependency "jaeger-client", "~> 1.1.0"
29
- spec.add_dependency "rack-tracer", "~> 0.9.0"
30
29
 
31
30
  spec.add_development_dependency "bundler"
32
31
  spec.add_development_dependency "bundler-audit"
33
32
  spec.add_development_dependency "http"
34
33
  spec.add_development_dependency "http-parser"
34
+ spec.add_development_dependency "opentracing_test_tracer"
35
35
  spec.add_development_dependency "pry"
36
36
  spec.add_development_dependency "railties"
37
37
  spec.add_development_dependency "rake"
@@ -39,4 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "rubocop-config-umbrellio"
40
40
  spec.add_development_dependency "simplecov"
41
41
  spec.add_development_dependency "simplecov-lcov"
42
+ spec.metadata = {
43
+ "rubygems_mfa_required" => "true",
44
+ }
42
45
  end
data/lib/jcw/config.rb CHANGED
@@ -8,7 +8,8 @@ module JCW
8
8
  :connection,
9
9
  :flush_interval,
10
10
  :tags,
11
- :grpc_ignore_methods
11
+ :grpc_ignore_methods,
12
+ :rack_ignore_paths
12
13
 
13
14
  def enabled
14
15
  @enabled ||= false
@@ -39,5 +40,9 @@ module JCW
39
40
  def grpc_ignore_methods
40
41
  @grpc_ignore_methods ||= []
41
42
  end
43
+
44
+ def rack_ignore_paths
45
+ @rack_ignore_paths ||= []
46
+ end
42
47
  end
43
48
  end
@@ -17,6 +17,7 @@ module JCW
17
17
  host = request.uri.host if request.uri.respond_to?(:host)
18
18
  port = request.uri.port if request.uri.respond_to?(:port)
19
19
  verb = request.verb.to_s.upcase if request.respond_to?(:verb)
20
+ full_path = request.uri.to_s
20
21
 
21
22
  tags = {
22
23
  "component" => "ruby-httprb",
@@ -25,13 +26,15 @@ module JCW
25
26
  "http.url" => path,
26
27
  "peer.host" => host,
27
28
  "peer.port" => port,
29
+ "full_path" => full_path,
28
30
  }.compact
29
31
 
30
32
  tracer = ::HTTP::Tracer.tracer
31
33
 
32
- tracer.start_active_span("http.request", tags: tags) do |scope|
34
+ request_name = "http.request #{verb} #{path}"
35
+ tracer.start_active_span(request_name, tags: tags) do |scope|
33
36
  request.headers.merge!(options.headers)
34
- OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_RACK,
37
+ OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_TEXT_MAP,
35
38
  request.headers)
36
39
 
37
40
  res = perform_without_tracing(request, options)
@@ -1,5 +1,130 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # inspired https://github.com/opentracing-contrib/ruby-rack-tracer/blob/master/lib/rack/tracer.rb
3
4
  module JCW
4
- RackTracer = Class.new(Rack::Tracer)
5
+ module Rack
6
+ class Tracer
7
+ REQUEST_URI = "REQUEST_URI"
8
+ REQUEST_PATH = "REQUEST_PATH"
9
+ REQUEST_METHOD = "REQUEST_METHOD"
10
+
11
+ # Create a new Rack Tracer middleware.
12
+ #
13
+ # @param app The Rack application/middlewares stack.
14
+ # @param tracer [OpenTracing::Tracer] A tracer to be used when start_span, and extract
15
+ # is called.
16
+ # @param on_start_span [Proc, nil] A callback evaluated after a new span is created.
17
+ # @param on_finish_span [Proc, nil] A callback evaluated after a span is finished.
18
+ # @param ignore_paths [Array<Class>] An array of paths to be skiped by the tracer.
19
+ # @param errors [Array<Class>] An array of error classes to be captured by the tracer
20
+ # as errors. Errors are **not** muted by the middleware, they're re-raised afterwards.
21
+ def initialize(app, # rubocop:disable Metrics/ParameterLists
22
+ tracer: OpenTracing.global_tracer,
23
+ on_start_span: nil,
24
+ on_finish_span: nil,
25
+ trust_incoming_span: true,
26
+ ignore_paths: Wrapper.config.rack_ignore_paths,
27
+ errors: [StandardError])
28
+ @app = app
29
+ @tracer = tracer
30
+ @on_start_span = on_start_span
31
+ @on_finish_span = on_finish_span
32
+ @trust_incoming_span = trust_incoming_span
33
+ @errors = errors
34
+ @ignore_paths = ignore_paths
35
+ end
36
+
37
+ def call(env)
38
+ method = env[REQUEST_METHOD]
39
+ path = env[REQUEST_PATH]
40
+ url = env[REQUEST_URI]
41
+
42
+ return @app.call(env) if @ignore_paths.include?(path)
43
+
44
+ handle_error(@errors) do
45
+ env["uber-trace-id"] = env["HTTP_UBER_TRACE_ID"]
46
+ context = @tracer.extract(OpenTracing::FORMAT_TEXT_MAP, env) if @trust_incoming_span
47
+ @scope = build_scope(method, url, context)
48
+ @span = @scope.span
49
+
50
+ perform_on_start_span(env, @span, @on_start_span)
51
+
52
+ @app.call(env).tap do |status_code, _headers, _body|
53
+ set_tag(@span, status_code, env)
54
+ end
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def handle_error(errors)
61
+ yield
62
+ rescue *errors => e
63
+ @span.set_tag("error", true)
64
+ @span.log_kv(
65
+ event: "error",
66
+ "error.kind": e.class.to_s,
67
+ "error.object": e,
68
+ message: e.message,
69
+ stack: e.backtrace.join("\n"),
70
+ )
71
+ raise
72
+ ensure
73
+ begin
74
+ @scope.close
75
+ ensure
76
+ perform_on_finish_span
77
+ end
78
+ end
79
+
80
+ def build_scope(method, url, context)
81
+ @tracer.start_active_span(
82
+ method,
83
+ child_of: context,
84
+ tags: {
85
+ "component" => "rack",
86
+ "span.kind" => "server",
87
+ "http.method" => method,
88
+ "http.url" => url,
89
+ },
90
+ )
91
+ end
92
+
93
+ def perform_on_start_span(env, span, on_start_span)
94
+ on_start_span&.call(span)
95
+ env["rack.span"] = span
96
+ end
97
+
98
+ def set_tag(span, status_code, env)
99
+ span.set_tag("http.status_code", status_code)
100
+ route = route_from_env(env)
101
+ span.operation_name = route if route
102
+ end
103
+
104
+ def route_from_env(env)
105
+ method = env[REQUEST_METHOD]
106
+ if (sinatra_route = env["sinatra.route"])
107
+ sinatra_route
108
+ elsif (rails_controller = env["action_controller.instance"])
109
+ "#{method} #{rails_controller.controller_name}/#{rails_controller.action_name}"
110
+ elsif (grape_route_args = env["grape.routing_args"] || env["rack.routing_args"])
111
+ "#{method} #{grape_route_from_args(grape_route_args)}"
112
+ end
113
+ end
114
+
115
+ def grape_route_from_args(route_args)
116
+ route_info = route_args[:route_info]
117
+ if route_info.respond_to?(:path)
118
+ route_info.path
119
+ elsif (rack_route_options = route_info.instance_variable_get(:@options))
120
+ rack_route_options[:path]
121
+ end
122
+ end
123
+
124
+ def perform_on_finish_span
125
+ return unless @on_finish_span
126
+ @on_finish_span.call(@span)
127
+ end
128
+ end
129
+ end
5
130
  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.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
data/lib/jcw.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rack/tracer"
3
+ require "opentracing"
4
4
  require "jaeger/client"
5
5
  require "active_support"
6
6
  require "httprb-opentracing"
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.2.1
4
+ version: 0.2.2
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-11-18 00:00:00.000000000 Z
11
+ date: 2021-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '5.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 7.0.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '5.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 7.0.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: gruf
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -67,21 +73,21 @@ dependencies:
67
73
  - !ruby/object:Gem::Version
68
74
  version: 1.1.0
69
75
  - !ruby/object:Gem::Dependency
70
- name: rack-tracer
76
+ name: bundler
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - "~>"
79
+ - - ">="
74
80
  - !ruby/object:Gem::Version
75
- version: 0.9.0
76
- type: :runtime
81
+ version: '0'
82
+ type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
- - - "~>"
86
+ - - ">="
81
87
  - !ruby/object:Gem::Version
82
- version: 0.9.0
88
+ version: '0'
83
89
  - !ruby/object:Gem::Dependency
84
- name: bundler
90
+ name: bundler-audit
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - ">="
@@ -95,7 +101,7 @@ dependencies:
95
101
  - !ruby/object:Gem::Version
96
102
  version: '0'
97
103
  - !ruby/object:Gem::Dependency
98
- name: bundler-audit
104
+ name: http
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
107
  - - ">="
@@ -109,7 +115,7 @@ dependencies:
109
115
  - !ruby/object:Gem::Version
110
116
  version: '0'
111
117
  - !ruby/object:Gem::Dependency
112
- name: http
118
+ name: http-parser
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
115
121
  - - ">="
@@ -123,7 +129,7 @@ dependencies:
123
129
  - !ruby/object:Gem::Version
124
130
  version: '0'
125
131
  - !ruby/object:Gem::Dependency
126
- name: http-parser
132
+ name: opentracing_test_tracer
127
133
  requirement: !ruby/object:Gem::Requirement
128
134
  requirements:
129
135
  - - ">="
@@ -270,7 +276,8 @@ files:
270
276
  homepage: https://github.com/Cado-Labs/jcw
271
277
  licenses:
272
278
  - MIT
273
- metadata: {}
279
+ metadata:
280
+ rubygems_mfa_required: 'true'
274
281
  post_install_message:
275
282
  rdoc_options: []
276
283
  require_paths: