sidekiq_cleaner 5.3.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![cleaner.png](./cleaner.png)
|
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
|
+
![cleaner-stats.png](./cleaner-stats.png)
|
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
|