sidekiq 3.5.4 → 7.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (228) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +992 -6
  3. data/LICENSE.txt +9 -0
  4. data/README.md +52 -43
  5. data/bin/sidekiq +22 -4
  6. data/bin/sidekiqload +209 -115
  7. data/bin/sidekiqmon +11 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +633 -295
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +270 -248
  15. data/lib/sidekiq/client.rb +139 -108
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +287 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +53 -121
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +51 -0
  23. data/lib/sidekiq/job_retry.rb +301 -0
  24. data/lib/sidekiq/job_util.rb +107 -0
  25. data/lib/sidekiq/launcher.rb +241 -69
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +88 -190
  28. data/lib/sidekiq/metrics/query.rb +155 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +114 -56
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +8 -7
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +29 -16
  37. data/lib/sidekiq/processor.rb +238 -118
  38. data/lib/sidekiq/rails.rb +57 -27
  39. data/lib/sidekiq/redis_client_adapter.rb +111 -0
  40. data/lib/sidekiq/redis_connection.rb +49 -50
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +173 -52
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +7 -5
  46. data/lib/sidekiq/testing.rb +197 -65
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +4 -1
  49. data/lib/sidekiq/web/action.rb +93 -0
  50. data/lib/sidekiq/web/application.rb +463 -0
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +364 -0
  53. data/lib/sidekiq/web/router.rb +104 -0
  54. data/lib/sidekiq/web.rb +113 -216
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +99 -142
  57. data/sidekiq.gemspec +26 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/javascripts/application.js +163 -74
  60. data/web/assets/javascripts/base-charts.js +106 -0
  61. data/web/assets/javascripts/chart.min.js +13 -0
  62. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  63. data/web/assets/javascripts/dashboard-charts.js +182 -0
  64. data/web/assets/javascripts/dashboard.js +37 -280
  65. data/web/assets/javascripts/metrics.js +298 -0
  66. data/web/assets/stylesheets/application-dark.css +147 -0
  67. data/web/assets/stylesheets/application-rtl.css +153 -0
  68. data/web/assets/stylesheets/application.css +181 -198
  69. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  70. data/web/assets/stylesheets/bootstrap.css +4 -8
  71. data/web/locales/ar.yml +87 -0
  72. data/web/locales/cs.yml +62 -52
  73. data/web/locales/da.yml +60 -53
  74. data/web/locales/de.yml +65 -53
  75. data/web/locales/el.yml +43 -24
  76. data/web/locales/en.yml +86 -62
  77. data/web/locales/es.yml +70 -53
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +86 -56
  80. data/web/locales/gd.yml +99 -0
  81. data/web/locales/he.yml +80 -0
  82. data/web/locales/hi.yml +59 -59
  83. data/web/locales/it.yml +53 -53
  84. data/web/locales/ja.yml +78 -56
  85. data/web/locales/ko.yml +52 -52
  86. data/web/locales/lt.yml +83 -0
  87. data/web/locales/nb.yml +61 -61
  88. data/web/locales/nl.yml +52 -52
  89. data/web/locales/pl.yml +45 -45
  90. data/web/locales/pt-br.yml +83 -55
  91. data/web/locales/pt.yml +51 -51
  92. data/web/locales/ru.yml +68 -60
  93. data/web/locales/sv.yml +53 -53
  94. data/web/locales/ta.yml +60 -60
  95. data/web/locales/uk.yml +62 -61
  96. data/web/locales/ur.yml +80 -0
  97. data/web/locales/vi.yml +83 -0
  98. data/web/locales/zh-cn.yml +43 -16
  99. data/web/locales/zh-tw.yml +42 -8
  100. data/web/views/_footer.erb +10 -9
  101. data/web/views/_job_info.erb +26 -5
  102. data/web/views/_metrics_period_select.erb +12 -0
  103. data/web/views/_nav.erb +6 -20
  104. data/web/views/_paging.erb +3 -1
  105. data/web/views/_poll_link.erb +3 -6
  106. data/web/views/_summary.erb +7 -7
  107. data/web/views/busy.erb +87 -28
  108. data/web/views/dashboard.erb +51 -21
  109. data/web/views/dead.erb +4 -4
  110. data/web/views/filtering.erb +7 -0
  111. data/web/views/layout.erb +15 -5
  112. data/web/views/metrics.erb +91 -0
  113. data/web/views/metrics_for_job.erb +59 -0
  114. data/web/views/morgue.erb +25 -22
  115. data/web/views/queue.erb +35 -25
  116. data/web/views/queues.erb +23 -7
  117. data/web/views/retries.erb +28 -23
  118. data/web/views/retry.erb +5 -5
  119. data/web/views/scheduled.erb +19 -17
  120. data/web/views/scheduled_job_info.erb +1 -1
  121. metadata +86 -268
  122. data/.gitignore +0 -12
  123. data/.travis.yml +0 -16
  124. data/3.0-Upgrade.md +0 -70
  125. data/COMM-LICENSE +0 -95
  126. data/Contributing.md +0 -32
  127. data/Ent-Changes.md +0 -39
  128. data/Gemfile +0 -27
  129. data/LICENSE +0 -9
  130. data/Pro-2.0-Upgrade.md +0 -138
  131. data/Pro-Changes.md +0 -454
  132. data/Rakefile +0 -9
  133. data/bin/sidekiqctl +0 -93
  134. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  135. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  136. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  137. data/lib/sidekiq/actor.rb +0 -39
  138. data/lib/sidekiq/core_ext.rb +0 -105
  139. data/lib/sidekiq/exception_handler.rb +0 -30
  140. data/lib/sidekiq/extensions/action_mailer.rb +0 -56
  141. data/lib/sidekiq/extensions/active_record.rb +0 -39
  142. data/lib/sidekiq/extensions/class_methods.rb +0 -39
  143. data/lib/sidekiq/extensions/generic_proxy.rb +0 -24
  144. data/lib/sidekiq/logging.rb +0 -104
  145. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  146. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  147. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  148. data/lib/sidekiq/util.rb +0 -68
  149. data/lib/sidekiq/web_helpers.rb +0 -249
  150. data/lib/sidekiq/worker.rb +0 -103
  151. data/test/config.yml +0 -9
  152. data/test/env_based_config.yml +0 -11
  153. data/test/fake_env.rb +0 -0
  154. data/test/fixtures/en.yml +0 -2
  155. data/test/helper.rb +0 -49
  156. data/test/test_api.rb +0 -493
  157. data/test/test_cli.rb +0 -335
  158. data/test/test_client.rb +0 -194
  159. data/test/test_exception_handler.rb +0 -55
  160. data/test/test_extensions.rb +0 -126
  161. data/test/test_fetch.rb +0 -104
  162. data/test/test_logging.rb +0 -34
  163. data/test/test_manager.rb +0 -168
  164. data/test/test_middleware.rb +0 -159
  165. data/test/test_processor.rb +0 -237
  166. data/test/test_rails.rb +0 -21
  167. data/test/test_redis_connection.rb +0 -126
  168. data/test/test_retry.rb +0 -325
  169. data/test/test_scheduled.rb +0 -114
  170. data/test/test_scheduling.rb +0 -49
  171. data/test/test_sidekiq.rb +0 -99
  172. data/test/test_testing.rb +0 -142
  173. data/test/test_testing_fake.rb +0 -268
  174. data/test/test_testing_inline.rb +0 -93
  175. data/test/test_util.rb +0 -16
  176. data/test/test_web.rb +0 -608
  177. data/test/test_web_helpers.rb +0 -53
  178. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  179. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  180. data/web/assets/images/status/active.png +0 -0
  181. data/web/assets/images/status/idle.png +0 -0
  182. data/web/assets/javascripts/locales/README.md +0 -27
  183. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  184. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  185. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  186. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  188. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  189. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  192. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  193. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  194. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  195. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  196. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  197. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  198. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  199. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  200. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  201. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  202. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  203. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  204. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  206. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  207. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  208. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  209. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  210. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  211. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  212. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  213. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  214. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  215. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  216. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  217. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  218. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  219. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  220. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  221. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  222. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  223. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  224. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  225. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  226. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  227. data/web/views/_poll_js.erb +0 -5
  228. /data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
data/lib/sidekiq/web.rb CHANGED
@@ -1,36 +1,56 @@
1
- require 'erb'
2
- require 'yaml'
3
- require 'sinatra/base'
1
+ # frozen_string_literal: true
4
2
 
5
- require 'sidekiq'
6
- require 'sidekiq/api'
7
- require 'sidekiq/paginator'
8
- require 'sidekiq/web_helpers'
3
+ require "erb"
9
4
 
10
- module Sidekiq
11
- class Web < Sinatra::Base
12
- include Sidekiq::Paginator
5
+ require "sidekiq"
6
+ require "sidekiq/api"
7
+ require "sidekiq/paginator"
8
+ require "sidekiq/web/helpers"
13
9
 
14
- enable :sessions
15
- use Rack::Protection, :use => :authenticity_token unless ENV['RACK_ENV'] == 'test'
10
+ require "sidekiq/web/router"
11
+ require "sidekiq/web/action"
12
+ require "sidekiq/web/application"
13
+ require "sidekiq/web/csrf_protection"
16
14
 
17
- set :root, File.expand_path(File.dirname(__FILE__) + "/../../web")
18
- set :public_folder, proc { "#{root}/assets" }
19
- set :views, proc { "#{root}/views" }
20
- set :locales, ["#{root}/locales"]
15
+ require "rack/content_length"
16
+ require "rack/builder"
17
+ require "rack/static"
21
18
 
22
- helpers WebHelpers
19
+ module Sidekiq
20
+ class Web
21
+ ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../web")
22
+ VIEWS = "#{ROOT}/views"
23
+ LOCALES = ["#{ROOT}/locales"]
24
+ LAYOUT = "#{VIEWS}/layout.erb"
25
+ ASSETS = "#{ROOT}/assets"
23
26
 
24
27
  DEFAULT_TABS = {
25
- "Dashboard" => '',
26
- "Busy" => 'busy',
27
- "Queues" => 'queues',
28
- "Retries" => 'retries',
29
- "Scheduled" => 'scheduled',
30
- "Dead" => 'morgue',
28
+ "Dashboard" => "",
29
+ "Busy" => "busy",
30
+ "Queues" => "queues",
31
+ "Retries" => "retries",
32
+ "Scheduled" => "scheduled",
33
+ "Dead" => "morgue",
34
+ "Metrics" => "metrics"
31
35
  }
32
36
 
37
+ if Gem::Version.new(Rack::RELEASE) < Gem::Version.new("3")
38
+ CONTENT_LANGUAGE = "Content-Language"
39
+ CONTENT_SECURITY_POLICY = "Content-Security-Policy"
40
+ LOCATION = "Location"
41
+ X_CASCADE = "X-Cascade"
42
+ else
43
+ CONTENT_LANGUAGE = "content-language"
44
+ CONTENT_SECURITY_POLICY = "content-security-policy"
45
+ LOCATION = "location"
46
+ X_CASCADE = "x-cascade"
47
+ end
48
+
33
49
  class << self
50
+ def settings
51
+ self
52
+ end
53
+
34
54
  def default_tabs
35
55
  DEFAULT_TABS
36
56
  end
@@ -40,238 +60,115 @@ module Sidekiq
40
60
  end
41
61
  alias_method :tabs, :custom_tabs
42
62
 
43
- attr_accessor :app_url
44
- end
45
-
46
- get "/busy" do
47
- erb :busy
48
- end
49
-
50
- post "/busy" do
51
- if params['identity']
52
- p = Sidekiq::Process.new('identity' => params['identity'])
53
- p.quiet! if params[:quiet]
54
- p.stop! if params[:stop]
55
- else
56
- processes.each do |pro|
57
- pro.quiet! if params[:quiet]
58
- pro.stop! if params[:stop]
59
- end
63
+ def custom_job_info_rows
64
+ @custom_job_info_rows ||= []
60
65
  end
61
- redirect "#{root_path}busy"
62
- end
63
-
64
- get "/queues" do
65
- @queues = Sidekiq::Queue.all
66
- erb :queues
67
- end
68
-
69
- get "/queues/:name" do
70
- halt 404 unless params[:name]
71
- @count = (params[:count] || 25).to_i
72
- @name = params[:name]
73
- @queue = Sidekiq::Queue.new(@name)
74
- (@current_page, @total_size, @messages) = page("queue:#{@name}", params[:page], @count)
75
- @messages = @messages.map { |msg| Sidekiq::Job.new(msg, @name) }
76
- erb :queue
77
- end
78
-
79
- post "/queues/:name" do
80
- Sidekiq::Queue.new(params[:name]).clear
81
- redirect "#{root_path}queues"
82
- end
83
-
84
- post "/queues/:name/delete" do
85
- Sidekiq::Job.new(params[:key_val], params[:name]).delete
86
- redirect_with_query("#{root_path}queues/#{params[:name]}")
87
- end
88
-
89
- get '/morgue' do
90
- @count = (params[:count] || 25).to_i
91
- (@current_page, @total_size, @dead) = page("dead", params[:page], @count, reverse: true)
92
- @dead = @dead.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
93
- erb :morgue
94
- end
95
-
96
- get "/morgue/:key" do
97
- halt 404 unless params['key']
98
- @dead = Sidekiq::DeadSet.new.fetch(*parse_params(params['key'])).first
99
- redirect "#{root_path}morgue" if @dead.nil?
100
- erb :dead
101
- end
102
-
103
- post '/morgue' do
104
- redirect request.path unless params['key']
105
66
 
106
- params['key'].each do |key|
107
- job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
108
- retry_or_delete_or_kill job, params if job
67
+ def locales
68
+ @locales ||= LOCALES
109
69
  end
110
- redirect_with_query("#{root_path}morgue")
111
- end
112
-
113
- post "/morgue/all/delete" do
114
- Sidekiq::DeadSet.new.clear
115
- redirect "#{root_path}morgue"
116
- end
117
70
 
118
- post "/morgue/all/retry" do
119
- Sidekiq::DeadSet.new.retry_all
120
- redirect "#{root_path}morgue"
121
- end
122
-
123
- post "/morgue/:key" do
124
- halt 404 unless params['key']
125
- job = Sidekiq::DeadSet.new.fetch(*parse_params(params['key'])).first
126
- retry_or_delete_or_kill job, params if job
127
- redirect_with_query("#{root_path}morgue")
128
- end
71
+ def views
72
+ @views ||= VIEWS
73
+ end
129
74
 
75
+ def enable(*opts)
76
+ opts.each { |key| set(key, true) }
77
+ end
130
78
 
131
- get '/retries' do
132
- @count = (params[:count] || 25).to_i
133
- (@current_page, @total_size, @retries) = page("retry", params[:page], @count)
134
- @retries = @retries.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
135
- erb :retries
136
- end
79
+ def disable(*opts)
80
+ opts.each { |key| set(key, false) }
81
+ end
137
82
 
138
- get "/retries/:key" do
139
- @retry = Sidekiq::RetrySet.new.fetch(*parse_params(params['key'])).first
140
- redirect "#{root_path}retries" if @retry.nil?
141
- erb :retry
142
- end
83
+ def middlewares
84
+ @middlewares ||= []
85
+ end
143
86
 
144
- post '/retries' do
145
- redirect request.path unless params['key']
87
+ def use(*args, &block)
88
+ middlewares << [args, block]
89
+ end
146
90
 
147
- params['key'].each do |key|
148
- job = Sidekiq::RetrySet.new.fetch(*parse_params(key)).first
149
- retry_or_delete_or_kill job, params if job
91
+ def set(attribute, value)
92
+ send(:"#{attribute}=", value)
150
93
  end
151
- redirect_with_query("#{root_path}retries")
152
- end
153
94
 
154
- post "/retries/all/delete" do
155
- Sidekiq::RetrySet.new.clear
156
- redirect "#{root_path}retries"
95
+ attr_accessor :app_url, :redis_pool
96
+ attr_writer :locales, :views
157
97
  end
158
98
 
159
- post "/retries/all/retry" do
160
- Sidekiq::RetrySet.new.retry_all
161
- redirect "#{root_path}retries"
99
+ def self.inherited(child)
100
+ child.app_url = app_url
101
+ child.redis_pool = redis_pool
162
102
  end
163
103
 
164
- post "/retries/:key" do
165
- job = Sidekiq::RetrySet.new.fetch(*parse_params(params['key'])).first
166
- retry_or_delete_or_kill job, params if job
167
- redirect_with_query("#{root_path}retries")
104
+ def settings
105
+ self.class.settings
168
106
  end
169
107
 
170
- get '/scheduled' do
171
- @count = (params[:count] || 25).to_i
172
- (@current_page, @total_size, @scheduled) = page("schedule", params[:page], @count)
173
- @scheduled = @scheduled.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
174
- erb :scheduled
108
+ def middlewares
109
+ @middlewares ||= self.class.middlewares
175
110
  end
176
111
 
177
- get "/scheduled/:key" do
178
- @job = Sidekiq::ScheduledSet.new.fetch(*parse_params(params['key'])).first
179
- redirect "#{root_path}scheduled" if @job.nil?
180
- erb :scheduled_job_info
112
+ def use(*args, &block)
113
+ middlewares << [args, block]
181
114
  end
182
115
 
183
- post '/scheduled' do
184
- redirect request.path unless params['key']
185
-
186
- params['key'].each do |key|
187
- job = Sidekiq::ScheduledSet.new.fetch(*parse_params(key)).first
188
- delete_or_add_queue job, params if job
189
- end
190
- redirect_with_query("#{root_path}scheduled")
116
+ def call(env)
117
+ app.call(env)
191
118
  end
192
119
 
193
- post "/scheduled/:key" do
194
- halt 404 unless params['key']
195
- job = Sidekiq::ScheduledSet.new.fetch(*parse_params(params['key'])).first
196
- delete_or_add_queue job, params if job
197
- redirect_with_query("#{root_path}scheduled")
120
+ def self.call(env)
121
+ @app ||= new
122
+ @app.call(env)
198
123
  end
199
124
 
200
- get '/' do
201
- @redis_info = redis_info.select{ |k, v| REDIS_KEYS.include? k }
202
- stats_history = Sidekiq::Stats::History.new((params[:days] || 30).to_i)
203
- @processed_history = stats_history.processed
204
- @failed_history = stats_history.failed
205
- erb :dashboard
125
+ def app
126
+ @app ||= build
206
127
  end
207
128
 
208
- REDIS_KEYS = %w(redis_version uptime_in_days connected_clients used_memory_human used_memory_peak_human)
209
-
210
- get '/dashboard/stats' do
211
- redirect "#{root_path}stats"
129
+ def enable(*opts)
130
+ opts.each { |key| set(key, true) }
212
131
  end
213
132
 
214
- get '/stats' do
215
- sidekiq_stats = Sidekiq::Stats.new
216
- redis_stats = redis_info.select { |k, v| REDIS_KEYS.include? k }
217
-
218
- content_type :json
219
- Sidekiq.dump_json(
220
- sidekiq: {
221
- processed: sidekiq_stats.processed,
222
- failed: sidekiq_stats.failed,
223
- busy: sidekiq_stats.workers_size,
224
- processes: sidekiq_stats.processes_size,
225
- enqueued: sidekiq_stats.enqueued,
226
- scheduled: sidekiq_stats.scheduled_size,
227
- retries: sidekiq_stats.retry_size,
228
- dead: sidekiq_stats.dead_size,
229
- default_latency: sidekiq_stats.default_queue_latency
230
- },
231
- redis: redis_stats
232
- )
133
+ def disable(*opts)
134
+ opts.each { |key| set(key, false) }
233
135
  end
234
136
 
235
- get '/stats/queues' do
236
- queue_stats = Sidekiq::Stats::Queues.new
137
+ def set(attribute, value)
138
+ send(:"#{attribute}=", value)
139
+ end
237
140
 
238
- content_type :json
239
- Sidekiq.dump_json(
240
- queue_stats.lengths
241
- )
141
+ def self.register(extension)
142
+ extension.registered(WebApplication)
242
143
  end
243
144
 
244
145
  private
245
146
 
246
- def retry_or_delete_or_kill job, params
247
- if params['retry']
248
- job.retry
249
- elsif params['delete']
250
- job.delete
251
- elsif params['kill']
252
- job.kill
253
- end
254
- end
255
-
256
- def delete_or_add_queue job, params
257
- if params['delete']
258
- job.delete
259
- elsif params['add_to_queue']
260
- job.add_to_queue
147
+ def build
148
+ klass = self.class
149
+ m = middlewares
150
+
151
+ rules = []
152
+ rules = [[:all, {Rack::CACHE_CONTROL => "private, max-age=86400"}]] unless ENV["SIDEKIQ_WEB_TESTING"]
153
+
154
+ ::Rack::Builder.new do
155
+ use Rack::Static, urls: ["/stylesheets", "/images", "/javascripts"],
156
+ root: ASSETS,
157
+ cascade: true,
158
+ header_rules: rules
159
+ m.each { |middleware, block| use(*middleware, &block) }
160
+ use Sidekiq::Web::CsrfProtection unless $TESTING
161
+ run WebApplication.new(klass)
261
162
  end
262
163
  end
263
164
  end
264
- end
265
165
 
266
- if defined?(::ActionDispatch::Request::Session) &&
267
- !::ActionDispatch::Request::Session.respond_to?(:each)
268
- # mperham/sidekiq#2460
269
- # Rack apps can't reuse the Rails session store without
270
- # this monkeypatch
271
- class ActionDispatch::Request::Session
272
- def each(&block)
273
- hash = self.to_hash
274
- hash.each(&block)
166
+ Sidekiq::WebApplication.helpers WebHelpers
167
+ Sidekiq::WebApplication.helpers Sidekiq::Paginator
168
+
169
+ Sidekiq::WebAction.class_eval <<-RUBY, __FILE__, __LINE__ + 1
170
+ def _render
171
+ #{ERB.new(File.read(Web::LAYOUT)).src}
275
172
  end
276
- end
173
+ RUBY
277
174
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ # Sidekiq::Job is a new alias for Sidekiq::Worker as of Sidekiq 6.3.0.
5
+ # Use `include Sidekiq::Job` rather than `include Sidekiq::Worker`.
6
+ #
7
+ # The term "worker" is too generic and overly confusing, used in several
8
+ # different contexts meaning different things. Many people call a Sidekiq
9
+ # process a "worker". Some people call the thread that executes jobs a
10
+ # "worker". This change brings Sidekiq closer to ActiveJob where your job
11
+ # classes extend ApplicationJob.
12
+ Worker = Job
13
+ end