postburner 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/MIT-LICENSE +20 -0
- data/README.md +116 -0
- data/Rakefile +18 -0
- data/app/assets/config/postburner_manifest.js +1 -0
- data/app/assets/stylesheets/postburner/application.css +15 -0
- data/app/controllers/postburner/application_controller.rb +4 -0
- data/app/controllers/postburner/jobs_controller.rb +13 -0
- data/app/controllers/postburner/static_controller.rb +9 -0
- data/app/helpers/postburner/application_helper.rb +4 -0
- data/app/jobs/postburner/application_job.rb +4 -0
- data/app/mailers/postburner/application_mailer.rb +6 -0
- data/app/models/postburner/application_record.rb +5 -0
- data/app/models/postburner/job.rb +196 -0
- data/app/views/layouts/postburner/application.html.haml +10 -0
- data/app/views/postburner/jobs/index.html.haml +34 -0
- data/app/views/postburner/jobs/show.html.haml +13 -0
- data/config/environment.rb +0 -0
- data/config/routes.rb +6 -0
- data/lib/generators/postburner/install/USAGE +8 -0
- data/lib/generators/postburner/install/install_generator.rb +47 -0
- data/lib/generators/postburner/install/templates/migrations/create_postburner_jobs.rb.erb +46 -0
- data/lib/postburner.rb +31 -0
- data/lib/postburner/engine.rb +17 -0
- data/lib/postburner/version.rb +3 -0
- data/lib/tasks/postburner_tasks.rake +4 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b86343f81143907f3df739be458355fd5ac083cc83c6785a8eb3c45b4f2d2e3c
|
4
|
+
data.tar.gz: 2db76cad93eeb4e5fa551ca7b7a5a9734c81b1d50c64acdbba7e5f71d75cc579
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 167fd6de8a0e985d09baa86ef49e63c9a7d5e642732e10cc6812dcc2bc562a6e1fc95a3910691a18450dd84ff6440ec69a884cd53f8fb236e12fb032e6fe5a97
|
7
|
+
data.tar.gz: 2fb90a8b7a4ad78a8b8c5163bbf9585552fc0e72522d19d0c7779b1706e084899f347932bc5e70741ad64dad83a8bc5a31dae7e07ef8028e20adc4503f778c95
|
data/CHANGELOG.md
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2021 Matt Smith
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# Postburner
|
2
|
+
An ActiveRecord layer on top of Backburner for inspecting and auditing the
|
3
|
+
queue, especially for delayed jobs. It isn't meant to be fast, but safe.
|
4
|
+
|
5
|
+
It is meant to be complementary to Backburner. Use Backburner as the default
|
6
|
+
ActiveJob processor for mailers, active storage, and the like. Use a
|
7
|
+
`Postburner::Job` for things that you want to track.
|
8
|
+
|
9
|
+
Comes with a mountable interface that can be password protected with whatever
|
10
|
+
authentication you use in your project.
|
11
|
+
|
12
|
+
Also meant to be a replacement/upgrade for [Que](https://github.com/que-rb/que).
|
13
|
+
If you need something faster, but backed with ACID compliance, check out Que.
|
14
|
+
There are some additional features in Postburner such as retained jobs
|
15
|
+
after processing, stats, per job logging, etc.
|
16
|
+
|
17
|
+
Compared to plain [Backburner](https://github.com/nesquena/backburner),
|
18
|
+
Postburner adds:
|
19
|
+
- Database Jobs for inspection, linking, auditing, removal (and deletion)
|
20
|
+
- Direct access to associated [Beanstalk](https://beanstalkd.github.io/) (via [beaneater](https://github.com/beanstalkd/beaneater))
|
21
|
+
- Job Statistics (lag, attempts, logs, tracked errors)
|
22
|
+
- Convenience methods to clear tubes, stats, and connections for Beanstalk.
|
23
|
+
|
24
|
+
Otherwise, Postburner tries to be a super simple layer on `Backburner::Queue`
|
25
|
+
and `ActiveRecord`. Every tool with either of those are avilabel in
|
26
|
+
`Postburner::Job`s.
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class RunDonation < Postburner::Job
|
32
|
+
queue 'critical'
|
33
|
+
queue_priority 0 # 0 is highest priority
|
34
|
+
queue_max_job_retries 0 # don't retry
|
35
|
+
|
36
|
+
def process(args)
|
37
|
+
# do long tasks here
|
38
|
+
# also have access to self.args
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
RunDonation.create!(args: {donation_id: 123}).queue!
|
43
|
+
=> {:status=>"INSERTED", :id=>"1139"}
|
44
|
+
RunDonation.create!(args: {donation_id: 123}).queue! at: Time.zone.now + 2.days
|
45
|
+
=> {:status=>"INSERTED", :id=>"1140"}
|
46
|
+
|
47
|
+
# `delay` takes priority over `at`
|
48
|
+
RunDonation.create!(args: {donation_id: 123}).queue! delay: 1.hour
|
49
|
+
=> {:status=>"INSERTED", :id=>"1141"}
|
50
|
+
```
|
51
|
+
|
52
|
+
## Installation
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
# in Gemfile
|
56
|
+
gem 'postburner'
|
57
|
+
```
|
58
|
+
|
59
|
+
```bash
|
60
|
+
$ bundle
|
61
|
+
|
62
|
+
# install migration, possible to edit and add attributes or indexes as needed.
|
63
|
+
$ bundle exec rails g postburner:install
|
64
|
+
```
|
65
|
+
|
66
|
+
Add a `config/initializers/backburner.rb` with option found [here](https://github.com/nesquena/backburner#configuration).
|
67
|
+
|
68
|
+
Set `Backburner` for `ActiveJob`
|
69
|
+
```
|
70
|
+
# config/application.rb
|
71
|
+
config.active_job.queue_adapter = :backburner
|
72
|
+
```
|
73
|
+
|
74
|
+
Postburner may later provide an adapter, but we recommend using `Postburner::Job` classes
|
75
|
+
directyly.
|
76
|
+
|
77
|
+
Add jobs to `app/jobs/`. There currently is no generator.
|
78
|
+
```ruby
|
79
|
+
# app/jobs/run_donation.rb
|
80
|
+
|
81
|
+
class RunDonation < Postburner::Job
|
82
|
+
queue 'critical'
|
83
|
+
queue_priority 0 # 0 is highest priority
|
84
|
+
queue_max_job_retries 0 # don't retry
|
85
|
+
|
86
|
+
def process(args)
|
87
|
+
# do long tasks here
|
88
|
+
# also have access to self.args
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
## Contributing
|
93
|
+
Submit a pull request. Follow conventions of the project. Be nice.
|
94
|
+
|
95
|
+
### V1 TODO
|
96
|
+
- Basic tests
|
97
|
+
- Add Authentication modules for engine mount.
|
98
|
+
|
99
|
+
### V1+ TODO
|
100
|
+
- Install generator
|
101
|
+
- Sub to backburner
|
102
|
+
- Job generator
|
103
|
+
- Build file in app/jobs
|
104
|
+
- Inherit from Postburner::Job
|
105
|
+
- Job generator
|
106
|
+
- Add before/after/around hooks
|
107
|
+
- Add destroy, and remove actions on show page
|
108
|
+
- Clear tubes.
|
109
|
+
- Document how/when to use activerecord hooks
|
110
|
+
- Document how/when to use backburner hooks
|
111
|
+
- Document how/when to use postburner hooks
|
112
|
+
- Add logging with Job.args in backburner logs
|
113
|
+
- MAYBE - ActiveJob adapter
|
114
|
+
|
115
|
+
## License
|
116
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
|
3
|
+
APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
|
4
|
+
load "rails/tasks/engine.rake"
|
5
|
+
|
6
|
+
load "rails/tasks/statistics.rake"
|
7
|
+
|
8
|
+
require "bundler/gem_tasks"
|
9
|
+
|
10
|
+
require "rake/testtask"
|
11
|
+
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.libs << 'test'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = false
|
16
|
+
end
|
17
|
+
|
18
|
+
task default: :test
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_directory ../stylesheets/postburner .css
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_dependency "postburner/application_controller"
|
2
|
+
|
3
|
+
module Postburner
|
4
|
+
class JobsController < ApplicationController
|
5
|
+
def index
|
6
|
+
@jobs = Job.order(queued_at: :desc, created_at: :desc)
|
7
|
+
end
|
8
|
+
|
9
|
+
def show
|
10
|
+
@job = Job.find(params[:id])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
module Postburner
|
2
|
+
class Job < ApplicationRecord
|
3
|
+
include Backburner::Queue
|
4
|
+
|
5
|
+
LOG_LEVELS = [
|
6
|
+
:debug,
|
7
|
+
:info,
|
8
|
+
:warning,
|
9
|
+
:error
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
before_validation :ensure_sid!
|
13
|
+
before_destroy :delete!
|
14
|
+
|
15
|
+
validates :sid, presence: {strict: true}
|
16
|
+
|
17
|
+
def queue!(options={})
|
18
|
+
return if self.queued_at.present? && self.bkid.present?
|
19
|
+
|
20
|
+
case
|
21
|
+
when options[:at].present?
|
22
|
+
# this is rudimentary, add error handling
|
23
|
+
options[:delay] ||= options[:at].to_i - Time.zone.now.to_i
|
24
|
+
update_column :run_at, options[:at]
|
25
|
+
options.delete(:at)
|
26
|
+
when options[:delay].present?
|
27
|
+
update_column :run_at, Time.zone.now + options[:delay].seconds
|
28
|
+
end
|
29
|
+
|
30
|
+
insert!(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
# tube: backburner.worker.queue.backburner-jobs
|
34
|
+
#
|
35
|
+
def self.perform(id, _={})
|
36
|
+
begin
|
37
|
+
job = self.find(id)
|
38
|
+
job.perform!(job.args)
|
39
|
+
rescue ActiveRecord::RecordNotFound => e
|
40
|
+
Rails.logger.warning <<-MSG
|
41
|
+
[Postburner::Job] [#{id}] Not Found.
|
42
|
+
MSG
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def perform!(args={})
|
47
|
+
self.attempting
|
48
|
+
|
49
|
+
self.update_columns(
|
50
|
+
attempting_at: self.attempting_at,
|
51
|
+
attempts: self.attempts,
|
52
|
+
attempt_count: self.attempts.length,
|
53
|
+
lag: self.lag,
|
54
|
+
processing_at: Time.zone.now,
|
55
|
+
)
|
56
|
+
|
57
|
+
begin
|
58
|
+
if self.removed_at.present?
|
59
|
+
self.log "Removed", level: :error
|
60
|
+
update_column :logs, self.logs
|
61
|
+
return
|
62
|
+
end
|
63
|
+
|
64
|
+
if self.run_at && self.run_at > Time.zone.now
|
65
|
+
response = self.insert! delay: self.run_at - Time.zone.now
|
66
|
+
self.log "PREMATURE; RE-INSERTED: #{response}"
|
67
|
+
update_column :logs, self.logs
|
68
|
+
return
|
69
|
+
end
|
70
|
+
|
71
|
+
self.log('START')
|
72
|
+
|
73
|
+
self.perform(args)
|
74
|
+
|
75
|
+
self.log('DONE')
|
76
|
+
|
77
|
+
rescue Exception => e
|
78
|
+
self.log_exception(e)
|
79
|
+
end
|
80
|
+
|
81
|
+
begin
|
82
|
+
now = Time.zone.now
|
83
|
+
_duration = (now - self.processing_at) * 1000 rescue nil
|
84
|
+
self.update_columns(
|
85
|
+
processed_at: now,
|
86
|
+
duration: _duration,
|
87
|
+
errata: self.errata,
|
88
|
+
error_count: self.errata.length,
|
89
|
+
logs: self.logs,
|
90
|
+
log_count: self.logs.length,
|
91
|
+
)
|
92
|
+
rescue Exception => e
|
93
|
+
raise e if Rails.env.development? || Rails.env.production?
|
94
|
+
self.log_exception(e)
|
95
|
+
update_column :errata, self.errata
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def delete!
|
100
|
+
return unless self.beanstalk_job
|
101
|
+
begin
|
102
|
+
self.beanstalk_job.delete
|
103
|
+
rescue Beaneater::NotConnected => e
|
104
|
+
self.beanstalk_job!.delete
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def kick!
|
109
|
+
return unless self.beanstalk_job
|
110
|
+
begin
|
111
|
+
self.beanstalk_job.kick
|
112
|
+
rescue Beaneater::NotConnected => e
|
113
|
+
self.beanstalk_job!.kick
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def remove!
|
118
|
+
return false if self.attempts.any?
|
119
|
+
self.delete!
|
120
|
+
self.update_column(removed_at: Time.zone.now)
|
121
|
+
end
|
122
|
+
|
123
|
+
def beanstalk_job
|
124
|
+
return unless self.bkid.present?
|
125
|
+
return @_beanstalk_job if @_beanstalk_job
|
126
|
+
|
127
|
+
@_beanstalk_job = Postburner.connection.beanstalk.jobs.find(self.bkid)
|
128
|
+
|
129
|
+
@_beanstalk_job
|
130
|
+
end
|
131
|
+
|
132
|
+
def beanstalk_job!
|
133
|
+
@_beanstalk_job = nil
|
134
|
+
self.beanstalk_job
|
135
|
+
end
|
136
|
+
|
137
|
+
def log_exception(exception)
|
138
|
+
self.errata << [
|
139
|
+
Time.zone.now,
|
140
|
+
{
|
141
|
+
class: exception.class,
|
142
|
+
message: exception.message,
|
143
|
+
backtrace: exception.backtrace,
|
144
|
+
}
|
145
|
+
]
|
146
|
+
end
|
147
|
+
|
148
|
+
def log(message, options={})
|
149
|
+
options[:level] ||= :info
|
150
|
+
options[:level] = :error unless LOG_LEVELS.member?(options[:level])
|
151
|
+
|
152
|
+
self.logs << [
|
153
|
+
Time.zone.now,
|
154
|
+
options[:level],
|
155
|
+
message,
|
156
|
+
]
|
157
|
+
end
|
158
|
+
|
159
|
+
private
|
160
|
+
|
161
|
+
def insert!(options={})
|
162
|
+
response = Backburner::Worker.enqueue(Postburner::Job, self.id, options)
|
163
|
+
|
164
|
+
self.log("QUEUED: #{response}")
|
165
|
+
|
166
|
+
update_columns(
|
167
|
+
queued_at: Time.zone.now,
|
168
|
+
bkid: response[:id],
|
169
|
+
logs: self.logs,
|
170
|
+
)
|
171
|
+
|
172
|
+
response
|
173
|
+
end
|
174
|
+
|
175
|
+
def attempting
|
176
|
+
now = Time.zone.now
|
177
|
+
self.attempts << now
|
178
|
+
self.attempting_at ||= now
|
179
|
+
self.lag ||= (self.attempting_at - self.intended_at) * 1000
|
180
|
+
now
|
181
|
+
end
|
182
|
+
|
183
|
+
def intended_at
|
184
|
+
self.run_at ? self.run_at : self.queued_at
|
185
|
+
end
|
186
|
+
|
187
|
+
def ensure_sid!
|
188
|
+
self.sid ||= SecureRandom.uuid
|
189
|
+
end
|
190
|
+
|
191
|
+
def message
|
192
|
+
"Job: #{self.id}"
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
%h1 Jobs
|
2
|
+
|
3
|
+
%table
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
%th ID
|
7
|
+
%th Beanstalk
|
8
|
+
%th Type
|
9
|
+
%th Arguments
|
10
|
+
%th Run
|
11
|
+
%th Attempted
|
12
|
+
%th Completed
|
13
|
+
%th Attempts
|
14
|
+
%th Errors
|
15
|
+
%th Logs
|
16
|
+
%th Lag
|
17
|
+
%th Duration
|
18
|
+
%tbody
|
19
|
+
- @jobs.each do |job|
|
20
|
+
%tr
|
21
|
+
%td
|
22
|
+
= link_to postburner.job_path(job) do
|
23
|
+
%span{title: job.sid}= job.id
|
24
|
+
%td= job.bkid
|
25
|
+
%td= job.type
|
26
|
+
%td= job.args.inspect
|
27
|
+
%td= job.run_at
|
28
|
+
%td= job.attempting_at
|
29
|
+
%td= job.processed_at
|
30
|
+
%td= job.attempt_count
|
31
|
+
%td= job.error_count
|
32
|
+
%td= job.log_count
|
33
|
+
%td= job.lag
|
34
|
+
%td= job.duration
|
@@ -0,0 +1,13 @@
|
|
1
|
+
%h1 Job #{@job.id} / #{@job.bkid} / #{@job.sid}
|
2
|
+
|
3
|
+
- if @job.run_at && @job.run_at > Time.zone.now
|
4
|
+
Running in
|
5
|
+
= distance_of_time_in_words Time.zone.now, @job.run_at
|
6
|
+
(#{@job.run_at.to_i - Time.zone.now.to_i} seconds)
|
7
|
+
|
8
|
+
%h3 Stats
|
9
|
+
- if @job.beanstalk_job
|
10
|
+
%pre= JSON.pretty_generate @job.beanstalk_job.stats.as_json
|
11
|
+
|
12
|
+
%h3 Job
|
13
|
+
%pre= JSON.pretty_generate @job.as_json
|
File without changes
|
data/config/routes.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class Postburner::InstallGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
3
|
+
include Rails::Generators::Migration
|
4
|
+
|
5
|
+
def install_migrations
|
6
|
+
install_migration! 'create_postburner_jobs'
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.next_migration_number(dirname)
|
10
|
+
timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S")
|
11
|
+
stem = timestamp[0..-3]
|
12
|
+
regexp = Regexp.new("^(#{stem})(\\d\\d)_")
|
13
|
+
timestamps = Dir[File.join(dirname, '*.rb')].map { |name|
|
14
|
+
match = regexp.match(File.basename(name, File.extname(name)))
|
15
|
+
match ? match[2].to_i : nil
|
16
|
+
}.reject(&:nil?)
|
17
|
+
_max = timestamps.max || timestamp[-2..-1].to_i
|
18
|
+
_next = _max + 1
|
19
|
+
raise "MISSING NEXT" if _next.blank?
|
20
|
+
migration_number = "#{stem}#{_next}"
|
21
|
+
if migration_number.length != 14
|
22
|
+
raise "INCORRECT LENGTH stem=#{stem} _next=#{_next} _max=#{_max}"
|
23
|
+
end
|
24
|
+
migration_number
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def install_migration!(filename)
|
30
|
+
migrate_path = File.join(Rails.root, "db/migrate")
|
31
|
+
|
32
|
+
if self.class.migration_exists?(migrate_path, "#{filename}")
|
33
|
+
say_status "skipped", "#{filename}.rb migration already exists"
|
34
|
+
else
|
35
|
+
migration_template(
|
36
|
+
"migrations/#{filename}.rb.erb",
|
37
|
+
File.join(migrate_path, "#{filename}.rb"),
|
38
|
+
migration_version: migration_version,
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def migration_version
|
44
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
class CreatePostburnerJobs < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def change
|
5
|
+
create_table :postburner_jobs do |t|
|
6
|
+
t.bigint :bkid
|
7
|
+
t.string :sid, null: false
|
8
|
+
t.string :type
|
9
|
+
t.jsonb :args, default: {}
|
10
|
+
t.datetime :run_at
|
11
|
+
t.datetime :queued_at
|
12
|
+
t.datetime :attempting_at
|
13
|
+
t.datetime :processing_at
|
14
|
+
t.datetime :processed_at
|
15
|
+
t.datetime :removed_at
|
16
|
+
t.integer :lag
|
17
|
+
t.integer :duration
|
18
|
+
t.integer :attempt_count
|
19
|
+
t.integer :error_count
|
20
|
+
t.integer :log_count
|
21
|
+
t.datetime :attempts, array: true, default: []
|
22
|
+
t.jsonb :errata, default: []
|
23
|
+
t.jsonb :logs, default: []
|
24
|
+
|
25
|
+
t.timestamps
|
26
|
+
|
27
|
+
t.index [ :bkid ]
|
28
|
+
t.index [ :sid ], unique: true
|
29
|
+
t.index [ :type ]
|
30
|
+
t.index [ :args ], using: :gin
|
31
|
+
t.index [ :run_at ]
|
32
|
+
t.index [ :queued_at ]
|
33
|
+
t.index [ :removed_at ]
|
34
|
+
t.index [ :lag ]
|
35
|
+
t.index [ :duration ]
|
36
|
+
t.index [ :attempt_count ]
|
37
|
+
t.index [ :error_count ]
|
38
|
+
t.index [ :log_count ]
|
39
|
+
|
40
|
+
# Add these or more depending on what you want to search for.
|
41
|
+
#t.index [ :attempts ], using: :gin
|
42
|
+
#t.index [ :errata ], using: :gin
|
43
|
+
#t.index [ :logs ], using: :gin
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/postburner.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "postburner/version"
|
2
|
+
require "postburner/engine"
|
3
|
+
|
4
|
+
module Postburner
|
5
|
+
|
6
|
+
def self.connection
|
7
|
+
@_connection ||= Backburner::Connection.new(
|
8
|
+
Backburner.configuration.beanstalk_url
|
9
|
+
)
|
10
|
+
@_connection.reconnect! unless @_connection.connected?
|
11
|
+
@_connection
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.connected
|
15
|
+
if block_given?
|
16
|
+
begin
|
17
|
+
yield connection
|
18
|
+
ensure
|
19
|
+
connection.close if connection
|
20
|
+
end
|
21
|
+
else
|
22
|
+
connection
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.remove_all!(confirm)
|
27
|
+
return unless confirm == "CONFIRM"
|
28
|
+
|
29
|
+
# TODO
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'backburner'
|
2
|
+
require 'haml-rails'
|
3
|
+
|
4
|
+
module Postburner
|
5
|
+
class Engine < ::Rails::Engine
|
6
|
+
isolate_namespace Postburner
|
7
|
+
|
8
|
+
config.generators do |g|
|
9
|
+
g.template_engine :haml
|
10
|
+
g.helper false
|
11
|
+
g.fixture false
|
12
|
+
g.assets false
|
13
|
+
g.skip_routes true
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: postburner
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Smith
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-05-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.1.3
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.1.3.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 6.1.3
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.1.3.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: backburner
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.5.0
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.5.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: pg
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.3
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.2.3
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: haml-rails
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 2.0.1
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 2.0.1
|
75
|
+
description: Queue background jobs, inspect them, and audit them afterwards.
|
76
|
+
email:
|
77
|
+
- matt@nearapogee.com
|
78
|
+
executables: []
|
79
|
+
extensions: []
|
80
|
+
extra_rdoc_files: []
|
81
|
+
files:
|
82
|
+
- CHANGELOG.md
|
83
|
+
- MIT-LICENSE
|
84
|
+
- README.md
|
85
|
+
- Rakefile
|
86
|
+
- app/assets/config/postburner_manifest.js
|
87
|
+
- app/assets/stylesheets/postburner/application.css
|
88
|
+
- app/controllers/postburner/application_controller.rb
|
89
|
+
- app/controllers/postburner/jobs_controller.rb
|
90
|
+
- app/controllers/postburner/static_controller.rb
|
91
|
+
- app/helpers/postburner/application_helper.rb
|
92
|
+
- app/jobs/postburner/application_job.rb
|
93
|
+
- app/mailers/postburner/application_mailer.rb
|
94
|
+
- app/models/postburner/application_record.rb
|
95
|
+
- app/models/postburner/job.rb
|
96
|
+
- app/views/layouts/postburner/application.html.haml
|
97
|
+
- app/views/postburner/jobs/index.html.haml
|
98
|
+
- app/views/postburner/jobs/show.html.haml
|
99
|
+
- config/environment.rb
|
100
|
+
- config/routes.rb
|
101
|
+
- lib/generators/postburner/install/USAGE
|
102
|
+
- lib/generators/postburner/install/install_generator.rb
|
103
|
+
- lib/generators/postburner/install/templates/migrations/create_postburner_jobs.rb.erb
|
104
|
+
- lib/postburner.rb
|
105
|
+
- lib/postburner/engine.rb
|
106
|
+
- lib/postburner/version.rb
|
107
|
+
- lib/tasks/postburner_tasks.rake
|
108
|
+
homepage: https://gitlab.nearapogee.com/opensource/postburner
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata:
|
112
|
+
homepage_uri: https://gitlab.nearapogee.com/opensource/postburner
|
113
|
+
source_code_uri: https://gitlab.nearapogee.com/opensource/postburner
|
114
|
+
changelog_uri: https://gitlab.nearapogee.com/opensource/postburner/-/blob/master/CHANGELOG.md
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- lib
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
requirements: []
|
130
|
+
rubygems_version: 3.1.4
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: Postgres backed beanstalkd queue via backburner
|
134
|
+
test_files: []
|