yabeda-hanami 0.1.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 +7 -0
- data/lib/yabeda/hanami/config.rb +14 -0
- data/lib/yabeda/hanami/event.rb +48 -0
- data/lib/yabeda/hanami/version.rb +7 -0
- data/lib/yabeda/hanami.rb +74 -0
- metadata +148 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b1406f7e10b7a1f5b792b5b6ef97e5d6315a6f8fb09e29d5bc6b9950e11bda9c
|
4
|
+
data.tar.gz: 63555bfe70adb4acf5a750b9ee5f3e99743945050068b05e62a0ad7ab549bcc7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dcacad87df056d8471f9f9667b219a33802d6d6de44388fdc631be3686e158aff9f87ba67fd2708fcdad7505956e9e2acb616c12e591c3639f3e3169e44f02fd
|
7
|
+
data.tar.gz: 49ae81d3d62e3aaaedcab7134701a58546d882de5760fef579173cf9dd473a99ef0efdbe4dc0420ddd533036d0f3dbbf84b5a5996a6f6ced8a9ef65ac3ebee39
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/events"
|
4
|
+
|
5
|
+
module Yabeda
|
6
|
+
module Hanami
|
7
|
+
# Dry::Events::Event with added logic for Yabeda tags formatting
|
8
|
+
class Event < ::Dry::Events::Event
|
9
|
+
def labels
|
10
|
+
@labels ||= begin
|
11
|
+
labels = {
|
12
|
+
method: method,
|
13
|
+
path: path,
|
14
|
+
status: status,
|
15
|
+
remote_ip: remote_ip
|
16
|
+
}
|
17
|
+
labels.merge(payload.slice(*Yabeda.default_tags.keys - labels.keys))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def duration
|
22
|
+
ms2s payload[:time]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def remote_ip
|
28
|
+
payload[:env]["REMOTE_ADDR"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def method
|
32
|
+
payload[:env]["REQUEST_METHOD"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def path
|
36
|
+
payload[:env]["PATH_INFO"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def status
|
40
|
+
payload[:status]
|
41
|
+
end
|
42
|
+
|
43
|
+
def ms2s(milliseconds)
|
44
|
+
(milliseconds.to_f / 1000).round(3)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yabeda"
|
4
|
+
require "yabeda/hanami/config"
|
5
|
+
require "yabeda/hanami/event"
|
6
|
+
require "yabeda/hanami/version"
|
7
|
+
|
8
|
+
module Yabeda
|
9
|
+
module Hanami
|
10
|
+
class Error < StandardError; end
|
11
|
+
|
12
|
+
LONG_RUNNING_REQUEST_BUCKETS = [
|
13
|
+
0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, # standard
|
14
|
+
30, 60, 120, 300, 600 # Sometimes requests may be really long-running
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
class << self
|
18
|
+
# Declare and install metrics
|
19
|
+
def install!
|
20
|
+
Yabeda.configure do
|
21
|
+
_yabeda_hanami_config = ::Yabeda::Hanami.config
|
22
|
+
|
23
|
+
group :hanami do
|
24
|
+
counter :requests_total,
|
25
|
+
comment: "A counter of the total number of HTTP requests hanami processed.",
|
26
|
+
tags: %i[method path remote_ip]
|
27
|
+
|
28
|
+
counter :responses_total,
|
29
|
+
comment: "A counter of the total number of HTTP requests hanami processed.",
|
30
|
+
tags: %i[method path remote_ip status]
|
31
|
+
|
32
|
+
histogram :processing_duration,
|
33
|
+
unit: :seconds,
|
34
|
+
buckets: LONG_RUNNING_REQUEST_BUCKETS,
|
35
|
+
comment: "A histogram of the processing duration.",
|
36
|
+
tags: %i[method path remote_ip status]
|
37
|
+
|
38
|
+
counter :rack_errors_total,
|
39
|
+
comment: "A counter of the total number of rack errors.",
|
40
|
+
tags: %i[method path remote_ip status]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Subscribe to events
|
46
|
+
def subscribe!
|
47
|
+
yabeda_hanami_config = ::Yabeda::Hanami.config
|
48
|
+
|
49
|
+
yabeda_hanami_config.notifications.subscribe(:"rack.request.start") do |event|
|
50
|
+
event = Yabeda::Hanami::Event.new(event.id, event.payload)
|
51
|
+
|
52
|
+
Yabeda.hanami_requests_total.increment(event.labels)
|
53
|
+
end
|
54
|
+
|
55
|
+
yabeda_hanami_config.notifications.subscribe(:"rack.request.stop") do |event|
|
56
|
+
event = Yabeda::Hanami::Event.new(event.id, event.payload)
|
57
|
+
|
58
|
+
Yabeda.hanami_responses_total.increment(event.labels)
|
59
|
+
Yabeda.hanami_processing_duration.measure(event.labels, event.duration)
|
60
|
+
end
|
61
|
+
|
62
|
+
yabeda_hanami_config.notifications.subscribe(:"rack.request.error") do |event|
|
63
|
+
event = Yabeda::Hanami::Event.new(event.id, event.payload)
|
64
|
+
|
65
|
+
Yabeda.hanami_rack_errors_total.increment(event.labels)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def config
|
70
|
+
@config ||= Config.new
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yabeda-hanami
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Greg Kostin
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hanami
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yabeda
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.12'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: debug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.9'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.9'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '13.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '13.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: standard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.3'
|
111
|
+
description: Easy collecting your Hanami apps metrics
|
112
|
+
email:
|
113
|
+
- gkostin@umich.edu
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- lib/yabeda/hanami.rb
|
119
|
+
- lib/yabeda/hanami/config.rb
|
120
|
+
- lib/yabeda/hanami/event.rb
|
121
|
+
- lib/yabeda/hanami/version.rb
|
122
|
+
homepage: https://github.com/mlibrary/yabeda-hanami
|
123
|
+
licenses:
|
124
|
+
- Apache-2.0
|
125
|
+
metadata:
|
126
|
+
changelog_uri: https://github.com/mlibrary/yabeda-hanami/blob/main/CHANGELOG.md
|
127
|
+
homepage_uri: https://github.com/mlibrary/yabeda-hanami
|
128
|
+
source_code_uri: https://github.com/mlibrary/yabeda-hanami
|
129
|
+
post_install_message:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 2.6.0
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubygems_version: 3.3.7
|
145
|
+
signing_key:
|
146
|
+
specification_version: 4
|
147
|
+
summary: Extensible metrics for monitoring a Hanami application
|
148
|
+
test_files: []
|