sidekiq_cleaner 5.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +61 -0
  3. data/.github/contributing.md +32 -0
  4. data/.github/issue_template.md +11 -0
  5. data/.gitignore +15 -0
  6. data/.travis.yml +11 -0
  7. data/3.0-Upgrade.md +70 -0
  8. data/4.0-Upgrade.md +53 -0
  9. data/5.0-Upgrade.md +56 -0
  10. data/COMM-LICENSE +97 -0
  11. data/Changes.md +1536 -0
  12. data/Ent-Changes.md +238 -0
  13. data/Gemfile +23 -0
  14. data/LICENSE +9 -0
  15. data/Pro-2.0-Upgrade.md +138 -0
  16. data/Pro-3.0-Upgrade.md +44 -0
  17. data/Pro-4.0-Upgrade.md +35 -0
  18. data/Pro-Changes.md +759 -0
  19. data/README.md +55 -0
  20. data/Rakefile +9 -0
  21. data/bin/sidekiq +18 -0
  22. data/bin/sidekiqctl +20 -0
  23. data/bin/sidekiqload +149 -0
  24. data/cleaner/assets/images/favicon.ico +0 -0
  25. data/cleaner/assets/images/logo.png +0 -0
  26. data/cleaner/assets/images/status.png +0 -0
  27. data/cleaner/assets/javascripts/application.js +172 -0
  28. data/cleaner/assets/javascripts/dashboard.js +315 -0
  29. data/cleaner/assets/stylesheets/application-rtl.css +246 -0
  30. data/cleaner/assets/stylesheets/application.css +1144 -0
  31. data/cleaner/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  32. data/cleaner/assets/stylesheets/bootstrap.css +5 -0
  33. data/cleaner/locales/ar.yml +81 -0
  34. data/cleaner/locales/cs.yml +78 -0
  35. data/cleaner/locales/da.yml +68 -0
  36. data/cleaner/locales/de.yml +69 -0
  37. data/cleaner/locales/el.yml +68 -0
  38. data/cleaner/locales/en.yml +81 -0
  39. data/cleaner/locales/es.yml +70 -0
  40. data/cleaner/locales/fa.yml +80 -0
  41. data/cleaner/locales/fr.yml +78 -0
  42. data/cleaner/locales/he.yml +79 -0
  43. data/cleaner/locales/hi.yml +75 -0
  44. data/cleaner/locales/it.yml +69 -0
  45. data/cleaner/locales/ja.yml +80 -0
  46. data/cleaner/locales/ko.yml +68 -0
  47. data/cleaner/locales/nb.yml +77 -0
  48. data/cleaner/locales/nl.yml +68 -0
  49. data/cleaner/locales/pl.yml +59 -0
  50. data/cleaner/locales/pt-br.yml +68 -0
  51. data/cleaner/locales/pt.yml +67 -0
  52. data/cleaner/locales/ru.yml +78 -0
  53. data/cleaner/locales/sv.yml +68 -0
  54. data/cleaner/locales/ta.yml +75 -0
  55. data/cleaner/locales/uk.yml +76 -0
  56. data/cleaner/locales/ur.yml +80 -0
  57. data/cleaner/locales/zh-cn.yml +68 -0
  58. data/cleaner/locales/zh-tw.yml +68 -0
  59. data/cleaner/views/_footer.erb +20 -0
  60. data/cleaner/views/_job_info.erb +88 -0
  61. data/cleaner/views/_nav.erb +52 -0
  62. data/cleaner/views/_paging.erb +23 -0
  63. data/cleaner/views/_poll_link.erb +7 -0
  64. data/cleaner/views/_status.erb +4 -0
  65. data/cleaner/views/_summary.erb +40 -0
  66. data/cleaner/views/busy.erb +98 -0
  67. data/cleaner/views/dashboard.erb +75 -0
  68. data/cleaner/views/dead.erb +34 -0
  69. data/cleaner/views/errors.erb +84 -0
  70. data/cleaner/views/layout.erb +40 -0
  71. data/cleaner/views/morgue.erb +75 -0
  72. data/cleaner/views/queue.erb +46 -0
  73. data/cleaner/views/queues.erb +30 -0
  74. data/cleaner/views/retries.erb +80 -0
  75. data/cleaner/views/retry.erb +34 -0
  76. data/cleaner/views/scheduled.erb +54 -0
  77. data/cleaner/views/scheduled_job_info.erb +8 -0
  78. data/cleaner-stats.png +0 -0
  79. data/cleaner.png +0 -0
  80. data/code_of_conduct.md +50 -0
  81. data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
  82. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
  83. data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
  84. data/lib/generators/sidekiq/worker_generator.rb +49 -0
  85. data/lib/sidekiq/api.rb +940 -0
  86. data/lib/sidekiq/cleaner/action.rb +89 -0
  87. data/lib/sidekiq/cleaner/application.rb +385 -0
  88. data/lib/sidekiq/cleaner/helpers.rb +325 -0
  89. data/lib/sidekiq/cleaner/router.rb +100 -0
  90. data/lib/sidekiq/cleaner.rb +214 -0
  91. data/lib/sidekiq/cli.rb +445 -0
  92. data/lib/sidekiq/client.rb +243 -0
  93. data/lib/sidekiq/core_ext.rb +1 -0
  94. data/lib/sidekiq/ctl.rb +221 -0
  95. data/lib/sidekiq/delay.rb +42 -0
  96. data/lib/sidekiq/exception_handler.rb +29 -0
  97. data/lib/sidekiq/extensions/action_mailer.rb +57 -0
  98. data/lib/sidekiq/extensions/active_record.rb +40 -0
  99. data/lib/sidekiq/extensions/class_methods.rb +40 -0
  100. data/lib/sidekiq/extensions/generic_proxy.rb +31 -0
  101. data/lib/sidekiq/fetch.rb +81 -0
  102. data/lib/sidekiq/job_logger.rb +25 -0
  103. data/lib/sidekiq/job_retry.rb +262 -0
  104. data/lib/sidekiq/launcher.rb +173 -0
  105. data/lib/sidekiq/logging.rb +122 -0
  106. data/lib/sidekiq/manager.rb +137 -0
  107. data/lib/sidekiq/middleware/chain.rb +150 -0
  108. data/lib/sidekiq/middleware/i18n.rb +42 -0
  109. data/lib/sidekiq/middleware/server/active_record.rb +23 -0
  110. data/lib/sidekiq/paginator.rb +43 -0
  111. data/lib/sidekiq/processor.rb +279 -0
  112. data/lib/sidekiq/rails.rb +58 -0
  113. data/lib/sidekiq/redis_connection.rb +144 -0
  114. data/lib/sidekiq/scheduled.rb +174 -0
  115. data/lib/sidekiq/testing/inline.rb +29 -0
  116. data/lib/sidekiq/testing.rb +333 -0
  117. data/lib/sidekiq/util.rb +66 -0
  118. data/lib/sidekiq/version.rb +4 -0
  119. data/lib/sidekiq/worker.rb +220 -0
  120. data/lib/sidekiq.rb +237 -0
  121. data/sidekiq_cleaner.gemspec +21 -0
  122. 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
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.warning = true
6
+ test.pattern = 'test/**/test_*.rb'
7
+ end
8
+
9
+ task default: :test
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