queue_pulse 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.
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+
5
+ require_relative "queue_pulse/version"
6
+ require_relative "queue_pulse/memory_store"
7
+ require_relative "queue_pulse/configuration"
8
+ require_relative "queue_pulse/alert"
9
+ require_relative "queue_pulse/state"
10
+ require_relative "queue_pulse/source"
11
+ require_relative "queue_pulse/source/solid_queue"
12
+ require_relative "queue_pulse/checks/base"
13
+ require_relative "queue_pulse/checks/failures"
14
+ require_relative "queue_pulse/checks/queue_latency"
15
+ require_relative "queue_pulse/checks/queue_depth"
16
+ require_relative "queue_pulse/checks/stuck_jobs"
17
+ require_relative "queue_pulse/checks/worker_liveness"
18
+ require_relative "queue_pulse/notifiers/base"
19
+ require_relative "queue_pulse/notifiers/test"
20
+ require_relative "queue_pulse/notifiers/slack"
21
+ require_relative "queue_pulse/notifiers/webhook"
22
+ require_relative "queue_pulse/notifiers/email"
23
+ require_relative "queue_pulse/monitor"
24
+ require_relative "queue_pulse/poller"
25
+
26
+ # QueuePulse — immediate alerting + metrics for Solid Queue.
27
+ #
28
+ # Reads Solid Queue's existing tables (read-only, no migration) and notifies you
29
+ # the moment background jobs fail, stall, back up, or workers die.
30
+ module QueuePulse
31
+ class Error < StandardError; end
32
+
33
+ class << self
34
+ # Configure QueuePulse, typically from config/initializers/queue_pulse.rb
35
+ #
36
+ # QueuePulse.configure do |config|
37
+ # config.add_notifier QueuePulse::Notifiers::Slack.new(webhook_url: ENV["SLACK_WEBHOOK_URL"])
38
+ # config.queue_latency_threshold = 120
39
+ # end
40
+ def configure
41
+ yield config if block_given?
42
+ config
43
+ end
44
+
45
+ def config
46
+ @config ||= Configuration.new
47
+ end
48
+
49
+ def reset_config!
50
+ @config = Configuration.new
51
+ end
52
+
53
+ def logger
54
+ config.logger
55
+ end
56
+
57
+ # Run one full monitoring pass and deliver any alerts.
58
+ # Fully exception-isolated: never raises into the host app.
59
+ #
60
+ # @param source [QueuePulse::Source] optional override (used in tests)
61
+ # @return [Array<QueuePulse::Alert>] the alerts that were delivered
62
+ def check!(source: nil)
63
+ return [] unless config.enabled
64
+
65
+ Monitor.new(config: config, source: source).run
66
+ rescue StandardError => e
67
+ logger.error("[QueuePulse] check! failed: #{e.class}: #{e.message}")
68
+ []
69
+ end
70
+ end
71
+ end
72
+
73
+ require_relative "queue_pulse/check_job" if defined?(ActiveJob::Base)
74
+ require_relative "queue_pulse/railtie" if defined?(Rails::Railtie)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :queue_pulse do
4
+ desc "Run one QueuePulse monitoring pass and deliver any alerts"
5
+ task check: :environment do
6
+ alerts = QueuePulse.check!
7
+ puts "[QueuePulse] delivered #{alerts.size} alert(s)"
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,168 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: queue_pulse
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michiya Suzuki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-07-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solid_queue
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: minitest
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: activerecord
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '7.1'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '7.1'
75
+ - !ruby/object:Gem::Dependency
76
+ name: activesupport
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '7.1'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '7.1'
89
+ - !ruby/object:Gem::Dependency
90
+ name: sqlite3
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '1.6'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '1.6'
103
+ description: |
104
+ QueuePulse reads Solid Queue's existing tables (read-only, no migration) and
105
+ notifies you the moment background jobs fail, stall, back up, or workers die.
106
+ It fills the gap left by Mission Control Jobs, which has no alerting and no
107
+ historical metrics — without making you run Datadog.
108
+ email:
109
+ executables: []
110
+ extensions: []
111
+ extra_rdoc_files: []
112
+ files:
113
+ - CHANGELOG.md
114
+ - LICENSE.txt
115
+ - README.md
116
+ - lib/queue_pulse.rb
117
+ - lib/queue_pulse/alert.rb
118
+ - lib/queue_pulse/check_job.rb
119
+ - lib/queue_pulse/checks/base.rb
120
+ - lib/queue_pulse/checks/failures.rb
121
+ - lib/queue_pulse/checks/queue_depth.rb
122
+ - lib/queue_pulse/checks/queue_latency.rb
123
+ - lib/queue_pulse/checks/stuck_jobs.rb
124
+ - lib/queue_pulse/checks/worker_liveness.rb
125
+ - lib/queue_pulse/configuration.rb
126
+ - lib/queue_pulse/memory_store.rb
127
+ - lib/queue_pulse/monitor.rb
128
+ - lib/queue_pulse/notifiers/base.rb
129
+ - lib/queue_pulse/notifiers/email.rb
130
+ - lib/queue_pulse/notifiers/slack.rb
131
+ - lib/queue_pulse/notifiers/test.rb
132
+ - lib/queue_pulse/notifiers/webhook.rb
133
+ - lib/queue_pulse/poller.rb
134
+ - lib/queue_pulse/railtie.rb
135
+ - lib/queue_pulse/source.rb
136
+ - lib/queue_pulse/source/solid_queue.rb
137
+ - lib/queue_pulse/state.rb
138
+ - lib/queue_pulse/version.rb
139
+ - lib/tasks/queue_pulse.rake
140
+ homepage: https://github.com/michiya-59/queue_pulse
141
+ licenses:
142
+ - MIT
143
+ metadata:
144
+ homepage_uri: https://github.com/michiya-59/queue_pulse
145
+ source_code_uri: https://github.com/michiya-59/queue_pulse
146
+ bug_tracker_uri: https://github.com/michiya-59/queue_pulse/issues
147
+ changelog_uri: https://github.com/michiya-59/queue_pulse/blob/main/CHANGELOG.md
148
+ rubygems_mfa_required: 'true'
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: 3.1.0
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubygems_version: 3.5.3
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: Immediate alerting + metrics for Solid Queue background jobs.
168
+ test_files: []