jcw 0.2.0 → 0.2.4
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 +4 -4
- data/.github/workflows/test.yml +1 -4
- data/.rubocop.yml +4 -1
- data/Gemfile.lock +42 -50
- data/README.md +9 -7
- data/jcw.gemspec +6 -3
- data/lib/jcw/config.rb +6 -1
- data/lib/jcw/http_tracer.rb +5 -2
- data/lib/jcw/rack_tracer.rb +136 -1
- data/lib/jcw/version.rb +1 -1
- data/lib/jcw.rb +1 -1
- metadata +21 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e7f97935444bb8d0285e96565c731f99e65df848573cc0257eb041dc90d3bf8b
|
|
4
|
+
data.tar.gz: a119efdd207f9ebf9965cb8a62fab5c8e3541db7535e5649a14808f02a0683f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b70cfaecfca2e89dda7c95eb471d0169afc9deb286fb42481f36663db89c07850ef8c7d5185b7cb47658313e812d01328f95d8f68a88a8e4db6b0b37007f5a2f
|
|
7
|
+
data.tar.gz: 14ca08c194b0c3c710670f7b9e77f6584a269366167a3ec4bfadaf042c7fa0e60776981af46b2dff7af69ed0a96fafd116585fbfa1a2721624225d9aeec399c1
|
data/.github/workflows/test.yml
CHANGED
|
@@ -41,11 +41,8 @@ jobs:
|
|
|
41
41
|
strategy:
|
|
42
42
|
fail-fast: false
|
|
43
43
|
matrix:
|
|
44
|
-
ruby: [2.7, 2.7.4, 3.0.0, 3.0.1, 3.0.2]
|
|
44
|
+
ruby: [2.6, 2.7, 2.7.4, 3.0.0, 3.0.1, 3.0.2]
|
|
45
45
|
experimental: [false]
|
|
46
|
-
include:
|
|
47
|
-
- ruby: head
|
|
48
|
-
experimental: true
|
|
49
46
|
|
|
50
47
|
steps:
|
|
51
48
|
- uses: actions/checkout@v2
|
data/.rubocop.yml
CHANGED
|
@@ -3,7 +3,7 @@ inherit_gem:
|
|
|
3
3
|
|
|
4
4
|
AllCops:
|
|
5
5
|
DisplayCopNames: true
|
|
6
|
-
TargetRubyVersion: 2.
|
|
6
|
+
TargetRubyVersion: 2.6
|
|
7
7
|
|
|
8
8
|
RSpec/EmptyLineAfterHook:
|
|
9
9
|
Enabled: false
|
|
@@ -11,6 +11,9 @@ RSpec/EmptyLineAfterHook:
|
|
|
11
11
|
Naming/RescuedExceptionsVariableName:
|
|
12
12
|
Enabled: false
|
|
13
13
|
|
|
14
|
+
Style/CaseEquality:
|
|
15
|
+
Enabled: false
|
|
16
|
+
|
|
14
17
|
Style/HashConversion:
|
|
15
18
|
Exclude:
|
|
16
19
|
- spec/**/*_spec.rb
|
data/Gemfile.lock
CHANGED
|
@@ -1,30 +1,29 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
jcw (0.2.
|
|
5
|
-
activesupport (>= 5.0)
|
|
4
|
+
jcw (0.2.4)
|
|
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.
|
|
15
|
-
actionview (= 6.1.4.
|
|
16
|
-
activesupport (= 6.1.4.
|
|
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.
|
|
22
|
-
activesupport (= 6.1.4.
|
|
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.
|
|
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.
|
|
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,39 +45,31 @@ 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.
|
|
48
|
+
ffi (1.15.4)
|
|
50
49
|
ffi-compiler (1.0.1)
|
|
51
50
|
ffi (>= 1.0.0)
|
|
52
51
|
rake
|
|
53
|
-
google-protobuf (3.
|
|
54
|
-
|
|
55
|
-
google-protobuf (3.18.1-x86_64-linux)
|
|
56
|
-
googleapis-common-protos-types (1.2.0)
|
|
52
|
+
google-protobuf (3.19.3)
|
|
53
|
+
googleapis-common-protos-types (1.3.0)
|
|
57
54
|
google-protobuf (~> 3.14)
|
|
58
55
|
grpc (1.41.0)
|
|
59
56
|
google-protobuf (~> 3.17)
|
|
60
57
|
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
58
|
grpc-tools (1.41.0)
|
|
68
|
-
gruf (2.
|
|
59
|
+
gruf (2.12.0)
|
|
69
60
|
activesupport (> 4)
|
|
70
61
|
concurrent-ruby (> 1)
|
|
71
|
-
e2mmap (
|
|
72
|
-
grpc (~> 1.10)
|
|
73
|
-
grpc-tools (~> 1.10)
|
|
62
|
+
e2mmap (>= 0.1)
|
|
63
|
+
grpc (~> 1.10, <= 1.41.0)
|
|
64
|
+
grpc-tools (~> 1.10, <= 1.41.0)
|
|
74
65
|
json (>= 2.3)
|
|
75
|
-
slop (
|
|
76
|
-
thwait (
|
|
77
|
-
http (5.0.
|
|
78
|
-
addressable (~> 2.
|
|
66
|
+
slop (>= 4.6)
|
|
67
|
+
thwait (>= 0.1)
|
|
68
|
+
http (5.0.4)
|
|
69
|
+
addressable (~> 2.8)
|
|
79
70
|
http-cookie (~> 1.0)
|
|
80
71
|
http-form_data (~> 2.2)
|
|
81
|
-
llhttp-ffi (~> 0.
|
|
72
|
+
llhttp-ffi (~> 0.4.0)
|
|
82
73
|
http-cookie (1.0.4)
|
|
83
74
|
domain_name (~> 0.5)
|
|
84
75
|
http-form_data (2.3.0)
|
|
@@ -86,21 +77,21 @@ GEM
|
|
|
86
77
|
ffi-compiler (>= 1.0, < 2.0)
|
|
87
78
|
httprb-opentracing (0.4.0)
|
|
88
79
|
opentracing (~> 0.5.0)
|
|
89
|
-
i18n (1.8.
|
|
80
|
+
i18n (1.8.11)
|
|
90
81
|
concurrent-ruby (~> 1.0)
|
|
91
82
|
jaeger-client (1.1.0)
|
|
92
83
|
opentracing (~> 0.3)
|
|
93
84
|
thrift
|
|
94
|
-
json (2.
|
|
95
|
-
llhttp-ffi (0.
|
|
85
|
+
json (2.6.1)
|
|
86
|
+
llhttp-ffi (0.4.0)
|
|
96
87
|
ffi-compiler (~> 1.0)
|
|
97
88
|
rake (~> 13.0)
|
|
98
|
-
loofah (2.
|
|
89
|
+
loofah (2.13.0)
|
|
99
90
|
crass (~> 1.0.2)
|
|
100
91
|
nokogiri (>= 1.5.9)
|
|
101
92
|
method_source (1.0.0)
|
|
102
93
|
mini_portile2 (2.6.1)
|
|
103
|
-
minitest (5.
|
|
94
|
+
minitest (5.15.0)
|
|
104
95
|
nokogiri (1.12.5)
|
|
105
96
|
mini_portile2 (~> 2.6.1)
|
|
106
97
|
racc (~> 1.4)
|
|
@@ -109,33 +100,33 @@ GEM
|
|
|
109
100
|
nokogiri (1.12.5-x86_64-linux)
|
|
110
101
|
racc (~> 1.4)
|
|
111
102
|
opentracing (0.5.0)
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
opentracing_test_tracer (0.1.1)
|
|
104
|
+
opentracing
|
|
105
|
+
parallel (1.21.0)
|
|
106
|
+
parser (3.0.3.2)
|
|
114
107
|
ast (~> 2.4.1)
|
|
115
108
|
pry (0.14.1)
|
|
116
109
|
coderay (~> 1.1)
|
|
117
110
|
method_source (~> 1.0)
|
|
118
111
|
public_suffix (4.0.6)
|
|
119
|
-
racc (1.
|
|
112
|
+
racc (1.6.0)
|
|
120
113
|
rack (2.2.3)
|
|
121
114
|
rack-test (1.1.0)
|
|
122
115
|
rack (>= 1.0, < 3)
|
|
123
|
-
rack-tracer (0.9.0)
|
|
124
|
-
opentracing (~> 0.4)
|
|
125
116
|
rails-dom-testing (2.0.3)
|
|
126
117
|
activesupport (>= 4.2.0)
|
|
127
118
|
nokogiri (>= 1.6)
|
|
128
119
|
rails-html-sanitizer (1.4.2)
|
|
129
120
|
loofah (~> 2.3)
|
|
130
|
-
railties (6.1.4.
|
|
131
|
-
actionpack (= 6.1.4.
|
|
132
|
-
activesupport (= 6.1.4.
|
|
121
|
+
railties (6.1.4.4)
|
|
122
|
+
actionpack (= 6.1.4.4)
|
|
123
|
+
activesupport (= 6.1.4.4)
|
|
133
124
|
method_source
|
|
134
125
|
rake (>= 0.13)
|
|
135
126
|
thor (~> 1.0)
|
|
136
127
|
rainbow (3.0.0)
|
|
137
128
|
rake (13.0.6)
|
|
138
|
-
regexp_parser (2.
|
|
129
|
+
regexp_parser (2.2.0)
|
|
139
130
|
rexml (3.2.5)
|
|
140
131
|
rspec (3.10.0)
|
|
141
132
|
rspec-core (~> 3.10.0)
|
|
@@ -149,7 +140,7 @@ GEM
|
|
|
149
140
|
rspec-mocks (3.10.2)
|
|
150
141
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
151
142
|
rspec-support (~> 3.10.0)
|
|
152
|
-
rspec-support (3.10.
|
|
143
|
+
rspec-support (3.10.3)
|
|
153
144
|
rubocop (1.17.0)
|
|
154
145
|
parallel (~> 1.10)
|
|
155
146
|
parser (>= 3.0.0.0)
|
|
@@ -159,7 +150,7 @@ GEM
|
|
|
159
150
|
rubocop-ast (>= 1.7.0, < 2.0)
|
|
160
151
|
ruby-progressbar (~> 1.7)
|
|
161
152
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
162
|
-
rubocop-ast (1.
|
|
153
|
+
rubocop-ast (1.15.0)
|
|
163
154
|
parser (>= 3.0.1.1)
|
|
164
155
|
rubocop-config-umbrellio (1.17.0.53)
|
|
165
156
|
rubocop (= 1.17.0)
|
|
@@ -199,9 +190,9 @@ GEM
|
|
|
199
190
|
concurrent-ruby (~> 1.0)
|
|
200
191
|
unf (0.1.4)
|
|
201
192
|
unf_ext
|
|
202
|
-
unf_ext (0.0.
|
|
203
|
-
unicode-display_width (2.
|
|
204
|
-
zeitwerk (2.
|
|
193
|
+
unf_ext (0.0.8)
|
|
194
|
+
unicode-display_width (2.1.0)
|
|
195
|
+
zeitwerk (2.5.1)
|
|
205
196
|
|
|
206
197
|
PLATFORMS
|
|
207
198
|
ruby
|
|
@@ -214,6 +205,7 @@ DEPENDENCIES
|
|
|
214
205
|
http
|
|
215
206
|
http-parser
|
|
216
207
|
jcw!
|
|
208
|
+
opentracing_test_tracer
|
|
217
209
|
pry
|
|
218
210
|
railties
|
|
219
211
|
rake
|
|
@@ -223,4 +215,4 @@ DEPENDENCIES
|
|
|
223
215
|
simplecov-lcov
|
|
224
216
|
|
|
225
217
|
BUNDLED WITH
|
|
226
|
-
2.2.
|
|
218
|
+
2.2.27
|
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# JCW ·
|
|
1
|
+
# JCW · <a target="_blank" href="https://github.com/Cado-Labs"><img src="https://github.com/Cado-Labs/cado-labs-logos/raw/main/cado_labs_badge.svg" alt="Supported by Cado Labs" style="max-width: 100%; height: 20px"></a> · [](https://coveralls.io/github/Cado-Labs/jcw?branch=gem-without-zeitwerk) · [](https://badge.fury.io/rb/jcw)
|
|
2
2
|
|
|
3
3
|
Simple wrapper for the gem "jaeger-client" with simpler customization.
|
|
4
4
|
|
|
@@ -6,7 +6,7 @@ Simple wrapper for the gem "jaeger-client" with simpler customization.
|
|
|
6
6
|
|
|
7
7
|
<p>
|
|
8
8
|
<a href="https://github.com/Cado-Labs">
|
|
9
|
-
<img src="https://github.com/Cado-Labs/cado-labs-
|
|
9
|
+
<img src="https://github.com/Cado-Labs/cado-labs-resources/blob/main/cado_labs_supporting_rounded.svg" alt="Supported by Cado Labs" />
|
|
10
10
|
</a>
|
|
11
11
|
</p>
|
|
12
12
|
|
|
@@ -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_path_patterns = ["/api/test", %r{/sidekiq}]
|
|
45
46
|
end
|
|
46
47
|
|
|
47
|
-
# Set middleware for wrapping all requests
|
|
48
|
-
Rails.application.middleware.use(JCW::
|
|
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_path_patterns = ["/api/test", %r{/sidekiq}]
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
# Set middleware for wrapping all requests
|
|
65
|
-
Rails.application.middleware.use(JCW::
|
|
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::
|
|
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
|
|
@@ -132,7 +134,7 @@ Released under MIT License.
|
|
|
132
134
|
## Supporting
|
|
133
135
|
|
|
134
136
|
<a href="https://github.com/Cado-Labs">
|
|
135
|
-
<img src="https://github.com/Cado-Labs/cado-labs-
|
|
137
|
+
<img src="https://github.com/Cado-Labs/cado-labs-resources/blob/main/cado_labs_supporting_rounded.svg" alt="Supported by Cado Labs" />
|
|
136
138
|
</a>
|
|
137
139
|
|
|
138
140
|
## Authors
|
data/jcw.gemspec
CHANGED
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.description = "Wrapper for the gem 'jaeger-client' with simpler customization."
|
|
13
13
|
spec.homepage = "https://github.com/Cado-Labs/jcw"
|
|
14
14
|
spec.license = "MIT"
|
|
15
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
|
16
16
|
|
|
17
17
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
18
18
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
@@ -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_path_patterns
|
|
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_path_patterns
|
|
45
|
+
@rack_ignore_path_patterns ||= []
|
|
46
|
+
end
|
|
42
47
|
end
|
|
43
48
|
end
|
data/lib/jcw/http_tracer.rb
CHANGED
|
@@ -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
|
-
|
|
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::
|
|
37
|
+
OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_TEXT_MAP,
|
|
35
38
|
request.headers)
|
|
36
39
|
|
|
37
40
|
res = perform_without_tracing(request, options)
|
data/lib/jcw/rack_tracer.rb
CHANGED
|
@@ -1,5 +1,140 @@
|
|
|
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
|
-
|
|
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_path_patterns [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_path_patterns: Wrapper.config.rack_ignore_path_patterns,
|
|
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_path_patterns = ignore_path_patterns
|
|
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_path_patterns.find { |pattern| pattern === path }
|
|
43
|
+
|
|
44
|
+
set_extract_env(env)
|
|
45
|
+
context = @tracer.extract(OpenTracing::FORMAT_TEXT_MAP, env) if @trust_incoming_span
|
|
46
|
+
scope = build_scope(method, url, context)
|
|
47
|
+
span = scope.span
|
|
48
|
+
perform_on_start_span(env, span, @on_start_span)
|
|
49
|
+
call_request(env, span)
|
|
50
|
+
rescue *@errors => error
|
|
51
|
+
build_error_log(span, error)
|
|
52
|
+
raise
|
|
53
|
+
ensure
|
|
54
|
+
begin
|
|
55
|
+
close_scope(scope)
|
|
56
|
+
ensure
|
|
57
|
+
perform_on_finish_span(span)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def set_extract_env(env)
|
|
64
|
+
env["uber-trace-id"] = env["HTTP_UBER_TRACE_ID"]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def build_scope(method, url, context)
|
|
68
|
+
@tracer.start_active_span(
|
|
69
|
+
method,
|
|
70
|
+
child_of: context,
|
|
71
|
+
tags: {
|
|
72
|
+
"component" => "rack",
|
|
73
|
+
"span.kind" => "server",
|
|
74
|
+
"http.method" => method,
|
|
75
|
+
"http.url" => url,
|
|
76
|
+
},
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def perform_on_start_span(env, span, on_start_span)
|
|
81
|
+
on_start_span&.call(span)
|
|
82
|
+
env["rack.span"] = span
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def call_request(env, span)
|
|
86
|
+
@app.call(env).tap do |status_code, _headers, _body|
|
|
87
|
+
set_tag(span, status_code, env)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def set_tag(span, status_code, env)
|
|
92
|
+
span.set_tag("http.status_code", status_code)
|
|
93
|
+
route = route_from_env(env)
|
|
94
|
+
span.operation_name = route
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def route_from_env(env)
|
|
98
|
+
method = env[REQUEST_METHOD]
|
|
99
|
+
if (sinatra_route = env["sinatra.route"])
|
|
100
|
+
sinatra_route
|
|
101
|
+
elsif (rails_controller = env["action_controller.instance"])
|
|
102
|
+
"#{method} #{rails_controller.controller_name}/#{rails_controller.action_name}"
|
|
103
|
+
elsif (grape_route_args = env["grape.routing_args"] || env["rack.routing_args"])
|
|
104
|
+
"#{method} #{grape_route_from_args(grape_route_args)}"
|
|
105
|
+
else
|
|
106
|
+
"#{method} #{env[REQUEST_PATH] || env["SCRIPT_NAME"] || env["PATH_INFO"]}".strip
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def grape_route_from_args(route_args)
|
|
111
|
+
route_info = route_args[:route_info]
|
|
112
|
+
if route_info.respond_to?(:path)
|
|
113
|
+
route_info.path
|
|
114
|
+
elsif (rack_route_options = route_info.instance_variable_get(:@options))
|
|
115
|
+
rack_route_options[:path]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def build_error_log(span, error)
|
|
120
|
+
span.set_tag("error", true)
|
|
121
|
+
span.log_kv(
|
|
122
|
+
event: "error",
|
|
123
|
+
"error.kind": error.class.to_s,
|
|
124
|
+
"error.object": error,
|
|
125
|
+
message: error.message,
|
|
126
|
+
stack: error.backtrace.join("\n"),
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def perform_on_finish_span(span)
|
|
131
|
+
return unless @on_finish_span
|
|
132
|
+
@on_finish_span.call(span)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def close_scope(scope)
|
|
136
|
+
scope&.close
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
5
140
|
end
|
data/lib/jcw/version.rb
CHANGED
data/lib/jcw.rb
CHANGED
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.
|
|
4
|
+
version: 0.2.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexander Starovojtov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-01-25 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:
|
|
76
|
+
name: bundler
|
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
|
72
78
|
requirements:
|
|
73
|
-
- - "
|
|
79
|
+
- - ">="
|
|
74
80
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0
|
|
76
|
-
type: :
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
@@ -279,7 +286,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
279
286
|
requirements:
|
|
280
287
|
- - ">="
|
|
281
288
|
- !ruby/object:Gem::Version
|
|
282
|
-
version: 2.
|
|
289
|
+
version: 2.6.0
|
|
283
290
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
284
291
|
requirements:
|
|
285
292
|
- - ">="
|