promenade 0.6.0 → 0.7.0
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/ci.yaml +1 -1
- data/.rubocop.yml +4 -0
- data/Gemfile.lock +18 -10
- data/exe/promenade +1 -1
- data/lib/promenade/client/rack/exception_handler.rb +4 -10
- data/lib/promenade/client/rack/http_request_duration_collector.rb +2 -13
- data/lib/promenade/client/rack/request_controller_action_labeler.rb +42 -0
- data/lib/promenade/client/rack/request_labeler.rb +1 -28
- data/lib/promenade/version.rb +1 -1
- data/lib/promenade.rb +1 -1
- data/promenade.gemspec +3 -2
- metadata +18 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c8f195d39a6967000ebf64da2a2143a85c934ad0a37b7303eb91511dd1f458bf
|
|
4
|
+
data.tar.gz: '030960d747dd81a33a2feea7b6f3a3460fdc3952160b4c000900645df163d402'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3cb2cd2eaf07029afd1ac8ad574be62d5b5f848734ea67f1f94a919fe9a6f548c2bcb71d761b92a30077575114a7b505eebe21f20f380af47471401c62b898f6
|
|
7
|
+
data.tar.gz: 0e94c108cd6e98d0f1280e07412e2cb9a41ef7f5a0d7f33735d785c1253424246e46c5fc49ddc0757658301f697272baa1ee882f109327442d13ffa87e6f6429
|
data/.github/workflows/ci.yaml
CHANGED
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
promenade (0.
|
|
4
|
+
promenade (0.7.0)
|
|
5
5
|
actionpack
|
|
6
6
|
activesupport (> 6.0, < 8.0)
|
|
7
7
|
prometheus-client-mmap (~> 0.16.0)
|
|
@@ -109,6 +109,7 @@ GEM
|
|
|
109
109
|
highline (2.0.3)
|
|
110
110
|
i18n (1.10.0)
|
|
111
111
|
concurrent-ruby (~> 1.0)
|
|
112
|
+
json (2.6.3)
|
|
112
113
|
loofah (2.18.0)
|
|
113
114
|
crass (~> 1.0.2)
|
|
114
115
|
nokogiri (>= 1.5.9)
|
|
@@ -138,7 +139,7 @@ GEM
|
|
|
138
139
|
mini_portile2 (~> 2.8.0)
|
|
139
140
|
racc (~> 1.4)
|
|
140
141
|
parallel (1.22.1)
|
|
141
|
-
parser (3.1.
|
|
142
|
+
parser (3.2.1.0)
|
|
142
143
|
ast (~> 2.4.1)
|
|
143
144
|
prometheus-client-mmap (0.16.2)
|
|
144
145
|
pry (0.14.1)
|
|
@@ -176,7 +177,7 @@ GEM
|
|
|
176
177
|
zeitwerk (~> 2.5)
|
|
177
178
|
rainbow (3.1.1)
|
|
178
179
|
rake (13.0.6)
|
|
179
|
-
regexp_parser (2.
|
|
180
|
+
regexp_parser (2.7.0)
|
|
180
181
|
rexml (3.2.5)
|
|
181
182
|
rspec (3.11.0)
|
|
182
183
|
rspec-core (~> 3.11.0)
|
|
@@ -199,17 +200,20 @@ GEM
|
|
|
199
200
|
rspec-mocks (~> 3.10)
|
|
200
201
|
rspec-support (~> 3.10)
|
|
201
202
|
rspec-support (3.11.0)
|
|
202
|
-
rubocop (1.
|
|
203
|
+
rubocop (1.46.0)
|
|
204
|
+
json (~> 2.3)
|
|
203
205
|
parallel (~> 1.10)
|
|
204
|
-
parser (>= 3.
|
|
206
|
+
parser (>= 3.2.0.0)
|
|
205
207
|
rainbow (>= 2.2.2, < 4.0)
|
|
206
208
|
regexp_parser (>= 1.8, < 3.0)
|
|
207
209
|
rexml (>= 3.2.5, < 4.0)
|
|
208
|
-
rubocop-ast (>= 1.
|
|
210
|
+
rubocop-ast (>= 1.26.0, < 2.0)
|
|
209
211
|
ruby-progressbar (~> 1.7)
|
|
210
|
-
unicode-display_width (>=
|
|
211
|
-
rubocop-ast (1.
|
|
212
|
-
parser (>= 3.
|
|
212
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
|
213
|
+
rubocop-ast (1.27.0)
|
|
214
|
+
parser (>= 3.2.1.0)
|
|
215
|
+
rubocop-capybara (2.17.1)
|
|
216
|
+
rubocop (~> 1.41)
|
|
213
217
|
rubocop-performance (1.14.2)
|
|
214
218
|
rubocop (>= 1.7.0, < 2.0)
|
|
215
219
|
rubocop-ast (>= 0.4.0)
|
|
@@ -217,6 +221,9 @@ GEM
|
|
|
217
221
|
activesupport (>= 4.2.0)
|
|
218
222
|
rack (>= 1.1)
|
|
219
223
|
rubocop (>= 1.7.0, < 2.0)
|
|
224
|
+
rubocop-rspec (2.18.1)
|
|
225
|
+
rubocop (~> 1.33)
|
|
226
|
+
rubocop-capybara (~> 2.17)
|
|
220
227
|
ruby-progressbar (1.11.0)
|
|
221
228
|
simplecov (0.21.2)
|
|
222
229
|
docile (~> 1.1)
|
|
@@ -236,7 +243,7 @@ GEM
|
|
|
236
243
|
sync
|
|
237
244
|
tzinfo (2.0.4)
|
|
238
245
|
concurrent-ruby (~> 1.0)
|
|
239
|
-
unicode-display_width (2.
|
|
246
|
+
unicode-display_width (2.4.2)
|
|
240
247
|
webrick (1.7.0)
|
|
241
248
|
websocket-driver (0.7.5)
|
|
242
249
|
websocket-extensions (>= 0.1.0)
|
|
@@ -262,6 +269,7 @@ DEPENDENCIES
|
|
|
262
269
|
rubocop
|
|
263
270
|
rubocop-performance
|
|
264
271
|
rubocop-rails
|
|
272
|
+
rubocop-rspec
|
|
265
273
|
simplecov
|
|
266
274
|
webrick
|
|
267
275
|
|
data/exe/promenade
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "action_dispatch/middleware/exception_wrapper"
|
|
2
2
|
require_relative "singleton_caller"
|
|
3
|
-
require_relative "
|
|
3
|
+
require_relative "request_controller_action_labeler"
|
|
4
4
|
|
|
5
5
|
module Promenade
|
|
6
6
|
module Client
|
|
@@ -8,21 +8,19 @@ module Promenade
|
|
|
8
8
|
class ExceptionHandler
|
|
9
9
|
extend SingletonCaller
|
|
10
10
|
|
|
11
|
-
attr_reader :histogram_name, :
|
|
11
|
+
attr_reader :histogram_name, :exceptions_counter_name, :registry
|
|
12
12
|
|
|
13
|
-
def initialize(histogram_name:,
|
|
13
|
+
def initialize(histogram_name:, exceptions_counter_name:, registry:)
|
|
14
14
|
@histogram_name = histogram_name
|
|
15
|
-
@requests_counter_name = requests_counter_name
|
|
16
15
|
@exceptions_counter_name = exceptions_counter_name
|
|
17
16
|
@registry = registry
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
def call(exception, env_hash, duration)
|
|
21
|
-
labels =
|
|
20
|
+
labels = RequestControllerActionLabeler.call(env_hash)
|
|
22
21
|
labels.merge!(code: status_code_for_exception(exception))
|
|
23
22
|
|
|
24
23
|
histogram.observe(labels, duration.to_f)
|
|
25
|
-
requests_counter.increment(labels)
|
|
26
24
|
exceptions_counter.increment(exception: exception.class.name)
|
|
27
25
|
|
|
28
26
|
raise exception
|
|
@@ -34,10 +32,6 @@ module Promenade
|
|
|
34
32
|
registry.get(histogram_name)
|
|
35
33
|
end
|
|
36
34
|
|
|
37
|
-
def requests_counter
|
|
38
|
-
registry.get(requests_counter_name)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
35
|
def exceptions_counter
|
|
42
36
|
registry.get(exceptions_counter_name)
|
|
43
37
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "prometheus/client"
|
|
2
2
|
require_relative "middleware_base"
|
|
3
|
-
require_relative "
|
|
3
|
+
require_relative "request_controller_action_labeler"
|
|
4
4
|
require_relative "exception_handler"
|
|
5
5
|
require_relative "queue_time_duration"
|
|
6
6
|
|
|
@@ -10,17 +10,14 @@ module Promenade
|
|
|
10
10
|
class HTTPRequestDurationCollector < MiddlwareBase
|
|
11
11
|
REQUEST_DURATION_HISTOGRAM_NAME = :http_req_duration_seconds
|
|
12
12
|
|
|
13
|
-
REQUESTS_COUNTER_NAME = :http_requests_total
|
|
14
|
-
|
|
15
13
|
EXCEPTIONS_COUNTER_NAME = :http_exceptions_total
|
|
16
14
|
|
|
17
15
|
private_constant :REQUEST_DURATION_HISTOGRAM_NAME,
|
|
18
|
-
:REQUESTS_COUNTER_NAME,
|
|
19
16
|
:EXCEPTIONS_COUNTER_NAME
|
|
20
17
|
|
|
21
18
|
def initialize(app,
|
|
22
19
|
registry: ::Prometheus::Client.registry,
|
|
23
|
-
label_builder:
|
|
20
|
+
label_builder: RequestControllerActionLabeler,
|
|
24
21
|
exception_handler: nil)
|
|
25
22
|
|
|
26
23
|
@latency_buckets = Promenade.configuration.rack_latency_buckets
|
|
@@ -45,7 +42,6 @@ module Promenade
|
|
|
45
42
|
end
|
|
46
43
|
|
|
47
44
|
def record_request_duration(labels, duration)
|
|
48
|
-
requests_counter.increment(labels)
|
|
49
45
|
durations_histogram.observe(labels, duration)
|
|
50
46
|
end
|
|
51
47
|
|
|
@@ -61,13 +57,7 @@ module Promenade
|
|
|
61
57
|
registry.get(REQUEST_DURATION_HISTOGRAM_NAME)
|
|
62
58
|
end
|
|
63
59
|
|
|
64
|
-
def requests_counter
|
|
65
|
-
registry.get(REQUESTS_COUNTER_NAME)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
60
|
def register_metrics!
|
|
69
|
-
registry.counter(REQUESTS_COUNTER_NAME,
|
|
70
|
-
"A counter of the total number of HTTP requests made.")
|
|
71
61
|
registry.histogram(REQUEST_DURATION_HISTOGRAM_NAME,
|
|
72
62
|
"A histogram of the response latency.", {}, latency_buckets)
|
|
73
63
|
registry.counter(EXCEPTIONS_COUNTER_NAME,
|
|
@@ -81,7 +71,6 @@ module Promenade
|
|
|
81
71
|
def default_exception_handler
|
|
82
72
|
ExceptionHandler.initialize_singleton(
|
|
83
73
|
histogram_name: REQUEST_DURATION_HISTOGRAM_NAME,
|
|
84
|
-
requests_counter_name: REQUESTS_COUNTER_NAME,
|
|
85
74
|
exceptions_counter_name: EXCEPTIONS_COUNTER_NAME,
|
|
86
75
|
registry: registry,
|
|
87
76
|
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require_relative "request_labeler"
|
|
2
|
+
module Promenade
|
|
3
|
+
module Client
|
|
4
|
+
module Rack
|
|
5
|
+
class RequestControllerActionLabeler < RequestLabeler
|
|
6
|
+
PARAMS_KEY = "action_dispatch.request.parameters".freeze
|
|
7
|
+
|
|
8
|
+
PATH_PARAMS_KEY = "action_dispatch.request.path_parameters".freeze
|
|
9
|
+
|
|
10
|
+
CONTROLLER = "controller".freeze
|
|
11
|
+
|
|
12
|
+
ACTION = "action".freeze
|
|
13
|
+
|
|
14
|
+
UNKNOWN = "unknown".freeze
|
|
15
|
+
|
|
16
|
+
SEPARATOR = "#".freeze
|
|
17
|
+
|
|
18
|
+
private_constant :PARAMS_KEY, :CONTROLLER, :ACTION, :UNKNOWN, :SEPARATOR
|
|
19
|
+
|
|
20
|
+
def call(env)
|
|
21
|
+
super.merge({
|
|
22
|
+
controller_action: controller_action_from_env(env),
|
|
23
|
+
})
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def controller_action_from_env(env)
|
|
29
|
+
controller = env.dig(PARAMS_KEY, CONTROLLER) ||
|
|
30
|
+
env.dig(PATH_PARAMS_KEY, CONTROLLER.to_sym) ||
|
|
31
|
+
UNKNOWN
|
|
32
|
+
|
|
33
|
+
action = env.dig(PARAMS_KEY, ACTION) ||
|
|
34
|
+
env.dig(PATH_PARAMS_KEY, ACTION.to_sym) ||
|
|
35
|
+
UNKNOWN
|
|
36
|
+
|
|
37
|
+
[controller, action].join(SEPARATOR)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -9,41 +9,14 @@ module Promenade
|
|
|
9
9
|
|
|
10
10
|
HTTP_HOST = "HTTP_HOST".freeze
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
PATH_PARAMS_KEY = "action_dispatch.request.path_parameters".freeze
|
|
15
|
-
|
|
16
|
-
CONTROLLER = "controller".freeze
|
|
17
|
-
|
|
18
|
-
ACTION = "action".freeze
|
|
19
|
-
|
|
20
|
-
UNKNOWN = "unknown".freeze
|
|
21
|
-
|
|
22
|
-
SEPARATOR = "#".freeze
|
|
23
|
-
|
|
24
|
-
private_constant :REQUEST_METHOD, :HTTP_HOST, :PARAMS_KEY, :CONTROLLER, :ACTION, :UNKNOWN, :SEPARATOR
|
|
12
|
+
private_constant :REQUEST_METHOD, :HTTP_HOST
|
|
25
13
|
|
|
26
14
|
def call(env)
|
|
27
15
|
{
|
|
28
16
|
method: env[REQUEST_METHOD].to_s.downcase,
|
|
29
17
|
host: env[HTTP_HOST].to_s,
|
|
30
|
-
controller_action: controller_action_from_env(env),
|
|
31
18
|
}
|
|
32
19
|
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
def controller_action_from_env(env)
|
|
37
|
-
controller = env.dig(PARAMS_KEY, CONTROLLER) ||
|
|
38
|
-
env.dig(PATH_PARAMS_KEY, CONTROLLER.to_sym) ||
|
|
39
|
-
UNKNOWN
|
|
40
|
-
|
|
41
|
-
action = env.dig(PARAMS_KEY, ACTION) ||
|
|
42
|
-
env.dig(PATH_PARAMS_KEY, ACTION.to_sym) ||
|
|
43
|
-
UNKNOWN
|
|
44
|
-
|
|
45
|
-
[controller, action].join(SEPARATOR)
|
|
46
|
-
end
|
|
47
20
|
end
|
|
48
21
|
end
|
|
49
22
|
end
|
data/lib/promenade/version.rb
CHANGED
data/lib/promenade.rb
CHANGED
data/promenade.gemspec
CHANGED
|
@@ -2,7 +2,7 @@ lib = File.expand_path("lib", __dir__)
|
|
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
require "promenade/version"
|
|
4
4
|
|
|
5
|
-
Gem::Specification.new do |spec|
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "promenade"
|
|
7
7
|
spec.version = Promenade::VERSION
|
|
8
8
|
spec.authors = ["Ed Robinson"]
|
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
23
23
|
spec.require_paths = ["lib"]
|
|
24
24
|
|
|
25
|
-
spec.required_ruby_version = ">= 2.7"
|
|
25
|
+
spec.required_ruby_version = ">= 2.7"
|
|
26
26
|
|
|
27
27
|
spec.add_dependency "actionpack"
|
|
28
28
|
spec.add_dependency "activesupport", "> 6.0", "< 8.0"
|
|
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
|
39
39
|
spec.add_development_dependency "rubocop"
|
|
40
40
|
spec.add_development_dependency "rubocop-performance"
|
|
41
41
|
spec.add_development_dependency "rubocop-rails"
|
|
42
|
+
spec.add_development_dependency "rubocop-rspec"
|
|
42
43
|
spec.add_development_dependency "simplecov"
|
|
43
44
|
spec.metadata["rubygems_mfa_required"] = "true"
|
|
44
45
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: promenade
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ed Robinson
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-03-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionpack
|
|
@@ -232,6 +232,20 @@ dependencies:
|
|
|
232
232
|
- - ">="
|
|
233
233
|
- !ruby/object:Gem::Version
|
|
234
234
|
version: '0'
|
|
235
|
+
- !ruby/object:Gem::Dependency
|
|
236
|
+
name: rubocop-rspec
|
|
237
|
+
requirement: !ruby/object:Gem::Requirement
|
|
238
|
+
requirements:
|
|
239
|
+
- - ">="
|
|
240
|
+
- !ruby/object:Gem::Version
|
|
241
|
+
version: '0'
|
|
242
|
+
type: :development
|
|
243
|
+
prerelease: false
|
|
244
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
245
|
+
requirements:
|
|
246
|
+
- - ">="
|
|
247
|
+
- !ruby/object:Gem::Version
|
|
248
|
+
version: '0'
|
|
235
249
|
- !ruby/object:Gem::Dependency
|
|
236
250
|
name: simplecov
|
|
237
251
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -276,6 +290,7 @@ files:
|
|
|
276
290
|
- lib/promenade/client/rack/http_request_queue_time_collector.rb
|
|
277
291
|
- lib/promenade/client/rack/middleware_base.rb
|
|
278
292
|
- lib/promenade/client/rack/queue_time_duration.rb
|
|
293
|
+
- lib/promenade/client/rack/request_controller_action_labeler.rb
|
|
279
294
|
- lib/promenade/client/rack/request_labeler.rb
|
|
280
295
|
- lib/promenade/client/rack/singleton_caller.rb
|
|
281
296
|
- lib/promenade/configuration.rb
|
|
@@ -306,16 +321,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
306
321
|
- - ">="
|
|
307
322
|
- !ruby/object:Gem::Version
|
|
308
323
|
version: '2.7'
|
|
309
|
-
- - "<"
|
|
310
|
-
- !ruby/object:Gem::Version
|
|
311
|
-
version: '3.2'
|
|
312
324
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
313
325
|
requirements:
|
|
314
326
|
- - ">="
|
|
315
327
|
- !ruby/object:Gem::Version
|
|
316
328
|
version: '0'
|
|
317
329
|
requirements: []
|
|
318
|
-
rubygems_version: 3.3.
|
|
330
|
+
rubygems_version: 3.3.7
|
|
319
331
|
signing_key:
|
|
320
332
|
specification_version: 4
|
|
321
333
|
summary: Promenade makes it simple to instrument Ruby apps for prometheus scraping
|