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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +20 -0
- data/LICENSE.txt +21 -0
- data/README.md +105 -0
- data/lib/queue_pulse/alert.rb +44 -0
- data/lib/queue_pulse/check_job.rb +17 -0
- data/lib/queue_pulse/checks/base.rb +40 -0
- data/lib/queue_pulse/checks/failures.rb +67 -0
- data/lib/queue_pulse/checks/queue_depth.rb +35 -0
- data/lib/queue_pulse/checks/queue_latency.rb +40 -0
- data/lib/queue_pulse/checks/stuck_jobs.rb +42 -0
- data/lib/queue_pulse/checks/worker_liveness.rb +35 -0
- data/lib/queue_pulse/configuration.rb +87 -0
- data/lib/queue_pulse/memory_store.rb +48 -0
- data/lib/queue_pulse/monitor.rb +73 -0
- data/lib/queue_pulse/notifiers/base.rb +73 -0
- data/lib/queue_pulse/notifiers/email.rb +50 -0
- data/lib/queue_pulse/notifiers/slack.rb +38 -0
- data/lib/queue_pulse/notifiers/test.rb +23 -0
- data/lib/queue_pulse/notifiers/webhook.rb +29 -0
- data/lib/queue_pulse/poller.rb +52 -0
- data/lib/queue_pulse/railtie.rb +12 -0
- data/lib/queue_pulse/source/solid_queue.rb +97 -0
- data/lib/queue_pulse/source.rb +127 -0
- data/lib/queue_pulse/state.rb +44 -0
- data/lib/queue_pulse/version.rb +5 -0
- data/lib/queue_pulse.rb +74 -0
- data/lib/tasks/queue_pulse.rake +9 -0
- metadata +168 -0
data/lib/queue_pulse.rb
ADDED
|
@@ -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)
|
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: []
|