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 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,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "anyway"
4
+
5
+ module Yabeda
6
+ module Hanami
7
+ # yabeda-hanami configuration
8
+ class Config < ::Anyway::Config
9
+ config_name :yabeda_hanami
10
+
11
+ attr_accessor :notifications
12
+ end
13
+ end
14
+ end
@@ -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,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yabeda
4
+ module Hanami
5
+ VERSION = "0.1.0"
6
+ end
7
+ 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: []