sidekiq_cleaner 5.3.6
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/.circleci/config.yml +61 -0
- data/.github/contributing.md +32 -0
- data/.github/issue_template.md +11 -0
- data/.gitignore +15 -0
- data/.travis.yml +11 -0
- data/3.0-Upgrade.md +70 -0
- data/4.0-Upgrade.md +53 -0
- data/5.0-Upgrade.md +56 -0
- data/COMM-LICENSE +97 -0
- data/Changes.md +1536 -0
- data/Ent-Changes.md +238 -0
- data/Gemfile +23 -0
- data/LICENSE +9 -0
- data/Pro-2.0-Upgrade.md +138 -0
- data/Pro-3.0-Upgrade.md +44 -0
- data/Pro-4.0-Upgrade.md +35 -0
- data/Pro-Changes.md +759 -0
- data/README.md +55 -0
- data/Rakefile +9 -0
- data/bin/sidekiq +18 -0
- data/bin/sidekiqctl +20 -0
- data/bin/sidekiqload +149 -0
- data/cleaner/assets/images/favicon.ico +0 -0
- data/cleaner/assets/images/logo.png +0 -0
- data/cleaner/assets/images/status.png +0 -0
- data/cleaner/assets/javascripts/application.js +172 -0
- data/cleaner/assets/javascripts/dashboard.js +315 -0
- data/cleaner/assets/stylesheets/application-rtl.css +246 -0
- data/cleaner/assets/stylesheets/application.css +1144 -0
- data/cleaner/assets/stylesheets/bootstrap-rtl.min.css +9 -0
- data/cleaner/assets/stylesheets/bootstrap.css +5 -0
- data/cleaner/locales/ar.yml +81 -0
- data/cleaner/locales/cs.yml +78 -0
- data/cleaner/locales/da.yml +68 -0
- data/cleaner/locales/de.yml +69 -0
- data/cleaner/locales/el.yml +68 -0
- data/cleaner/locales/en.yml +81 -0
- data/cleaner/locales/es.yml +70 -0
- data/cleaner/locales/fa.yml +80 -0
- data/cleaner/locales/fr.yml +78 -0
- data/cleaner/locales/he.yml +79 -0
- data/cleaner/locales/hi.yml +75 -0
- data/cleaner/locales/it.yml +69 -0
- data/cleaner/locales/ja.yml +80 -0
- data/cleaner/locales/ko.yml +68 -0
- data/cleaner/locales/nb.yml +77 -0
- data/cleaner/locales/nl.yml +68 -0
- data/cleaner/locales/pl.yml +59 -0
- data/cleaner/locales/pt-br.yml +68 -0
- data/cleaner/locales/pt.yml +67 -0
- data/cleaner/locales/ru.yml +78 -0
- data/cleaner/locales/sv.yml +68 -0
- data/cleaner/locales/ta.yml +75 -0
- data/cleaner/locales/uk.yml +76 -0
- data/cleaner/locales/ur.yml +80 -0
- data/cleaner/locales/zh-cn.yml +68 -0
- data/cleaner/locales/zh-tw.yml +68 -0
- data/cleaner/views/_footer.erb +20 -0
- data/cleaner/views/_job_info.erb +88 -0
- data/cleaner/views/_nav.erb +52 -0
- data/cleaner/views/_paging.erb +23 -0
- data/cleaner/views/_poll_link.erb +7 -0
- data/cleaner/views/_status.erb +4 -0
- data/cleaner/views/_summary.erb +40 -0
- data/cleaner/views/busy.erb +98 -0
- data/cleaner/views/dashboard.erb +75 -0
- data/cleaner/views/dead.erb +34 -0
- data/cleaner/views/errors.erb +84 -0
- data/cleaner/views/layout.erb +40 -0
- data/cleaner/views/morgue.erb +75 -0
- data/cleaner/views/queue.erb +46 -0
- data/cleaner/views/queues.erb +30 -0
- data/cleaner/views/retries.erb +80 -0
- data/cleaner/views/retry.erb +34 -0
- data/cleaner/views/scheduled.erb +54 -0
- data/cleaner/views/scheduled_job_info.erb +8 -0
- data/cleaner-stats.png +0 -0
- data/cleaner.png +0 -0
- data/code_of_conduct.md +50 -0
- data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
- data/lib/generators/sidekiq/worker_generator.rb +49 -0
- data/lib/sidekiq/api.rb +940 -0
- data/lib/sidekiq/cleaner/action.rb +89 -0
- data/lib/sidekiq/cleaner/application.rb +385 -0
- data/lib/sidekiq/cleaner/helpers.rb +325 -0
- data/lib/sidekiq/cleaner/router.rb +100 -0
- data/lib/sidekiq/cleaner.rb +214 -0
- data/lib/sidekiq/cli.rb +445 -0
- data/lib/sidekiq/client.rb +243 -0
- data/lib/sidekiq/core_ext.rb +1 -0
- data/lib/sidekiq/ctl.rb +221 -0
- data/lib/sidekiq/delay.rb +42 -0
- data/lib/sidekiq/exception_handler.rb +29 -0
- data/lib/sidekiq/extensions/action_mailer.rb +57 -0
- data/lib/sidekiq/extensions/active_record.rb +40 -0
- data/lib/sidekiq/extensions/class_methods.rb +40 -0
- data/lib/sidekiq/extensions/generic_proxy.rb +31 -0
- data/lib/sidekiq/fetch.rb +81 -0
- data/lib/sidekiq/job_logger.rb +25 -0
- data/lib/sidekiq/job_retry.rb +262 -0
- data/lib/sidekiq/launcher.rb +173 -0
- data/lib/sidekiq/logging.rb +122 -0
- data/lib/sidekiq/manager.rb +137 -0
- data/lib/sidekiq/middleware/chain.rb +150 -0
- data/lib/sidekiq/middleware/i18n.rb +42 -0
- data/lib/sidekiq/middleware/server/active_record.rb +23 -0
- data/lib/sidekiq/paginator.rb +43 -0
- data/lib/sidekiq/processor.rb +279 -0
- data/lib/sidekiq/rails.rb +58 -0
- data/lib/sidekiq/redis_connection.rb +144 -0
- data/lib/sidekiq/scheduled.rb +174 -0
- data/lib/sidekiq/testing/inline.rb +29 -0
- data/lib/sidekiq/testing.rb +333 -0
- data/lib/sidekiq/util.rb +66 -0
- data/lib/sidekiq/version.rb +4 -0
- data/lib/sidekiq/worker.rb +220 -0
- data/lib/sidekiq.rb +237 -0
- data/sidekiq_cleaner.gemspec +21 -0
- metadata +235 -0
data/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
(ReachLocal) Sidekiq Cleaner
|
|
2
|
+
==============
|
|
3
|
+
|
|
4
|
+
For additional documentation, see the [Sidekiq repository](https://github.com/mperham/sidekiq)
|
|
5
|
+
|
|
6
|
+
Motivation
|
|
7
|
+
-----------------
|
|
8
|
+
Sidekiq is a very performant library for handling background processing of jobs, but could use with an improved UI for managing job statuses. The Capture team, found ourselves utilizing the [resque-cleaner]() gem frequently to manage our job processing, and felt that this should be included in the Sidekiq library. What is included here is a fork of the Sidekiq library with some tweaks to the `Web` rails engine under a new `Cleaner` namespace.
|
|
9
|
+
|
|
10
|
+
Installation
|
|
11
|
+
-----------------
|
|
12
|
+
|
|
13
|
+
gem install sidekiq-cleaner
|
|
14
|
+
|
|
15
|
+
Usage
|
|
16
|
+
-----------------
|
|
17
|
+
Mount the Cleaner engine in the `config/routes.rb` file like so:
|
|
18
|
+
|
|
19
|
+
```ruby
|
|
20
|
+
Rails.application.routes.draw do
|
|
21
|
+
mount Sidekiq::Cleaner => '/cleaner'
|
|
22
|
+
end
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The web UI should appear familiar to users of the Sidekiq job library - the only difference is that a new Cleaner tab is introduced:
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
This tab introduces a useful UI for managing job failures (as filtered by class and exception) en masse - which was only supported for one-off retries and deletes in the vanilla library. Perhaps a future release of Sidekiq will improve on this functionality!
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+
Useful resources:
|
|
34
|
+
|
|
35
|
+
* Product documentation is in the [wiki](https://github.com/mperham/sidekiq/wiki).
|
|
36
|
+
* Release announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
|
|
37
|
+
* The [Sidekiq tag](https://stackoverflow.com/questions/tagged/sidekiq) on Stack Overflow has lots of useful Q & A.
|
|
38
|
+
|
|
39
|
+
Thanks
|
|
40
|
+
-----------------
|
|
41
|
+
|
|
42
|
+
Sidekiq stays fast by using the [JProfiler java profiler](http://www.ej-technologies.com/products/jprofiler/overview.html) to find and fix
|
|
43
|
+
performance problems on JRuby. Unfortunately MRI does not have good multithreaded profiling tools.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
License
|
|
47
|
+
-----------------
|
|
48
|
+
|
|
49
|
+
MIT
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
Author
|
|
53
|
+
-----------------
|
|
54
|
+
|
|
55
|
+
Dan Belling, [danhbelling@gmail.com](mailto:danhbelling@gmail.com), [http://www.danbelling.me](http://danbelling.me)
|
data/Rakefile
ADDED
data/bin/sidekiq
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# Quiet some warnings we see when running in warning mode:
|
|
4
|
+
# RUBYOPT=-w bundle exec sidekiq
|
|
5
|
+
$TESTING = false
|
|
6
|
+
|
|
7
|
+
require_relative '../lib/sidekiq/cli'
|
|
8
|
+
|
|
9
|
+
begin
|
|
10
|
+
cli = Sidekiq::CLI.instance
|
|
11
|
+
cli.parse
|
|
12
|
+
cli.run
|
|
13
|
+
rescue => e
|
|
14
|
+
raise e if $DEBUG
|
|
15
|
+
STDERR.puts e.message
|
|
16
|
+
STDERR.puts e.backtrace.join("\n")
|
|
17
|
+
exit 1
|
|
18
|
+
end
|
data/bin/sidekiqctl
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'sidekiq/api'
|
|
5
|
+
require 'sidekiq/ctl'
|
|
6
|
+
|
|
7
|
+
if ARGV[0] == 'status'
|
|
8
|
+
Sidekiq::Ctl::Status.new.display(ARGV[1])
|
|
9
|
+
else
|
|
10
|
+
if ARGV.length < 2
|
|
11
|
+
Sidekiq::Ctl.print_usage
|
|
12
|
+
else
|
|
13
|
+
stage = ARGV[0]
|
|
14
|
+
pidfile = ARGV[1]
|
|
15
|
+
timeout = ARGV[2].to_i
|
|
16
|
+
timeout = Sidekiq::Ctl::DEFAULT_KILL_TIMEOUT if timeout == 0
|
|
17
|
+
|
|
18
|
+
Sidekiq::Ctl.new(stage, pidfile, timeout)
|
|
19
|
+
end
|
|
20
|
+
end
|
data/bin/sidekiqload
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# Quiet some warnings we see when running in warning mode:
|
|
4
|
+
# RUBYOPT=-w bundle exec sidekiq
|
|
5
|
+
$TESTING = false
|
|
6
|
+
|
|
7
|
+
#require 'ruby-prof'
|
|
8
|
+
Bundler.require(:default)
|
|
9
|
+
|
|
10
|
+
require_relative '../lib/sidekiq/cli'
|
|
11
|
+
require_relative '../lib/sidekiq/launcher'
|
|
12
|
+
|
|
13
|
+
include Sidekiq::Util
|
|
14
|
+
|
|
15
|
+
Sidekiq.configure_server do |config|
|
|
16
|
+
#config.options[:concurrency] = 1
|
|
17
|
+
config.redis = { db: 13 }
|
|
18
|
+
config.options[:queues] << 'default'
|
|
19
|
+
config.logger.level = Logger::ERROR
|
|
20
|
+
config.average_scheduled_poll_interval = 2
|
|
21
|
+
config.reliable! if defined?(Sidekiq::Pro)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class LoadWorker
|
|
25
|
+
include Sidekiq::Worker
|
|
26
|
+
sidekiq_options retry: 1
|
|
27
|
+
sidekiq_retry_in do |x|
|
|
28
|
+
1
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def perform(idx)
|
|
32
|
+
#raise idx.to_s if idx % 100 == 1
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# brew tap shopify/shopify
|
|
37
|
+
# brew install toxiproxy
|
|
38
|
+
# gem install toxiproxy
|
|
39
|
+
#require 'toxiproxy'
|
|
40
|
+
# simulate a non-localhost network for realer-world conditions.
|
|
41
|
+
# adding 1ms of network latency has an ENORMOUS impact on benchmarks
|
|
42
|
+
#Toxiproxy.populate([{
|
|
43
|
+
#"name": "redis",
|
|
44
|
+
#"listen": "127.0.0.1:6380",
|
|
45
|
+
#"upstream": "127.0.0.1:6379"
|
|
46
|
+
#}])
|
|
47
|
+
|
|
48
|
+
self_read, self_write = IO.pipe
|
|
49
|
+
%w(INT TERM TSTP TTIN).each do |sig|
|
|
50
|
+
begin
|
|
51
|
+
trap sig do
|
|
52
|
+
self_write.puts(sig)
|
|
53
|
+
end
|
|
54
|
+
rescue ArgumentError
|
|
55
|
+
puts "Signal #{sig} not supported"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
Sidekiq.redis {|c| c.flushdb}
|
|
60
|
+
def handle_signal(launcher, sig)
|
|
61
|
+
Sidekiq.logger.debug "Got #{sig} signal"
|
|
62
|
+
case sig
|
|
63
|
+
when 'INT'
|
|
64
|
+
# Handle Ctrl-C in JRuby like MRI
|
|
65
|
+
# http://jira.codehaus.org/browse/JRUBY-4637
|
|
66
|
+
raise Interrupt
|
|
67
|
+
when 'TERM'
|
|
68
|
+
# Heroku sends TERM and then waits 30 seconds for process to exit.
|
|
69
|
+
raise Interrupt
|
|
70
|
+
when 'TSTP'
|
|
71
|
+
Sidekiq.logger.info "Received TSTP, no longer accepting new work"
|
|
72
|
+
launcher.quiet
|
|
73
|
+
when 'TTIN'
|
|
74
|
+
Thread.list.each do |thread|
|
|
75
|
+
Sidekiq.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread['label']}"
|
|
76
|
+
if thread.backtrace
|
|
77
|
+
Sidekiq.logger.warn thread.backtrace.join("\n")
|
|
78
|
+
else
|
|
79
|
+
Sidekiq.logger.warn "<no backtrace available>"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def Process.rss
|
|
86
|
+
`ps -o rss= -p #{Process.pid}`.chomp.to_i
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
iter = 10
|
|
90
|
+
count = 10_000
|
|
91
|
+
|
|
92
|
+
iter.times do
|
|
93
|
+
arr = Array.new(count) do
|
|
94
|
+
[]
|
|
95
|
+
end
|
|
96
|
+
count.times do |idx|
|
|
97
|
+
arr[idx][0] = idx
|
|
98
|
+
end
|
|
99
|
+
Sidekiq::Client.push_bulk('class' => LoadWorker, 'args' => arr)
|
|
100
|
+
end
|
|
101
|
+
Sidekiq.logger.error "Created #{count*iter} jobs"
|
|
102
|
+
|
|
103
|
+
Monitoring = Thread.new do
|
|
104
|
+
watchdog("monitor thread") do
|
|
105
|
+
while true
|
|
106
|
+
sleep 1
|
|
107
|
+
qsize, retries = Sidekiq.redis do |conn|
|
|
108
|
+
conn.pipelined do
|
|
109
|
+
conn.llen "queue:default"
|
|
110
|
+
conn.zcard "retry"
|
|
111
|
+
end
|
|
112
|
+
end.map(&:to_i)
|
|
113
|
+
total = qsize + retries
|
|
114
|
+
#GC.start
|
|
115
|
+
Sidekiq.logger.error("RSS: #{Process.rss} Pending: #{total}")
|
|
116
|
+
if total == 0
|
|
117
|
+
Sidekiq.logger.error("Done")
|
|
118
|
+
exit(0)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
begin
|
|
125
|
+
#RubyProf::exclude_threads = [ Monitoring ]
|
|
126
|
+
#RubyProf.start
|
|
127
|
+
fire_event(:startup)
|
|
128
|
+
#Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
|
|
129
|
+
#Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
|
|
130
|
+
launcher = Sidekiq::Launcher.new(Sidekiq.options)
|
|
131
|
+
launcher.run
|
|
132
|
+
|
|
133
|
+
while readable_io = IO.select([self_read])
|
|
134
|
+
signal = readable_io.first[0].gets.strip
|
|
135
|
+
handle_signal(launcher, signal)
|
|
136
|
+
end
|
|
137
|
+
#end
|
|
138
|
+
rescue SystemExit => e
|
|
139
|
+
#Sidekiq.logger.error("Profiling...")
|
|
140
|
+
#result = RubyProf.stop
|
|
141
|
+
#printer = RubyProf::GraphHtmlPrinter.new(result)
|
|
142
|
+
#printer.print(File.new("output.html", "w"), :min_percent => 1)
|
|
143
|
+
# normal
|
|
144
|
+
rescue => e
|
|
145
|
+
raise e if $DEBUG
|
|
146
|
+
STDERR.puts e.message
|
|
147
|
+
STDERR.puts e.backtrace.join("\n")
|
|
148
|
+
exit 1
|
|
149
|
+
end
|
|
Binary file
|
|
Binary file
|
|
Binary file
|