sidekiq 3.5.4 → 5.2.7

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 (175) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +61 -0
  3. data/{Contributing.md → .github/contributing.md} +0 -0
  4. data/.github/issue_template.md +11 -0
  5. data/.gitignore +3 -0
  6. data/.travis.yml +5 -10
  7. data/4.0-Upgrade.md +53 -0
  8. data/5.0-Upgrade.md +56 -0
  9. data/COMM-LICENSE +13 -11
  10. data/Changes.md +376 -1
  11. data/Ent-Changes.md +201 -2
  12. data/Gemfile +14 -18
  13. data/LICENSE +1 -1
  14. data/Pro-3.0-Upgrade.md +44 -0
  15. data/Pro-4.0-Upgrade.md +35 -0
  16. data/Pro-Changes.md +307 -2
  17. data/README.md +34 -22
  18. data/Rakefile +3 -3
  19. data/bin/sidekiq +0 -1
  20. data/bin/sidekiqctl +13 -86
  21. data/bin/sidekiqload +23 -27
  22. data/code_of_conduct.md +50 -0
  23. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +3 -3
  24. data/lib/generators/sidekiq/templates/worker_test.rb.erb +6 -6
  25. data/lib/sidekiq.rb +72 -25
  26. data/lib/sidekiq/api.rb +206 -73
  27. data/lib/sidekiq/cli.rb +145 -101
  28. data/lib/sidekiq/client.rb +42 -36
  29. data/lib/sidekiq/core_ext.rb +1 -105
  30. data/lib/sidekiq/ctl.rb +221 -0
  31. data/lib/sidekiq/delay.rb +42 -0
  32. data/lib/sidekiq/exception_handler.rb +4 -5
  33. data/lib/sidekiq/extensions/action_mailer.rb +1 -0
  34. data/lib/sidekiq/extensions/active_record.rb +1 -0
  35. data/lib/sidekiq/extensions/class_methods.rb +1 -0
  36. data/lib/sidekiq/extensions/generic_proxy.rb +8 -1
  37. data/lib/sidekiq/fetch.rb +36 -111
  38. data/lib/sidekiq/job_logger.rb +25 -0
  39. data/lib/sidekiq/job_retry.rb +262 -0
  40. data/lib/sidekiq/launcher.rb +129 -55
  41. data/lib/sidekiq/logging.rb +21 -3
  42. data/lib/sidekiq/manager.rb +83 -182
  43. data/lib/sidekiq/middleware/chain.rb +1 -0
  44. data/lib/sidekiq/middleware/i18n.rb +1 -0
  45. data/lib/sidekiq/middleware/server/active_record.rb +10 -0
  46. data/lib/sidekiq/paginator.rb +1 -0
  47. data/lib/sidekiq/processor.rb +221 -103
  48. data/lib/sidekiq/rails.rb +47 -27
  49. data/lib/sidekiq/redis_connection.rb +74 -7
  50. data/lib/sidekiq/scheduled.rb +87 -28
  51. data/lib/sidekiq/testing.rb +150 -19
  52. data/lib/sidekiq/testing/inline.rb +1 -0
  53. data/lib/sidekiq/util.rb +15 -17
  54. data/lib/sidekiq/version.rb +2 -1
  55. data/lib/sidekiq/web.rb +120 -184
  56. data/lib/sidekiq/web/action.rb +89 -0
  57. data/lib/sidekiq/web/application.rb +353 -0
  58. data/lib/sidekiq/{web_helpers.rb → web/helpers.rb} +123 -47
  59. data/lib/sidekiq/web/router.rb +100 -0
  60. data/lib/sidekiq/worker.rb +135 -18
  61. data/sidekiq.gemspec +8 -14
  62. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  63. data/web/assets/javascripts/application.js +24 -20
  64. data/web/assets/javascripts/dashboard.js +33 -18
  65. data/web/assets/stylesheets/application-rtl.css +246 -0
  66. data/web/assets/stylesheets/application.css +401 -7
  67. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  68. data/web/assets/stylesheets/bootstrap.css +4 -8
  69. data/web/locales/ar.yml +81 -0
  70. data/web/locales/cs.yml +11 -1
  71. data/web/locales/de.yml +1 -1
  72. data/web/locales/en.yml +4 -0
  73. data/web/locales/es.yml +4 -3
  74. data/web/locales/fa.yml +80 -0
  75. data/web/locales/fr.yml +21 -12
  76. data/web/locales/he.yml +79 -0
  77. data/web/locales/ja.yml +24 -13
  78. data/web/locales/ru.yml +3 -0
  79. data/web/locales/ur.yml +80 -0
  80. data/web/views/_footer.erb +7 -9
  81. data/web/views/_job_info.erb +5 -1
  82. data/web/views/_nav.erb +5 -19
  83. data/web/views/_paging.erb +1 -1
  84. data/web/views/busy.erb +18 -9
  85. data/web/views/dashboard.erb +5 -5
  86. data/web/views/dead.erb +1 -1
  87. data/web/views/layout.erb +13 -5
  88. data/web/views/morgue.erb +16 -12
  89. data/web/views/queue.erb +12 -11
  90. data/web/views/queues.erb +5 -3
  91. data/web/views/retries.erb +19 -13
  92. data/web/views/retry.erb +2 -2
  93. data/web/views/scheduled.erb +4 -4
  94. data/web/views/scheduled_job_info.erb +1 -1
  95. metadata +45 -227
  96. data/lib/sidekiq/actor.rb +0 -39
  97. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  98. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  99. data/test/config.yml +0 -9
  100. data/test/env_based_config.yml +0 -11
  101. data/test/fake_env.rb +0 -0
  102. data/test/fixtures/en.yml +0 -2
  103. data/test/helper.rb +0 -49
  104. data/test/test_api.rb +0 -493
  105. data/test/test_cli.rb +0 -335
  106. data/test/test_client.rb +0 -194
  107. data/test/test_exception_handler.rb +0 -55
  108. data/test/test_extensions.rb +0 -126
  109. data/test/test_fetch.rb +0 -104
  110. data/test/test_logging.rb +0 -34
  111. data/test/test_manager.rb +0 -168
  112. data/test/test_middleware.rb +0 -159
  113. data/test/test_processor.rb +0 -237
  114. data/test/test_rails.rb +0 -21
  115. data/test/test_redis_connection.rb +0 -126
  116. data/test/test_retry.rb +0 -325
  117. data/test/test_scheduled.rb +0 -114
  118. data/test/test_scheduling.rb +0 -49
  119. data/test/test_sidekiq.rb +0 -99
  120. data/test/test_testing.rb +0 -142
  121. data/test/test_testing_fake.rb +0 -268
  122. data/test/test_testing_inline.rb +0 -93
  123. data/test/test_util.rb +0 -16
  124. data/test/test_web.rb +0 -608
  125. data/test/test_web_helpers.rb +0 -53
  126. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  127. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  128. data/web/assets/images/status/active.png +0 -0
  129. data/web/assets/images/status/idle.png +0 -0
  130. data/web/assets/javascripts/locales/README.md +0 -27
  131. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  132. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  133. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  134. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  135. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  136. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  137. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  138. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  139. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  140. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  141. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  142. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  143. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  144. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  145. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  146. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  147. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  148. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  149. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  150. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  151. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  152. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  153. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  154. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  155. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  156. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  157. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  158. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  159. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  160. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  161. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  162. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  163. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  164. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  165. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  166. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  167. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  168. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  169. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  170. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  171. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  172. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  173. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  174. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  175. data/web/views/_poll_js.erb +0 -5
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'sidekiq/testing'
2
3
 
3
4
  ##
@@ -1,7 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  require 'socket'
2
3
  require 'securerandom'
3
4
  require 'sidekiq/exception_handler'
4
- require 'sidekiq/core_ext'
5
5
 
6
6
  module Sidekiq
7
7
  ##
@@ -19,6 +19,13 @@ module Sidekiq
19
19
  raise ex
20
20
  end
21
21
 
22
+ def safe_thread(name, &block)
23
+ Thread.new do
24
+ Thread.current['sidekiq_label'] = name
25
+ watchdog(name, &block)
26
+ end
27
+ end
28
+
22
29
  def logger
23
30
  Sidekiq.logger
24
31
  end
@@ -39,30 +46,21 @@ module Sidekiq
39
46
  @@identity ||= "#{hostname}:#{$$}:#{process_nonce}"
40
47
  end
41
48
 
42
- def fire_event(event, reverse=false)
49
+ def fire_event(event, options={})
50
+ reverse = options[:reverse]
51
+ reraise = options[:reraise]
52
+
43
53
  arr = Sidekiq.options[:lifecycle_events][event]
44
54
  arr.reverse! if reverse
45
55
  arr.each do |block|
46
56
  begin
47
57
  block.call
48
58
  rescue => ex
49
- handle_exception(ex, { event: event })
59
+ handle_exception(ex, { context: "Exception during Sidekiq lifecycle event.", event: event })
60
+ raise ex if reraise
50
61
  end
51
62
  end
63
+ arr.clear
52
64
  end
53
-
54
- def want_a_hertz_donut?
55
- # what's a hertz donut?
56
- # punch! Hurts, don't it?
57
- info = Sidekiq.redis {|c| c.info }
58
- if info['connected_clients'].to_i > 1000 && info['hz'].to_i >= 10
59
- Sidekiq.logger.warn { "Your Redis `hz` setting is too high at #{info['hz']}. See mperham/sidekiq#2431. Set it to 3 in #{info[:config_file]}" }
60
- true
61
- else
62
- Sidekiq.logger.debug { "Redis hz: #{info['hz']}. Client count: #{info['connected_clients']}" }
63
- false
64
- end
65
- end
66
-
67
65
  end
68
66
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Sidekiq
2
- VERSION = "3.5.4"
3
+ VERSION = "5.2.7"
3
4
  end
@@ -1,25 +1,28 @@
1
+ # frozen_string_literal: true
1
2
  require 'erb'
2
- require 'yaml'
3
- require 'sinatra/base'
4
3
 
5
4
  require 'sidekiq'
6
5
  require 'sidekiq/api'
7
6
  require 'sidekiq/paginator'
8
- require 'sidekiq/web_helpers'
7
+ require 'sidekiq/web/helpers'
9
8
 
10
- module Sidekiq
11
- class Web < Sinatra::Base
12
- include Sidekiq::Paginator
9
+ require 'sidekiq/web/router'
10
+ require 'sidekiq/web/action'
11
+ require 'sidekiq/web/application'
13
12
 
14
- enable :sessions
15
- use Rack::Protection, :use => :authenticity_token unless ENV['RACK_ENV'] == 'test'
13
+ require 'rack/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/builder'
16
+ require 'rack/file'
17
+ require 'rack/session/cookie'
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
28
  "Dashboard" => '',
@@ -31,6 +34,18 @@ module Sidekiq
31
34
  }
32
35
 
33
36
  class << self
37
+ def settings
38
+ self
39
+ end
40
+
41
+ def middlewares
42
+ @middlewares ||= []
43
+ end
44
+
45
+ def use(*middleware_args, &block)
46
+ middlewares << [middleware_args, block]
47
+ end
48
+
34
49
  def default_tabs
35
50
  DEFAULT_TABS
36
51
  end
@@ -40,234 +55,155 @@ module Sidekiq
40
55
  end
41
56
  alias_method :tabs, :custom_tabs
42
57
 
43
- attr_accessor :app_url
44
- end
58
+ def locales
59
+ @locales ||= LOCALES
60
+ end
45
61
 
46
- get "/busy" do
47
- erb :busy
48
- end
62
+ def views
63
+ @views ||= VIEWS
64
+ end
49
65
 
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
66
+ def enable(*opts)
67
+ opts.each {|key| set(key, true) }
60
68
  end
61
- redirect "#{root_path}busy"
62
- end
63
69
 
64
- get "/queues" do
65
- @queues = Sidekiq::Queue.all
66
- erb :queues
67
- end
70
+ def disable(*opts)
71
+ opts.each {|key| set(key, false) }
72
+ end
68
73
 
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
74
+ # Helper for the Sinatra syntax: Sidekiq::Web.set(:session_secret, Rails.application.secrets...)
75
+ def set(attribute, value)
76
+ send(:"#{attribute}=", value)
77
+ end
78
78
 
79
- post "/queues/:name" do
80
- Sidekiq::Queue.new(params[:name]).clear
81
- redirect "#{root_path}queues"
79
+ attr_accessor :app_url, :session_secret, :redis_pool, :sessions
80
+ attr_writer :locales, :views
82
81
  end
83
82
 
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]}")
83
+ def self.inherited(child)
84
+ child.app_url = self.app_url
85
+ child.session_secret = self.session_secret
86
+ child.redis_pool = self.redis_pool
87
+ child.sessions = self.sessions
87
88
  end
88
89
 
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
90
+ def settings
91
+ self.class.settings
94
92
  end
95
93
 
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
94
+ def use(*middleware_args, &block)
95
+ middlewares << [middleware_args, block]
101
96
  end
102
97
 
103
- post '/morgue' do
104
- redirect request.path unless params['key']
105
-
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
109
- end
110
- redirect_with_query("#{root_path}morgue")
98
+ def middlewares
99
+ @middlewares ||= Web.middlewares.dup
111
100
  end
112
101
 
113
- post "/morgue/all/delete" do
114
- Sidekiq::DeadSet.new.clear
115
- redirect "#{root_path}morgue"
102
+ def call(env)
103
+ app.call(env)
116
104
  end
117
105
 
118
- post "/morgue/all/retry" do
119
- Sidekiq::DeadSet.new.retry_all
120
- redirect "#{root_path}morgue"
106
+ def self.call(env)
107
+ @app ||= new
108
+ @app.call(env)
121
109
  end
122
110
 
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")
111
+ def app
112
+ @app ||= build
128
113
  end
129
114
 
130
-
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
115
+ def enable(*opts)
116
+ opts.each {|key| set(key, true) }
136
117
  end
137
118
 
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
119
+ def disable(*opts)
120
+ opts.each {|key| set(key, false) }
142
121
  end
143
122
 
144
- post '/retries' do
145
- redirect request.path unless params['key']
146
-
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
150
- end
151
- redirect_with_query("#{root_path}retries")
123
+ def set(attribute, value)
124
+ send(:"#{attribute}=", value)
152
125
  end
153
126
 
154
- post "/retries/all/delete" do
155
- Sidekiq::RetrySet.new.clear
156
- redirect "#{root_path}retries"
157
- end
127
+ # Default values
128
+ set :sessions, true
158
129
 
159
- post "/retries/all/retry" do
160
- Sidekiq::RetrySet.new.retry_all
161
- redirect "#{root_path}retries"
162
- end
130
+ attr_writer :sessions
163
131
 
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")
168
- end
132
+ def sessions
133
+ unless instance_variable_defined?("@sessions")
134
+ @sessions = self.class.sessions
135
+ @sessions = @sessions.to_hash.dup if @sessions.respond_to?(:to_hash)
136
+ end
169
137
 
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
138
+ @sessions
175
139
  end
176
140
 
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
141
+ def self.register(extension)
142
+ extension.registered(WebApplication)
181
143
  end
182
144
 
183
- post '/scheduled' do
184
- redirect request.path unless params['key']
145
+ private
185
146
 
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
147
+ def using?(middleware)
148
+ middlewares.any? do |(m,_)|
149
+ m.kind_of?(Array) && (m[0] == middleware || m[0].kind_of?(middleware))
189
150
  end
190
- redirect_with_query("#{root_path}scheduled")
191
151
  end
192
152
 
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")
198
- end
153
+ def build_sessions
154
+ middlewares = self.middlewares
199
155
 
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
206
- end
156
+ unless using?(::Rack::Protection) || ENV['RACK_ENV'] == 'test'
157
+ middlewares.unshift [[::Rack::Protection, { use: :authenticity_token }], nil]
158
+ end
207
159
 
208
- REDIS_KEYS = %w(redis_version uptime_in_days connected_clients used_memory_human used_memory_peak_human)
160
+ s = sessions
161
+ return unless s
209
162
 
210
- get '/dashboard/stats' do
211
- redirect "#{root_path}stats"
212
- end
163
+ unless using? ::Rack::Session::Cookie
164
+ unless secret = Web.session_secret
165
+ require 'securerandom'
166
+ secret = SecureRandom.hex(64)
167
+ end
168
+
169
+ options = { secret: secret }
170
+ options = options.merge(s.to_hash) if s.respond_to? :to_hash
213
171
 
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
- )
172
+ middlewares.unshift [[::Rack::Session::Cookie, options], nil]
173
+ end
233
174
  end
234
175
 
235
- get '/stats/queues' do
236
- queue_stats = Sidekiq::Stats::Queues.new
176
+ def build
177
+ build_sessions
237
178
 
238
- content_type :json
239
- Sidekiq.dump_json(
240
- queue_stats.lengths
241
- )
242
- end
179
+ middlewares = self.middlewares
180
+ klass = self.class
243
181
 
244
- private
182
+ ::Rack::Builder.new do
183
+ %w(stylesheets javascripts images).each do |asset_dir|
184
+ map "/#{asset_dir}" do
185
+ run ::Rack::File.new("#{ASSETS}/#{asset_dir}", { 'Cache-Control' => 'public, max-age=86400' })
186
+ end
187
+ end
245
188
 
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
189
+ middlewares.each {|middleware, block| use(*middleware, &block) }
255
190
 
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
191
+ run WebApplication.new(klass)
261
192
  end
262
193
  end
263
194
  end
195
+
196
+ Sidekiq::WebApplication.helpers WebHelpers
197
+ Sidekiq::WebApplication.helpers Sidekiq::Paginator
198
+
199
+ Sidekiq::WebAction.class_eval "def _render\n#{ERB.new(File.read(Web::LAYOUT)).src}\nend"
264
200
  end
265
201
 
266
202
  if defined?(::ActionDispatch::Request::Session) &&
267
- !::ActionDispatch::Request::Session.respond_to?(:each)
203
+ !::ActionDispatch::Request::Session.method_defined?(:each)
268
204
  # mperham/sidekiq#2460
269
205
  # Rack apps can't reuse the Rails session store without
270
- # this monkeypatch
206
+ # this monkeypatch, fixed in Rails 5.
271
207
  class ActionDispatch::Request::Session
272
208
  def each(&block)
273
209
  hash = self.to_hash