jcw 0.2.1 → 0.2.2

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: 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: