sidekiq 8.0.8 → 8.0.10
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 +4 -4
- data/Changes.md +23 -0
- data/lib/generators/sidekiq/templates/job.rb.erb +1 -1
- data/lib/sidekiq/api.rb +28 -5
- data/lib/sidekiq/capsule.rb +4 -0
- data/lib/sidekiq/cli.rb +15 -4
- data/lib/sidekiq/config.rb +9 -2
- data/lib/sidekiq/fetch.rb +1 -0
- data/lib/sidekiq/job/iterable.rb +2 -2
- data/lib/sidekiq/job_logger.rb +4 -2
- data/lib/sidekiq/launcher.rb +18 -9
- data/lib/sidekiq/middleware/i18n.rb +2 -0
- data/lib/sidekiq/monitor.rb +4 -8
- data/lib/sidekiq/profiler.rb +1 -0
- data/lib/sidekiq/redis_connection.rb +2 -2
- data/lib/sidekiq/ring_buffer.rb +1 -0
- data/lib/sidekiq/scheduled.rb +4 -4
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/application.rb +10 -0
- data/lib/sidekiq/web/config.rb +1 -1
- data/lib/sidekiq/web/helpers.rb +2 -10
- data/web/assets/javascripts/application.js +17 -1
- data/web/assets/stylesheets/style.css +17 -0
- data/web/locales/ar.yml +1 -0
- data/web/locales/cs.yml +1 -0
- data/web/locales/da.yml +1 -0
- data/web/locales/de.yml +1 -0
- data/web/locales/el.yml +1 -0
- data/web/locales/en.yml +1 -0
- data/web/locales/es.yml +1 -0
- data/web/locales/fa.yml +1 -0
- data/web/locales/fr.yml +2 -1
- data/web/locales/gd.yml +1 -0
- data/web/locales/he.yml +1 -0
- data/web/locales/hi.yml +1 -0
- data/web/locales/it.yml +1 -0
- data/web/locales/ja.yml +1 -0
- data/web/locales/ko.yml +1 -0
- data/web/locales/lt.yml +1 -0
- data/web/locales/nb.yml +1 -0
- data/web/locales/nl.yml +1 -0
- data/web/locales/pl.yml +1 -0
- data/web/locales/pt-BR.yml +1 -0
- data/web/locales/pt.yml +1 -0
- data/web/locales/ru.yml +1 -0
- data/web/locales/sv.yml +1 -0
- data/web/locales/ta.yml +1 -0
- data/web/locales/tr.yml +1 -0
- data/web/locales/uk.yml +1 -0
- data/web/locales/ur.yml +1 -0
- data/web/locales/vi.yml +1 -0
- data/web/locales/zh-CN.yml +1 -0
- data/web/locales/zh-TW.yml +1 -0
- data/web/views/_footer.erb +1 -1
- data/web/views/_metrics_period_select.erb +1 -1
- data/web/views/_paging.erb +0 -1
- data/web/views/_poll_link.erb +2 -2
- data/web/views/busy.erb +4 -8
- data/web/views/dashboard.erb +3 -3
- data/web/views/dead.erb +3 -3
- data/web/views/filtering.erb +3 -3
- data/web/views/layout.erb +7 -7
- data/web/views/metrics.erb +7 -7
- data/web/views/morgue.erb +8 -4
- data/web/views/queue.erb +2 -2
- data/web/views/queues.erb +4 -4
- data/web/views/retries.erb +9 -5
- data/web/views/retry.erb +2 -2
- data/web/views/scheduled.erb +8 -4
- data/web/views/scheduled_job_info.erb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a831ed9ff5c1a11b447110fa77cbccf00fc44d3e3888fd5b1baa23cce5228ee9
|
|
4
|
+
data.tar.gz: 0b11c1b102a8ff8313992201b519b87e1e9446b84c72f23369e3390f671680f6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f6139796abb98a9bc67bf6498438f52e135b85ea6a360f86b45ddafd4f46d9d5567592940005d93bab5c3700430adfb5be340e08ca4a9e5cbde529d19a9c7dcc
|
|
7
|
+
data.tar.gz: '08ac62d0c45ca1a8216833ecfb07ad8f37ca3d1a1137198f0994af7cf0b107c842741a4f8b62ea8c3f59b42aa209418f65d9bcf6b57127b6ae6e09daf9509907'
|
data/Changes.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
[Sidekiq Changes](https://github.com/sidekiq/sidekiq/blob/main/Changes.md) | [Sidekiq Pro Changes](https://github.com/sidekiq/sidekiq/blob/main/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/sidekiq/sidekiq/blob/main/Ent-Changes.md)
|
|
4
4
|
|
|
5
|
+
8.0.10
|
|
6
|
+
----------
|
|
7
|
+
|
|
8
|
+
- Add confirm dialog for Delete All buttons in Web UI [#6853]
|
|
9
|
+
- Adjust scheduler to run closer to poll average [#6866]
|
|
10
|
+
- Forward compatibility changes for connection_pool 3.0.0
|
|
11
|
+
- Backwards compatibility fix for <8.0.9 process data in Redis [#6870]
|
|
12
|
+
- Backtrace dump can now be triggered with the INFO signal, since Puma uses the
|
|
13
|
+
same signal [#6857]
|
|
14
|
+
|
|
15
|
+
8.0.9
|
|
16
|
+
----------
|
|
17
|
+
|
|
18
|
+
- Implement idle Redis connection reaping, will be activated in 8.1 [#6663]
|
|
19
|
+
- Updated `Sidekiq::Process` API to provide capsule data. The `queues` and `weights`
|
|
20
|
+
data will be removed from Redis in Sidekiq 8.1, as this data can now be found in the
|
|
21
|
+
`capsules` element. [#6295]
|
|
22
|
+
- Restore bulk action buttons on Scheduled, Retry and Dead tabs [#6833, deve1212]
|
|
23
|
+
- Support logging additional job attributes [#6846, bschrag620]
|
|
24
|
+
- Fix display of long job args [#6836]
|
|
25
|
+
- Create development lifecycle (`docs/sdlc.md`) and security (`docs/SECURITY.md`) policy
|
|
26
|
+
documentation for Sidekiq's current workflows
|
|
27
|
+
|
|
5
28
|
8.0.8
|
|
6
29
|
----------
|
|
7
30
|
|
data/lib/sidekiq/api.rb
CHANGED
|
@@ -1059,9 +1059,9 @@ module Sidekiq
|
|
|
1059
1059
|
# 'started_at' => <process start time>,
|
|
1060
1060
|
# 'pid' => 12345,
|
|
1061
1061
|
# 'tag' => 'myapp'
|
|
1062
|
-
# 'concurrency' =>
|
|
1063
|
-
# '
|
|
1064
|
-
# 'busy' =>
|
|
1062
|
+
# 'concurrency' => 5,
|
|
1063
|
+
# 'capsules' => {"default" => {"mode" => "weighted", "concurrency" => 5, "weights" => {"default" => 2, "low" => 1}}},
|
|
1064
|
+
# 'busy' => 3,
|
|
1065
1065
|
# 'beat' => <last heartbeat>,
|
|
1066
1066
|
# 'identity' => <unique string identifying the process>,
|
|
1067
1067
|
# 'embedded' => true,
|
|
@@ -1089,12 +1089,35 @@ module Sidekiq
|
|
|
1089
1089
|
self["identity"]
|
|
1090
1090
|
end
|
|
1091
1091
|
|
|
1092
|
+
# deprecated, use capsules below
|
|
1092
1093
|
def queues
|
|
1093
|
-
|
|
1094
|
+
# Backwards compatibility with <8.0.8
|
|
1095
|
+
if !self["capsules"]
|
|
1096
|
+
self["queues"]
|
|
1097
|
+
else
|
|
1098
|
+
capsules.values.flat_map { |x| x["weights"].keys }.uniq
|
|
1099
|
+
end
|
|
1094
1100
|
end
|
|
1095
1101
|
|
|
1102
|
+
# deprecated, use capsules below
|
|
1096
1103
|
def weights
|
|
1097
|
-
|
|
1104
|
+
# Backwards compatibility with <8.0.8
|
|
1105
|
+
if !self["capsules"]
|
|
1106
|
+
self["weights"]
|
|
1107
|
+
else
|
|
1108
|
+
hash = {}
|
|
1109
|
+
capsules.values.each do |cap|
|
|
1110
|
+
# Note: will lose data if two capsules are processing the same named queue
|
|
1111
|
+
cap["weights"].each_pair do |queue, weight|
|
|
1112
|
+
hash[queue] = weight
|
|
1113
|
+
end
|
|
1114
|
+
end
|
|
1115
|
+
hash
|
|
1116
|
+
end
|
|
1117
|
+
end
|
|
1118
|
+
|
|
1119
|
+
def capsules
|
|
1120
|
+
self["capsules"]
|
|
1098
1121
|
end
|
|
1099
1122
|
|
|
1100
1123
|
def version
|
data/lib/sidekiq/capsule.rb
CHANGED
data/lib/sidekiq/cli.rb
CHANGED
|
@@ -49,7 +49,7 @@ module Sidekiq # :nodoc:
|
|
|
49
49
|
logger.info "Booted Rails #{::Rails.version} application in #{environment} environment" if rails_app?
|
|
50
50
|
|
|
51
51
|
self_read, self_write = IO.pipe
|
|
52
|
-
sigs = %w[INT TERM TTIN TSTP]
|
|
52
|
+
sigs = %w[INT TERM INFO TTIN TSTP]
|
|
53
53
|
# USR1 and USR2 don't work on the JVM
|
|
54
54
|
sigs << "USR2" if Sidekiq.pro? && !jruby?
|
|
55
55
|
sigs.each do |sig|
|
|
@@ -201,6 +201,7 @@ module Sidekiq # :nodoc:
|
|
|
201
201
|
cli.logger.info "Received TSTP, no longer accepting new work"
|
|
202
202
|
cli.launcher.quiet
|
|
203
203
|
},
|
|
204
|
+
# deprecated, use INFO
|
|
204
205
|
"TTIN" => ->(cli) {
|
|
205
206
|
Thread.list.each do |thread|
|
|
206
207
|
cli.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread.name}"
|
|
@@ -210,14 +211,24 @@ module Sidekiq # :nodoc:
|
|
|
210
211
|
cli.logger.warn "<no backtrace available>"
|
|
211
212
|
end
|
|
212
213
|
end
|
|
214
|
+
},
|
|
215
|
+
"INFO" => ->(cli) {
|
|
216
|
+
Thread.list.each do |thread|
|
|
217
|
+
cli.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread.name}"
|
|
218
|
+
if thread.backtrace
|
|
219
|
+
cli.logger.warn thread.backtrace.join("\n")
|
|
220
|
+
else
|
|
221
|
+
cli.logger.warn "<no backtrace available>"
|
|
222
|
+
end
|
|
223
|
+
end
|
|
213
224
|
}
|
|
214
225
|
}
|
|
215
|
-
UNHANDLED_SIGNAL_HANDLER = ->(cli) { cli.logger.info "No signal handler registered, ignoring" }
|
|
216
|
-
SIGNAL_HANDLERS.default = UNHANDLED_SIGNAL_HANDLER
|
|
217
226
|
|
|
218
227
|
def handle_signal(sig)
|
|
219
228
|
logger.debug "Got #{sig} signal"
|
|
220
|
-
SIGNAL_HANDLERS[sig]
|
|
229
|
+
hndlr = SIGNAL_HANDLERS[sig]
|
|
230
|
+
hndlr ? hndlr.call(self) :
|
|
231
|
+
logger.warn("No #{sig} signal handler registered, ignoring")
|
|
221
232
|
end
|
|
222
233
|
|
|
223
234
|
private
|
data/lib/sidekiq/config.rb
CHANGED
|
@@ -35,7 +35,9 @@ module Sidekiq
|
|
|
35
35
|
dead_max_jobs: 10_000,
|
|
36
36
|
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
|
|
37
37
|
reloader: proc { |&block| block.call },
|
|
38
|
-
backtrace_cleaner: ->(backtrace) { backtrace }
|
|
38
|
+
backtrace_cleaner: ->(backtrace) { backtrace },
|
|
39
|
+
logged_job_attributes: ["bid", "tags"],
|
|
40
|
+
reap_connections: nil # TODO Enable by default
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
ERROR_HANDLER = ->(ex, ctx, cfg = Sidekiq.default_configuration) {
|
|
@@ -144,11 +146,16 @@ module Sidekiq
|
|
|
144
146
|
@redis_config = @redis_config.merge(hash)
|
|
145
147
|
end
|
|
146
148
|
|
|
149
|
+
def reap_idle_redis_connections(timeout = nil)
|
|
150
|
+
self[:reap_connections] = timeout
|
|
151
|
+
end
|
|
152
|
+
alias_method :reap, :reap_idle_redis_connections
|
|
153
|
+
|
|
147
154
|
def redis_pool
|
|
148
155
|
Thread.current[:sidekiq_redis_pool] || Thread.current[:sidekiq_capsule]&.redis_pool || local_redis_pool
|
|
149
156
|
end
|
|
150
157
|
|
|
151
|
-
|
|
158
|
+
def local_redis_pool
|
|
152
159
|
# this is our internal client/housekeeping pool. each capsule has its
|
|
153
160
|
# own pool for executing threads.
|
|
154
161
|
@redis ||= new_redis_pool(10, "internal")
|
data/lib/sidekiq/fetch.rb
CHANGED
data/lib/sidekiq/job/iterable.rb
CHANGED
|
@@ -55,7 +55,7 @@ module Sidekiq
|
|
|
55
55
|
def cancel!
|
|
56
56
|
return @_cancelled if cancelled?
|
|
57
57
|
|
|
58
|
-
key =
|
|
58
|
+
key = iteration_key
|
|
59
59
|
_, result, _ = Sidekiq.redis do |c|
|
|
60
60
|
c.pipelined do |p|
|
|
61
61
|
p.hsetnx(key, "cancelled", Time.now.to_i)
|
|
@@ -177,7 +177,7 @@ module Sidekiq
|
|
|
177
177
|
private
|
|
178
178
|
|
|
179
179
|
def is_cancelled?
|
|
180
|
-
@_cancelled = Sidekiq.redis { |c| c.hget(
|
|
180
|
+
@_cancelled = Sidekiq.redis { |c| c.hget(iteration_key, "cancelled") }
|
|
181
181
|
end
|
|
182
182
|
|
|
183
183
|
def fetch_previous_iteration_state
|
data/lib/sidekiq/job_logger.rb
CHANGED
|
@@ -29,8 +29,10 @@ module Sidekiq
|
|
|
29
29
|
jid: job_hash["jid"],
|
|
30
30
|
class: job_hash["wrapped"] || job_hash["class"]
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
|
|
33
|
+
@config[:logged_job_attributes].each do |attr|
|
|
34
|
+
h[attr.to_sym] = job_hash[attr] if job_hash.has_key?(attr)
|
|
35
|
+
end
|
|
34
36
|
|
|
35
37
|
Thread.current[:sidekiq_context] = h
|
|
36
38
|
level = job_hash["log_level"]
|
data/lib/sidekiq/launcher.rb
CHANGED
|
@@ -142,6 +142,12 @@ module Sidekiq
|
|
|
142
142
|
key = identity
|
|
143
143
|
fails = procd = 0
|
|
144
144
|
|
|
145
|
+
idle = config[:reap_connections]
|
|
146
|
+
if idle
|
|
147
|
+
config.capsules.each_value { |cap| cap.local_redis_pool.reap(idle, &:close) }
|
|
148
|
+
config.local_redis_pool.reap(idle, &:close)
|
|
149
|
+
end
|
|
150
|
+
|
|
145
151
|
begin
|
|
146
152
|
flush_stats
|
|
147
153
|
|
|
@@ -214,11 +220,11 @@ module Sidekiq
|
|
|
214
220
|
# Log a warning if it's a disaster.
|
|
215
221
|
if RTT_READINGS.all? { |x| x > RTT_WARNING_LEVEL }
|
|
216
222
|
logger.warn <<~EOM
|
|
217
|
-
Your Redis network connection
|
|
223
|
+
Your Redis network connection appears to be performing poorly.
|
|
218
224
|
Last RTT readings were #{RTT_READINGS.buffer.inspect}, ideally these should be < 1000.
|
|
219
|
-
Ensure Redis is running in the same AZ or datacenter as Sidekiq
|
|
220
|
-
|
|
221
|
-
|
|
225
|
+
Ensure Redis is running in the same AZ or datacenter as Sidekiq and that
|
|
226
|
+
your Sidekiq process is not CPU-saturated; reduce your concurrency and/or
|
|
227
|
+
see https://github.com/sidekiq/sidekiq/discussions/5039
|
|
222
228
|
EOM
|
|
223
229
|
RTT_READINGS.reset
|
|
224
230
|
end
|
|
@@ -252,8 +258,15 @@ module Sidekiq
|
|
|
252
258
|
"pid" => ::Process.pid,
|
|
253
259
|
"tag" => @config[:tag] || "",
|
|
254
260
|
"concurrency" => @config.total_concurrency,
|
|
261
|
+
"capsules" => @config.capsules.each_with_object({}) { |(name, cap), memo|
|
|
262
|
+
memo[name] = cap.to_h
|
|
263
|
+
},
|
|
264
|
+
#####
|
|
265
|
+
# TODO deprecated, remove in 9.0
|
|
266
|
+
# This data is now found in the `capsules` element above
|
|
255
267
|
"queues" => @config.capsules.values.flat_map { |cap| cap.queues }.uniq,
|
|
256
|
-
"weights" =>
|
|
268
|
+
"weights" => @config.capsules.values.map(&:weights),
|
|
269
|
+
#####
|
|
257
270
|
"labels" => @config[:labels].to_a,
|
|
258
271
|
"identity" => identity,
|
|
259
272
|
"version" => Sidekiq::VERSION,
|
|
@@ -261,10 +274,6 @@ module Sidekiq
|
|
|
261
274
|
}
|
|
262
275
|
end
|
|
263
276
|
|
|
264
|
-
def to_weights
|
|
265
|
-
@config.capsules.values.map(&:weights)
|
|
266
|
-
end
|
|
267
|
-
|
|
268
277
|
def to_json
|
|
269
278
|
# this data changes infrequently so dump it to a string
|
|
270
279
|
# now so we don't need to dump it every heartbeat.
|
|
@@ -11,6 +11,7 @@ module Sidekiq::Middleware::I18n
|
|
|
11
11
|
# to be sent to Sidekiq.
|
|
12
12
|
class Client
|
|
13
13
|
include Sidekiq::ClientMiddleware
|
|
14
|
+
|
|
14
15
|
def call(_jobclass, job, _queue, _redis)
|
|
15
16
|
job["locale"] ||= I18n.locale
|
|
16
17
|
yield
|
|
@@ -20,6 +21,7 @@ module Sidekiq::Middleware::I18n
|
|
|
20
21
|
# Pull the msg locale out and set the current thread to use it.
|
|
21
22
|
class Server
|
|
22
23
|
include Sidekiq::ServerMiddleware
|
|
24
|
+
|
|
23
25
|
def call(_jobclass, job, _queue, &block)
|
|
24
26
|
I18n.with_locale(job.fetch("locale", I18n.default_locale), &block)
|
|
25
27
|
end
|
data/lib/sidekiq/monitor.rb
CHANGED
|
@@ -49,14 +49,10 @@ class Sidekiq::Monitor
|
|
|
49
49
|
puts "---- Processes (#{process_set.size}) ----"
|
|
50
50
|
process_set.each_with_index do |process, index|
|
|
51
51
|
# Keep compatibility with legacy versions since we don't want to break sidekiqmon during rolling upgrades or downgrades.
|
|
52
|
-
#
|
|
53
|
-
# Before:
|
|
54
|
-
# ["default", "critical"]
|
|
55
|
-
#
|
|
56
|
-
# After:
|
|
57
|
-
# {"default" => 1, "critical" => 10}
|
|
58
52
|
queues =
|
|
59
|
-
if process["
|
|
53
|
+
if process["capsules"] # 8.0.6+
|
|
54
|
+
process["capsules"].values.map { |x| x["weights"].keys.join(", ") }
|
|
55
|
+
elsif process["weights"]
|
|
60
56
|
process["weights"].sort_by { |queue| queue[0] }.map { |capsule| capsule.map { |name, weight| (weight > 0) ? "#{name}: #{weight}" : name }.join(", ") }
|
|
61
57
|
else
|
|
62
58
|
process["queues"].sort
|
|
@@ -105,7 +101,7 @@ class Sidekiq::Monitor
|
|
|
105
101
|
out << line
|
|
106
102
|
line = " " * pad
|
|
107
103
|
end
|
|
108
|
-
line << value + "
|
|
104
|
+
line << value + "; "
|
|
109
105
|
end
|
|
110
106
|
out << line[0..-3]
|
|
111
107
|
out.join("\n")
|
data/lib/sidekiq/profiler.rb
CHANGED
|
@@ -23,7 +23,7 @@ module Sidekiq
|
|
|
23
23
|
|
|
24
24
|
size = symbolized_options.delete(:size) || 5
|
|
25
25
|
pool_timeout = symbolized_options.delete(:pool_timeout) || 1
|
|
26
|
-
|
|
26
|
+
symbolized_options.delete(:pool_name)
|
|
27
27
|
|
|
28
28
|
# Default timeout in redis-client is 1 second, which can be too aggressive
|
|
29
29
|
# if the Sidekiq process is CPU-bound. With 10-15 threads and a thread quantum of 100ms,
|
|
@@ -33,7 +33,7 @@ module Sidekiq
|
|
|
33
33
|
symbolized_options[:timeout] ||= 3
|
|
34
34
|
|
|
35
35
|
redis_config = Sidekiq::RedisClientAdapter.new(symbolized_options)
|
|
36
|
-
ConnectionPool.new(timeout: pool_timeout, size: size
|
|
36
|
+
ConnectionPool.new(timeout: pool_timeout, size: size) do
|
|
37
37
|
redis_config.new_client
|
|
38
38
|
end
|
|
39
39
|
end
|
data/lib/sidekiq/ring_buffer.rb
CHANGED
data/lib/sidekiq/scheduled.rb
CHANGED
|
@@ -115,9 +115,9 @@ module Sidekiq
|
|
|
115
115
|
private
|
|
116
116
|
|
|
117
117
|
def wait
|
|
118
|
-
@sleeper.pop(random_poll_interval)
|
|
118
|
+
@sleeper.pop(timeout: random_poll_interval)
|
|
119
119
|
rescue Timeout::Error
|
|
120
|
-
#
|
|
120
|
+
# TODO move to exception: false
|
|
121
121
|
rescue => ex
|
|
122
122
|
# if poll_interval_average hasn't been calculated yet, we can
|
|
123
123
|
# raise an error trying to reach Redis.
|
|
@@ -155,7 +155,7 @@ module Sidekiq
|
|
|
155
155
|
else
|
|
156
156
|
# With 10+ processes, we should have enough randomness to get decent polling
|
|
157
157
|
# across the entire timespan
|
|
158
|
-
interval * rand
|
|
158
|
+
interval * rand * 2
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
161
|
|
|
@@ -223,7 +223,7 @@ module Sidekiq
|
|
|
223
223
|
total += INITIAL_WAIT unless @config[:poll_interval_average]
|
|
224
224
|
total += (5 * rand)
|
|
225
225
|
|
|
226
|
-
@sleeper.pop(total)
|
|
226
|
+
@sleeper.pop(timeout: total)
|
|
227
227
|
rescue Timeout::Error
|
|
228
228
|
ensure
|
|
229
229
|
# periodically clean out the `processes` set in Redis which can collect
|
data/lib/sidekiq/version.rb
CHANGED
|
@@ -318,6 +318,16 @@ module Sidekiq
|
|
|
318
318
|
redirect_with_query("#{root_path}scheduled")
|
|
319
319
|
end
|
|
320
320
|
|
|
321
|
+
post "/scheduled/all/delete" do
|
|
322
|
+
Sidekiq::ScheduledSet.new.clear
|
|
323
|
+
redirect "#{root_path}scheduled"
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
post "/scheduled/all/add_to_queue" do
|
|
327
|
+
Sidekiq::ScheduledSet.new.each(&:add_to_queue)
|
|
328
|
+
redirect "#{root_path}scheduled"
|
|
329
|
+
end
|
|
330
|
+
|
|
321
331
|
get "/dashboard/stats" do
|
|
322
332
|
redirect "#{root_path}stats"
|
|
323
333
|
end
|
data/lib/sidekiq/web/config.rb
CHANGED
|
@@ -25,7 +25,7 @@ module Sidekiq
|
|
|
25
25
|
# about data security and wish to self-host, you can change these URLs.
|
|
26
26
|
profile_view_url: "https://profiler.firefox.com/public/%s",
|
|
27
27
|
profile_store_url: "https://api.profiler.firefox.com/compressed-store",
|
|
28
|
-
# Will be false in Sidekiq 9.0.
|
|
28
|
+
# TODO Will be false in Sidekiq 9.0.
|
|
29
29
|
# CSRF is unnecessary if you are using SameSite=(Strict|Lax) cookies.
|
|
30
30
|
csrf: true
|
|
31
31
|
}
|
data/lib/sidekiq/web/helpers.rb
CHANGED
|
@@ -122,8 +122,8 @@ module Sidekiq
|
|
|
122
122
|
resultset
|
|
123
123
|
end
|
|
124
124
|
|
|
125
|
-
def filtering(which)
|
|
126
|
-
erb(:filtering, locals: {which:
|
|
125
|
+
def filtering(which, placeholder_key: "AnyJobContent", label_key: "Filter")
|
|
126
|
+
erb(:filtering, locals: {which:, placeholder_key:, label_key:})
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def filter_link(jid, within = "retries")
|
|
@@ -256,14 +256,6 @@ module Sidekiq
|
|
|
256
256
|
end
|
|
257
257
|
end
|
|
258
258
|
|
|
259
|
-
def busy_weights(capsule_weights)
|
|
260
|
-
# backwards compat with 7.0.0, remove in 7.1
|
|
261
|
-
cw = [capsule_weights].flatten
|
|
262
|
-
cw.map { |hash|
|
|
263
|
-
hash.map { |name, weight| (weight > 0) ? +name << ": " << weight.to_s : name }.join(", ")
|
|
264
|
-
}.join("; ")
|
|
265
|
-
end
|
|
266
|
-
|
|
267
259
|
def stats
|
|
268
260
|
@stats ||= Sidekiq::Stats.new
|
|
269
261
|
end
|
|
@@ -22,6 +22,7 @@ function addListeners() {
|
|
|
22
22
|
node.addEventListener("click", addDataToggleListeners)
|
|
23
23
|
})
|
|
24
24
|
|
|
25
|
+
initializeBulkToggle();
|
|
25
26
|
addShiftClickListeners();
|
|
26
27
|
updateFuzzyTimes();
|
|
27
28
|
updateNumbers();
|
|
@@ -63,6 +64,21 @@ function addDataToggleListeners(event) {
|
|
|
63
64
|
full.classList.toggle("is-open");
|
|
64
65
|
}
|
|
65
66
|
|
|
67
|
+
function toggleBulkButtons() {
|
|
68
|
+
const checkboxes = document.querySelectorAll('.select-item-checkbox, .check-all-items');
|
|
69
|
+
const anyChecked = Array.from(checkboxes).some(cb => cb.checked);
|
|
70
|
+
const buttons = document.querySelectorAll('.bulk-action-buttons');
|
|
71
|
+
buttons.forEach(btn => {
|
|
72
|
+
btn.style.display = anyChecked ? 'none' : 'block';
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function initializeBulkToggle(){
|
|
77
|
+
document.querySelectorAll('.check-all-items, .select-item-checkbox').forEach(cb => {
|
|
78
|
+
cb.addEventListener('change', toggleBulkButtons);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
66
82
|
function addShiftClickListeners() {
|
|
67
83
|
let checkboxes = Array.from(document.querySelectorAll(".shift_clickable"));
|
|
68
84
|
let lastChecked = null;
|
|
@@ -174,7 +190,7 @@ function updateProgressBars() {
|
|
|
174
190
|
function handleConfirmDialog (event) {
|
|
175
191
|
const target = event.target
|
|
176
192
|
|
|
177
|
-
if (target.localName !== "input") { return }
|
|
193
|
+
if (target.localName !== "input" && target.localName !== "button" ) { return }
|
|
178
194
|
const confirmMessage = target.dataset.confirm
|
|
179
195
|
|
|
180
196
|
if (confirmMessage === undefined) { return }
|
|
@@ -454,6 +454,10 @@ canvas + .table_container {
|
|
|
454
454
|
gap: 8px;
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
+
.bulk-action-buttons.bulk-lead-button {
|
|
458
|
+
margin-inline-start: auto;
|
|
459
|
+
}
|
|
460
|
+
|
|
457
461
|
table {
|
|
458
462
|
background-color: var(--color-elevated);
|
|
459
463
|
border: 1px solid var(--color-border);
|
|
@@ -757,3 +761,16 @@ body > footer .nav {
|
|
|
757
761
|
padding: 20px;
|
|
758
762
|
background: var(--color-success);
|
|
759
763
|
}
|
|
764
|
+
|
|
765
|
+
.args {
|
|
766
|
+
overflow-y: auto;
|
|
767
|
+
max-height: 50px;
|
|
768
|
+
word-break: break-word
|
|
769
|
+
}
|
|
770
|
+
.args-extended {
|
|
771
|
+
overflow-y: scroll;
|
|
772
|
+
max-height: 500px;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
.toggle { display: none; }
|
|
776
|
+
.toggle.is-open { display: block; }
|
data/web/locales/ar.yml
CHANGED
data/web/locales/cs.yml
CHANGED
|
@@ -3,6 +3,7 @@ cs:
|
|
|
3
3
|
LanguageName: Čeština
|
|
4
4
|
Actions: Akce
|
|
5
5
|
AddToQueue: Přidat do fronty
|
|
6
|
+
AddAllToQueue: Přidat vše do fronty
|
|
6
7
|
AreYouSure: Jste si jisti?
|
|
7
8
|
AreYouSureDeleteJob: Jste si jisti, že chcete odstranit tento úkol?
|
|
8
9
|
AreYouSureDeleteQueue: Jste si jisti, že chcete odstranit frontu %{queue}?
|
data/web/locales/da.yml
CHANGED
|
@@ -3,6 +3,7 @@ da:
|
|
|
3
3
|
LanguageName: Dansk
|
|
4
4
|
Actions: Handlinger
|
|
5
5
|
AddToQueue: Tilføj til kø
|
|
6
|
+
AddAllToQueue: Tilføj alle til kø
|
|
6
7
|
AreYouSure: Er du sikker?
|
|
7
8
|
AreYouSureDeleteJob: Er du sikker på at du vil slette dette job?
|
|
8
9
|
AreYouSureDeleteQueue: Er du sikker på at du vil slette %{queue} køen?
|
data/web/locales/de.yml
CHANGED
|
@@ -3,6 +3,7 @@ de:
|
|
|
3
3
|
LanguageName: Deutsch
|
|
4
4
|
Actions: Aktionen
|
|
5
5
|
AddToQueue: In Warteschlange einreihen
|
|
6
|
+
AddAllToQueue: Alle in Warteschlange einreihen
|
|
6
7
|
AreYouSure: Bist du sicher?
|
|
7
8
|
AreYouSureDeleteJob: Möchtest du diesen Job wirklich löschen?
|
|
8
9
|
AreYouSureDeleteQueue: Möchtest du %{queue} wirklich löschen?
|
data/web/locales/el.yml
CHANGED
|
@@ -26,6 +26,7 @@ el: # <---- change this to your locale code
|
|
|
26
26
|
ShowAll: Εμφάνιση Όλων
|
|
27
27
|
Enqueued: Μπήκαν στην στοίβα
|
|
28
28
|
AddToQueue: Προσθήκη στην στοίβα
|
|
29
|
+
AddAllToQueue: Προσθήκη όλων στην στοίβα
|
|
29
30
|
AreYouSureDeleteJob: Θέλετε να διαγράψετε αυτή την εργασία;
|
|
30
31
|
AreYouSureDeleteQueue: Θέλετε να διαγράψετε την στοίβα %{queue}; Αυτό θα διαγράψει όλες τις εργασίες εντός της στοίβας, θα εμφανιστεί ξανά εάν προωθήσετε περισσότερες εργασίες σε αυτήν στο μέλλον.
|
|
31
32
|
Queues: Στοίβες
|
data/web/locales/en.yml
CHANGED
|
@@ -3,6 +3,7 @@ en:
|
|
|
3
3
|
LanguageName: English
|
|
4
4
|
Actions: Actions
|
|
5
5
|
AddToQueue: Add to queue
|
|
6
|
+
AddAllToQueue: Add All to Queue
|
|
6
7
|
AreYouSure: Are you sure?
|
|
7
8
|
AreYouSureDeleteJob: Are you sure you want to delete this job?
|
|
8
9
|
AreYouSureDeleteQueue: Are you sure you want to delete the %{queue} queue? This will delete all jobs within the queue, it will reappear if you push more jobs to it in the future.
|
data/web/locales/es.yml
CHANGED
|
@@ -3,6 +3,7 @@ es:
|
|
|
3
3
|
LanguageName: Español
|
|
4
4
|
Actions: Acciones
|
|
5
5
|
AddToQueue: Añadir a la cola
|
|
6
|
+
AddAllToQueue: Añadir todo a la cola
|
|
6
7
|
AreYouSure: ¿Estás seguro?
|
|
7
8
|
AreYouSureDeleteJob: ¿Estás seguro de eliminar este trabajo?
|
|
8
9
|
AreYouSureDeleteQueue: ¿Estás seguro de eliminar la cola %{queue}?
|
data/web/locales/fa.yml
CHANGED
data/web/locales/fr.yml
CHANGED
|
@@ -3,11 +3,12 @@ fr:
|
|
|
3
3
|
LanguageName: Français
|
|
4
4
|
Actions: Actions
|
|
5
5
|
AddToQueue: Ajouter à la queue
|
|
6
|
+
AddAllToQueue: Ajouter tout à la queue
|
|
6
7
|
AreYouSure: Êtes-vous certain ?
|
|
7
8
|
AreYouSureDeleteJob: Êtes-vous certain de vouloir supprimer cette tâche ?
|
|
8
9
|
AreYouSureDeleteQueue: Êtes-vous certain de vouloir supprimer la queue %{queue} ?
|
|
9
10
|
Arguments: Arguments
|
|
10
|
-
|
|
11
|
+
BackToApp: Retour à l'application
|
|
11
12
|
Busy: En cours
|
|
12
13
|
Class: Classe
|
|
13
14
|
Connections: Connexions
|
data/web/locales/gd.yml
CHANGED
|
@@ -3,6 +3,7 @@ gd:
|
|
|
3
3
|
LanguageName: Gaeilge
|
|
4
4
|
Actions: Gnìomhan
|
|
5
5
|
AddToQueue: Cuir ris a’ chiutha
|
|
6
|
+
AddAllToQueue: Cuir a h-uile ris a’ chiutha
|
|
6
7
|
AreYouSure: A bheil thu cinnteach?
|
|
7
8
|
AreYouSureDeleteJob: A bheil thu cinnteach gu bheil thu airson an obair seo a sguabadh às?
|
|
8
9
|
AreYouSureDeleteQueue: A bheil thu cinnteach gu bheil thu airson ciutha %{queue} a sguabadh às? Sguabaidh seo às gach obair sa chiutha seo, nochdaidh e a-rithist nuair a phutas tu barrachd obraichean dha an uairsin.
|
data/web/locales/he.yml
CHANGED
data/web/locales/hi.yml
CHANGED
|
@@ -3,6 +3,7 @@ hi:
|
|
|
3
3
|
LanguageName: हिन्दी
|
|
4
4
|
Actions: कार्रवाई
|
|
5
5
|
AddToQueue: कतार मे जोड़ें
|
|
6
|
+
AddAllToQueue: सभी को कतार मे जोड़ें
|
|
6
7
|
AreYouSure: क्या आपको यकीन है?
|
|
7
8
|
AreYouSureDeleteJob: क्या आप इस कार्य को हटाना चाहते है?
|
|
8
9
|
AreYouSureDeleteQueue: क्या आप %{queue} कतार को हटाना चाहते है?
|
data/web/locales/it.yml
CHANGED
|
@@ -3,6 +3,7 @@ it:
|
|
|
3
3
|
LanguageName: Italiano
|
|
4
4
|
Actions: Azioni
|
|
5
5
|
AddToQueue: Aggiungi alla coda
|
|
6
|
+
AddAllToQueue: Aggiungi tutto alla coda
|
|
6
7
|
AreYouSure: Sei sicuro?
|
|
7
8
|
AreYouSureDeleteJob: Sei sicuro di voler cancellare questo lavoro?
|
|
8
9
|
AreYouSureDeleteQueue: Sei sicuro di voler cancellare la coda %{queue}?
|
data/web/locales/ja.yml
CHANGED
data/web/locales/ko.yml
CHANGED
data/web/locales/lt.yml
CHANGED
|
@@ -3,6 +3,7 @@ lt:
|
|
|
3
3
|
LanguageName: Lietuvių
|
|
4
4
|
Actions: Veiksmai
|
|
5
5
|
AddToQueue: Pridėti į eilę
|
|
6
|
+
AddAllToQueue: Pridėti viską į eilę
|
|
6
7
|
AreYouSure: Ar jūs įsitikinę?
|
|
7
8
|
AreYouSureDeleteJob: Ar tikrai norite pašalinti šį darbą?
|
|
8
9
|
AreYouSureDeleteQueue: Ar tikrai norite pašalinti šią eilę %{queue}?
|
data/web/locales/nb.yml
CHANGED
|
@@ -3,6 +3,7 @@ nb:
|
|
|
3
3
|
LanguageName: Norsk
|
|
4
4
|
Actions: Handlinger
|
|
5
5
|
AddToQueue: Legg til i kø
|
|
6
|
+
AddAllToQueue: Legg alt til i kø
|
|
6
7
|
AreYouSure: Er du sikker?
|
|
7
8
|
AreYouSureDeleteJob: Er du sikker på at du vil slette denne jobben?
|
|
8
9
|
AreYouSureDeleteQueue: Er du sikker på at du vil slette køen %{queue}?
|
data/web/locales/nl.yml
CHANGED
|
@@ -3,6 +3,7 @@ nl:
|
|
|
3
3
|
LanguageName: Nederlands
|
|
4
4
|
Actions: Acties
|
|
5
5
|
AddToQueue: Toevoegen aan wachtrij
|
|
6
|
+
AddAllToQueue: Alles toevoegen aan wachtrij
|
|
6
7
|
AreYouSure: Weet u het zeker?
|
|
7
8
|
AreYouSureDeleteJob: Weet u zeker dat u deze taak wilt verwijderen?
|
|
8
9
|
AreYouSureDeleteQueue: Weet u zeker dat u wachtrij %{queue} wilt verwijderen?
|
data/web/locales/pl.yml
CHANGED
data/web/locales/pt-BR.yml
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
LanguageName: Português (Brasil)
|
|
3
3
|
Actions: Ações
|
|
4
4
|
AddToQueue: Adicionar à fila
|
|
5
|
+
AddAllToQueue: Adicionar tudo à fila
|
|
5
6
|
AreYouSure: Tem certeza?
|
|
6
7
|
AreYouSureDeleteJob: Deseja deletar esta tarefa?
|
|
7
8
|
AreYouSureDeleteQueue: Deseja deletar a fila %{queue}? Isso irá deletar todas as tarefas desta fila.
|
data/web/locales/pt.yml
CHANGED
|
@@ -3,6 +3,7 @@ pt:
|
|
|
3
3
|
LanguageName: Português
|
|
4
4
|
Actions: Acções
|
|
5
5
|
AddToQueue: Adicionar à fila
|
|
6
|
+
AddAllToQueue: Adicionar tudo à fila
|
|
6
7
|
AreYouSure: Tem a certeza?
|
|
7
8
|
AreYouSureDeleteJob: Tem a certeza que deseja eliminar esta tarefa?
|
|
8
9
|
AreYouSureDeleteQueue: Tem a certeza que deseja eliminar a fila %{queue}?
|
data/web/locales/ru.yml
CHANGED
|
@@ -3,6 +3,7 @@ ru:
|
|
|
3
3
|
LanguageName: Русский
|
|
4
4
|
Actions: Действия
|
|
5
5
|
AddToQueue: Добавить в очередь
|
|
6
|
+
AddAllToQueue: Добавить все в очередь
|
|
6
7
|
AreYouSure: Вы уверены?
|
|
7
8
|
AreYouSureDeleteJob: Вы уверены, что хотите удалить эту задачу?
|
|
8
9
|
AreYouSureDeleteQueue: Вы уверены, что хотите удалить очередь %{queue}?
|
data/web/locales/sv.yml
CHANGED
|
@@ -3,6 +3,7 @@ sv:
|
|
|
3
3
|
LanguageName: Svenska
|
|
4
4
|
Actions: Åtgärder
|
|
5
5
|
AddToQueue: Lägg till i kö
|
|
6
|
+
AddAllToQueue: Lägg till allt i kö
|
|
6
7
|
AreYouSure: Är du säker?
|
|
7
8
|
AreYouSureDeleteJob: Är du säker på att du vill ta bort detta jobb?
|
|
8
9
|
AreYouSureDeleteQueue: Är du säker på att du vill ta bort kön %{queue}?
|
data/web/locales/ta.yml
CHANGED
|
@@ -3,6 +3,7 @@ ta:
|
|
|
3
3
|
LanguageName: தமிழ்
|
|
4
4
|
Actions: செயல்கள்
|
|
5
5
|
AddToQueue: வரிசையில் சேர்
|
|
6
|
+
AddAllToQueue: அனைத்தையும் வரிசையில் சேர்
|
|
6
7
|
AreYouSure: நீங்கள் உறுதியாக இருக்கிறீர்களா?
|
|
7
8
|
AreYouSureDeleteJob: நீ இந்த வேலையை நீக்க வேண்டும் என்று உறுதியாக இருக்கிறீர்களா?
|
|
8
9
|
AreYouSureDeleteQueue: நீங்கள் %{queue} வரிசையில் நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?
|
data/web/locales/tr.yml
CHANGED
|
@@ -3,6 +3,7 @@ tr:
|
|
|
3
3
|
LanguageName: Türkçe
|
|
4
4
|
Actions: Eylemler
|
|
5
5
|
AddToQueue: Kuyruğa ekle
|
|
6
|
+
AddAllToQueue: Hepsini kuyruğa ekle
|
|
6
7
|
AreYouSure: Emin misiniz?
|
|
7
8
|
AreYouSureDeleteJob: Bu işi silmek istediğinizden emin misiniz?
|
|
8
9
|
AreYouSureDeleteQueue: "%{queue} kuyruğunu silmek istediğinizden emin misiniz?"
|
data/web/locales/uk.yml
CHANGED
|
@@ -3,6 +3,7 @@ uk:
|
|
|
3
3
|
LanguageName: Українська
|
|
4
4
|
Actions: Дії
|
|
5
5
|
AddToQueue: Додати до черги
|
|
6
|
+
AddAllToQueue: Додати все до черги
|
|
6
7
|
AreYouSure: Ви впевнені?
|
|
7
8
|
AreYouSureDeleteJob: Ви впевнені у тому, що хочете видалити задачу?
|
|
8
9
|
AreYouSureDeleteQueue: Ви впевнені у тому, що хочете видалити чергу %{queue}?
|
data/web/locales/ur.yml
CHANGED
data/web/locales/vi.yml
CHANGED
|
@@ -3,6 +3,7 @@ vi:
|
|
|
3
3
|
LanguageName: Tiếng Việt
|
|
4
4
|
Actions: Những hành động
|
|
5
5
|
AddToQueue: Thêm vào hàng đợi
|
|
6
|
+
AddAllToQueue: Thêm tất cả vào hàng đợi
|
|
6
7
|
AreYouSure: Bạn chắc chứ?
|
|
7
8
|
AreYouSureDeleteJob: Bạn có chắc là muốn xóa tác vụ này?
|
|
8
9
|
AreYouSureDeleteQueue: Bạn có chắc là muốn xóa %{queue} này?
|
data/web/locales/zh-CN.yml
CHANGED
data/web/locales/zh-TW.yml
CHANGED
|
@@ -27,6 +27,7 @@ zh-TW: # <---- change this to your locale code
|
|
|
27
27
|
CurrentMessagesInQueue: 目前在<span class='title'>%{queue}</span>的工作
|
|
28
28
|
Delete: 刪除
|
|
29
29
|
AddToQueue: 增加至佇列
|
|
30
|
+
AddAllToQueue: 增加所有至佇列
|
|
30
31
|
AreYouSureDeleteJob: 確定要刪除這個工作嗎?
|
|
31
32
|
AreYouSureDeleteQueue: 確定要刪除%{queue}佇列?這會刪除佇列裡的所有工作,佇列將會在有新工作時重新出現。
|
|
32
33
|
Queues: 佇列
|
data/web/views/_footer.erb
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<p id="serverUtcTime"><%= server_utc_time %></p>
|
|
12
12
|
</li>
|
|
13
13
|
<li>
|
|
14
|
-
<p><a rel=help href="https://github.com/sidekiq/sidekiq/wiki">docs</a></p>
|
|
14
|
+
<p><a rel="help" href="https://github.com/sidekiq/sidekiq/wiki">docs</a></p>
|
|
15
15
|
</li>
|
|
16
16
|
<li>
|
|
17
17
|
<form id="locale-form" action="<%= root_path %>change_locale" method="post">
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div class="filter">
|
|
2
2
|
<form id="metrics-form" class="form-inline" action="<%= path %>" method="get">
|
|
3
3
|
<label for="substr"><%= t('Filter') %></label>
|
|
4
|
-
<input id="class-filter" class="form-control" type="text" name="substr" placeholder="<%= t('Name') %>" value="<%= h url_params("substr") %>">
|
|
4
|
+
<input id="class-filter" class="form-control" type="text" name="substr" placeholder="<%= t('Name') %>" value="<%= h url_params("substr") %>" autocomplete="off">
|
|
5
5
|
<select id="period-selector" class="form-control" name="period">
|
|
6
6
|
<% periods.each_key do |code| %>
|
|
7
7
|
<% if code == period %>
|
data/web/views/_paging.erb
CHANGED
data/web/views/_poll_link.erb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
<% if pollable? %>
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
<a href="#" class="btn live-poll live-poll-start btn-primary"><%= t('LivePoll') %></a>
|
|
3
|
+
<a href="#" class="btn live-poll live-poll-stop btn-danger"><%= t('StopPolling') %></a>
|
|
4
4
|
<% end %>
|
data/web/views/busy.erb
CHANGED
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
<form method="POST" class="filter warning-messages">
|
|
34
34
|
<%= csrf_tag %>
|
|
35
35
|
<div class="btn-group pull-right flip">
|
|
36
|
-
<input class="btn btn-warn" type="submit" name="quiet" value="<%= t('QuietAll') %>" data-confirm="<%= t('AreYouSure') %>"
|
|
37
|
-
<input class="btn btn-danger" type="submit" name="stop" value="<%= t('StopAll') %>" data-confirm="<%= t('AreYouSure') %>"
|
|
36
|
+
<input class="btn btn-warn" type="submit" name="quiet" value="<%= t('QuietAll') %>" data-confirm="<%= t('AreYouSure') %>">
|
|
37
|
+
<input class="btn btn-danger" type="submit" name="stop" value="<%= t('StopAll') %>" data-confirm="<%= t('AreYouSure') %>">
|
|
38
38
|
</div>
|
|
39
39
|
</form>
|
|
40
40
|
</header>
|
|
@@ -69,11 +69,7 @@
|
|
|
69
69
|
<% end %>
|
|
70
70
|
<br>
|
|
71
71
|
<b><%= "#{t('Queues')}: " %></b>
|
|
72
|
-
|
|
73
|
-
<%= busy_weights(process.weights) %>
|
|
74
|
-
<% else %>
|
|
75
|
-
<%= process.queues.sort.join(", ") %>
|
|
76
|
-
<% end %>
|
|
72
|
+
<%= process.queues.sort.join(", ") %>
|
|
77
73
|
<% if process.version != Sidekiq::VERSION %>
|
|
78
74
|
<br>
|
|
79
75
|
<b><%= "#{t('Version')}: " %></b>
|
|
@@ -92,7 +88,7 @@
|
|
|
92
88
|
<% unless process.embedded? %>
|
|
93
89
|
<form method="POST">
|
|
94
90
|
<%= csrf_tag %>
|
|
95
|
-
<input type="hidden" name="identity" value="<%= process['identity'] %>"
|
|
91
|
+
<input type="hidden" name="identity" value="<%= process['identity'] %>">
|
|
96
92
|
|
|
97
93
|
<div class="btn-group">
|
|
98
94
|
<% unless process.stopping? %><button class="btn btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
|
data/web/views/dashboard.erb
CHANGED
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
<div class="filter interval-slider">
|
|
10
10
|
<span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
|
|
11
11
|
<span id="sldr-text" class="current-interval">5 s</span>
|
|
12
|
-
<br
|
|
13
|
-
<input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" role="slider" type="range" min="2000" max="20000" step="1000" value="5000"
|
|
12
|
+
<br>
|
|
13
|
+
<input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" role="slider" type="range" min="2000" max="20000" step="1000" value="5000" autocomplete="off">
|
|
14
14
|
</div>
|
|
15
15
|
</header>
|
|
16
16
|
|
|
17
17
|
<div class="chart">
|
|
18
|
-
<span id="sr-last-dashboard-update-template" hidden
|
|
18
|
+
<span id="sr-last-dashboard-update-template" hidden><%= t("LastDashboardUpdateTemplateLiteral") %></span>
|
|
19
19
|
<span id="sr-last-dashboard-update" class="sr-only" role="status"></span>
|
|
20
20
|
|
|
21
21
|
<canvas id="realtime-chart">
|
data/web/views/dead.erb
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
<form action="<%= root_path %>morgue/<%= job_params(@dead, @dead.score) %>" method="post">
|
|
33
33
|
<%= csrf_tag %>
|
|
34
34
|
<a class="btn btn-default" href="<%= root_path %>morgue"><%= t('GoBack') %></a>
|
|
35
|
-
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>"
|
|
36
|
-
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>"
|
|
35
|
+
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>">
|
|
36
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
37
37
|
</form>
|
|
38
|
-
</section>
|
|
38
|
+
</section>
|
data/web/views/filtering.erb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div class="filter">
|
|
2
|
-
<form role="search" method="get" class="form-inline" action=
|
|
3
|
-
<label for="substr"><%= t(
|
|
4
|
-
<input class="form-control" type="search" name="substr" value="<%= h url_params("substr") %>" placeholder="<%= t(
|
|
2
|
+
<form role="search" method="get" class="form-inline" action="<%= root_path %><%= which %>">
|
|
3
|
+
<label for="substr"><%= t(label_key) %></label>
|
|
4
|
+
<input class="form-control" type="search" name="substr" value="<%= h url_params("substr") %>" placeholder="<%= t(placeholder_key) %>" autocomplete="off">
|
|
5
5
|
</form>
|
|
6
6
|
</div>
|
data/web/views/layout.erb
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
<html dir="<%= text_direction %>" lang="<%= locale %>">
|
|
3
3
|
<head>
|
|
4
4
|
<title><%= environment_title_prefix %><%= Sidekiq::NAME %></title>
|
|
5
|
-
<meta charset="utf-8"
|
|
6
|
-
<meta name="viewport" content="width=device-width,initial-scale=1.0"
|
|
7
|
-
<meta name="color-scheme" content="light dark"
|
|
8
|
-
<link href="<%= root_path %>stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>"
|
|
9
|
-
<link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png"
|
|
10
|
-
<link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico"
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
7
|
+
<meta name="color-scheme" content="light dark">
|
|
8
|
+
<link href="<%= root_path %>stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>">
|
|
9
|
+
<link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
|
|
10
|
+
<link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico">
|
|
11
11
|
<script type="text/javascript" src="<%= root_path %>javascripts/application.js" nonce="<%= csp_nonce %>"></script>
|
|
12
|
-
<meta name="google" content="notranslate"
|
|
12
|
+
<meta name="google" content="notranslate">
|
|
13
13
|
<%= display_custom_head %>
|
|
14
14
|
</head>
|
|
15
15
|
<body class="admin" data-locale="<%= locale %>">
|
data/web/views/metrics.erb
CHANGED
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
class="metrics-swatch"
|
|
60
60
|
value="<%= kls %>"
|
|
61
61
|
<%= visible_kls.include?(kls) ? 'checked' : '' %>
|
|
62
|
-
|
|
62
|
+
>
|
|
63
63
|
<code><a href="<%= root_path %>metrics/<%= kls %>?period=<%= @period %>"><%= kls %></a></code>
|
|
64
64
|
</div>
|
|
65
65
|
</td>
|
|
@@ -70,15 +70,15 @@
|
|
|
70
70
|
</tr>
|
|
71
71
|
<% end %>
|
|
72
72
|
<% else %>
|
|
73
|
-
|
|
73
|
+
<tr><td colspan="5"><%= t("NoDataFound") %></td></tr>
|
|
74
74
|
<% end %>
|
|
75
75
|
</tbody>
|
|
76
76
|
</table>
|
|
77
77
|
</div>
|
|
78
78
|
|
|
79
|
-
<% if job_results.any? %>
|
|
80
|
-
|
|
81
|
-
<% end %>
|
|
82
|
-
|
|
79
|
+
<% if job_results.any? %>
|
|
80
|
+
<p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %>.<% if @period == "1h" %> Auto-refreshing every 60 seconds.<% end %></small></p>
|
|
81
|
+
<% end %>
|
|
83
82
|
</section>
|
|
84
|
-
|
|
83
|
+
|
|
84
|
+
<%= script_tag "javascripts/metrics.js" %>
|
data/web/views/morgue.erb
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<tr>
|
|
17
17
|
<th>
|
|
18
18
|
<label>
|
|
19
|
-
<input type="checkbox" class="check_all"
|
|
19
|
+
<input type="checkbox" class="check_all check-all-items">
|
|
20
20
|
</label>
|
|
21
21
|
</th>
|
|
22
22
|
<th><%= t('LastRetry') %></th>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<tr>
|
|
31
31
|
<td>
|
|
32
32
|
<label>
|
|
33
|
-
<input type=
|
|
33
|
+
<input type="checkbox" name="key[]" value="<%= job_params(entry.item, entry.score) %>" class="shift_clickable select-item-checkbox">
|
|
34
34
|
</label>
|
|
35
35
|
</td>
|
|
36
36
|
<td>
|
|
@@ -55,8 +55,12 @@
|
|
|
55
55
|
<% end %>
|
|
56
56
|
</table>
|
|
57
57
|
</div>
|
|
58
|
-
<
|
|
59
|
-
|
|
58
|
+
<div class="buttons-row">
|
|
59
|
+
<input class="btn btn-primary pull-left flip" type="submit" name="retry" value="<%= t('RetryNow') %>">
|
|
60
|
+
<input class="btn btn-danger pull-left flip" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
61
|
+
<button class="btn btn-primary bulk-action-buttons bulk-lead-button" type="submit" name="action" value="retry_all" formaction="<%= "#{root_path}morgue/all/retry" %>"><%= t('RetryAll') %></button>
|
|
62
|
+
<button class="btn btn-danger bulk-action-buttons" type="submit" name="action" value="delete_all" formaction="<%= "#{root_path}morgue/all/delete" %>" data-confirm="<%= t('AreYouSure') %>"><%= t('DeleteAll') %></button>
|
|
63
|
+
</div>
|
|
60
64
|
</form>
|
|
61
65
|
|
|
62
66
|
<% else %>
|
data/web/views/queue.erb
CHANGED
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
<td>
|
|
46
46
|
<form action="<%= root_path %>queues/<%= CGI.escape(@name) %>/delete" method="post">
|
|
47
47
|
<%= csrf_tag %>
|
|
48
|
-
<input name="key_val" value="<%= h job.value %>" type="hidden"
|
|
49
|
-
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>"
|
|
48
|
+
<input name="key_val" value="<%= h job.value %>" type="hidden">
|
|
49
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSure') %>">
|
|
50
50
|
</form>
|
|
51
51
|
</td>
|
|
52
52
|
</tr>
|
data/web/views/queues.erb
CHANGED
|
@@ -26,15 +26,15 @@
|
|
|
26
26
|
<%= number_with_delimiter(queue_latency, precision: 2) %>
|
|
27
27
|
</td>
|
|
28
28
|
<td class="delete-confirm">
|
|
29
|
-
<form action="<%=root_path %>queues/<%= CGI.escape(queue.name) %>" method="post">
|
|
29
|
+
<form action="<%= root_path %>queues/<%= CGI.escape(queue.name) %>" method="post">
|
|
30
30
|
<%= csrf_tag %>
|
|
31
|
-
<input class="btn btn-danger" type="submit" name="delete" title="This will delete all jobs within the queue, it will reappear if you push more jobs to it in the future." value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSureDeleteQueue', :queue => h(queue.name)) %>"
|
|
31
|
+
<input class="btn btn-danger" type="submit" name="delete" title="This will delete all jobs within the queue, it will reappear if you push more jobs to it in the future." value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSureDeleteQueue', :queue => h(queue.name)) %>">
|
|
32
32
|
|
|
33
33
|
<% if Sidekiq.pro? %>
|
|
34
34
|
<% if queue.paused? %>
|
|
35
|
-
<input class="btn btn-danger" type="submit" name="unpause" value="<%= t('Unpause') %>"
|
|
35
|
+
<input class="btn btn-danger" type="submit" name="unpause" value="<%= t('Unpause') %>">
|
|
36
36
|
<% else %>
|
|
37
|
-
<input class="btn btn-danger" type="submit" name="pause" value="<%= t('Pause') %>"
|
|
37
|
+
<input class="btn btn-danger" type="submit" name="pause" value="<%= t('Pause') %>">
|
|
38
38
|
<% end %>
|
|
39
39
|
<% end %>
|
|
40
40
|
</form>
|
data/web/views/retries.erb
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<tr>
|
|
17
17
|
<th>
|
|
18
18
|
<label>
|
|
19
|
-
<input type="checkbox" class="check_all"
|
|
19
|
+
<input type="checkbox" class="check_all check-all-items">
|
|
20
20
|
</label>
|
|
21
21
|
</th>
|
|
22
22
|
<th><%= t('NextRetry') %></th>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<tr>
|
|
32
32
|
<td>
|
|
33
33
|
<label>
|
|
34
|
-
<input type=
|
|
34
|
+
<input type="checkbox" name="key[]" value="<%= job_params(entry.item, entry.score) %>" class="shift_clickable select-item-checkbox">
|
|
35
35
|
</label>
|
|
36
36
|
</td>
|
|
37
37
|
<td>
|
|
@@ -58,9 +58,13 @@
|
|
|
58
58
|
</table>
|
|
59
59
|
</div>
|
|
60
60
|
<div class="buttons-row">
|
|
61
|
-
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>"
|
|
62
|
-
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>"
|
|
63
|
-
<input class="btn btn-danger" type="submit" name="kill" value="<%= t('Kill') %>"
|
|
61
|
+
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>">
|
|
62
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
63
|
+
<input class="btn btn-danger" type="submit" name="kill" value="<%= t('Kill') %>">
|
|
64
|
+
<!-- Retry all -->
|
|
65
|
+
<button class="btn btn-primary bulk-action-buttons bulk-lead-button" type="submit" name="action" value="retry_all" formaction="<%= "#{root_path}retries/all/retry" %>"><%= t('RetryAll') %></button>
|
|
66
|
+
<button class="btn btn-danger bulk-action-buttons" type="submit" name="action" value="delete_all" formaction="<%= "#{root_path}retries/all/delete" %>" data-confirm="<%= t('AreYouSure') %>"><%= t('DeleteAll') %></button>
|
|
67
|
+
<button class="btn btn-danger bulk-action-buttons" type="submit" name="action" value="kill_all" formaction="<%= "#{root_path}retries/all/kill" %>"><%= t('KillAll') %></button>
|
|
64
68
|
</div>
|
|
65
69
|
</form>
|
|
66
70
|
|
data/web/views/retry.erb
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<form action="<%= root_path %>retries/<%= job_params(@retry, @retry.score) %>" method="post">
|
|
34
34
|
<%= csrf_tag %>
|
|
35
35
|
<a class="btn btn-default" href="<%= root_path %>retries"><%= t('GoBack') %></a>
|
|
36
|
-
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>"
|
|
37
|
-
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>"
|
|
36
|
+
<input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>">
|
|
37
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
38
38
|
</form>
|
|
39
39
|
</section>
|
data/web/views/scheduled.erb
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<tr>
|
|
17
17
|
<th>
|
|
18
18
|
<label>
|
|
19
|
-
<input type="checkbox" class="check_all"
|
|
19
|
+
<input type="checkbox" class="check_all check-all-items">
|
|
20
20
|
</label>
|
|
21
21
|
</th>
|
|
22
22
|
<th><%= t('When') %></th>
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<tr>
|
|
30
30
|
<td>
|
|
31
31
|
<label>
|
|
32
|
-
<input type=
|
|
32
|
+
<input type="checkbox" name="key[]" value="<%= job_params(entry.item, entry.score) %>" class="shift_clickable select-item-checkbox">
|
|
33
33
|
</label>
|
|
34
34
|
</td>
|
|
35
35
|
<td>
|
|
@@ -51,8 +51,12 @@
|
|
|
51
51
|
<% end %>
|
|
52
52
|
</table>
|
|
53
53
|
</div>
|
|
54
|
-
<
|
|
55
|
-
|
|
54
|
+
<div class="buttons-row">
|
|
55
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
56
|
+
<input class="btn btn-danger" type="submit" name="add_to_queue" value="<%= t('AddToQueue') %>">
|
|
57
|
+
<button class="btn btn-danger bulk-action-buttons bulk-lead-button" type="submit" name="action" value="delete_all" formaction="<%= "#{root_path}scheduled/all/delete" %>" data-confirm="<%= t('AreYouSure') %>"><%= t('DeleteAll') %></button>
|
|
58
|
+
<button class="btn btn-danger bulk-action-buttons" type="submit" name="action" value="add_all_to_queue" formaction="<%= "#{root_path}scheduled/all/add_to_queue" %>"><%= t('AddAllToQueue') %></button>
|
|
59
|
+
</div>
|
|
56
60
|
</form>
|
|
57
61
|
<% else %>
|
|
58
62
|
<div class="alert alert-success"><%= t('NoScheduledFound') %></div>
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
<form action="<%= root_path %>scheduled/<%= job_params(@job, @job.score) %>" method="post">
|
|
4
4
|
<%= csrf_tag %>
|
|
5
5
|
<a class="btn btn-default" href="<%= root_path %>scheduled"><%= t('GoBack') %></a>
|
|
6
|
-
<input class="btn btn-primary" type="submit" name="add_to_queue" value="<%= t('AddToQueue') %>"
|
|
7
|
-
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>"
|
|
6
|
+
<input class="btn btn-primary" type="submit" name="add_to_queue" value="<%= t('AddToQueue') %>">
|
|
7
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
|
|
8
8
|
</form>
|