sidekiq 7.3.0 → 7.3.9
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 +81 -0
- data/bin/sidekiqload +21 -12
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +75 -0
- data/lib/generators/sidekiq/job_generator.rb +2 -0
- data/lib/sidekiq/api.rb +62 -33
- data/lib/sidekiq/capsule.rb +5 -3
- data/lib/sidekiq/cli.rb +1 -1
- data/lib/sidekiq/client.rb +21 -1
- data/lib/sidekiq/component.rb +22 -0
- data/lib/sidekiq/config.rb +22 -2
- data/lib/sidekiq/deploy.rb +2 -0
- data/lib/sidekiq/embedded.rb +2 -0
- data/lib/sidekiq/iterable_job.rb +2 -0
- data/lib/sidekiq/job/interrupt_handler.rb +2 -0
- data/lib/sidekiq/job/iterable/active_record_enumerator.rb +3 -3
- data/lib/sidekiq/job/iterable.rb +69 -6
- data/lib/sidekiq/job_logger.rb +11 -23
- data/lib/sidekiq/job_util.rb +2 -0
- data/lib/sidekiq/launcher.rb +1 -1
- data/lib/sidekiq/metrics/query.rb +2 -0
- data/lib/sidekiq/metrics/shared.rb +15 -4
- data/lib/sidekiq/metrics/tracking.rb +13 -5
- data/lib/sidekiq/middleware/current_attributes.rb +19 -2
- data/lib/sidekiq/middleware/modules.rb +2 -0
- data/lib/sidekiq/monitor.rb +2 -1
- data/lib/sidekiq/paginator.rb +6 -0
- data/lib/sidekiq/processor.rb +10 -10
- data/lib/sidekiq/rails.rb +12 -0
- data/lib/sidekiq/redis_connection.rb +8 -1
- data/lib/sidekiq/ring_buffer.rb +2 -0
- data/lib/sidekiq/systemd.rb +2 -0
- data/lib/sidekiq/testing.rb +5 -5
- data/lib/sidekiq/version.rb +5 -1
- data/lib/sidekiq/web/action.rb +20 -4
- data/lib/sidekiq/web/application.rb +36 -79
- data/lib/sidekiq/web/helpers.rb +11 -10
- data/lib/sidekiq/web/router.rb +5 -2
- data/lib/sidekiq/web.rb +8 -1
- data/lib/sidekiq.rb +4 -3
- data/sidekiq.gemspec +1 -1
- data/web/assets/javascripts/dashboard-charts.js +2 -0
- data/web/assets/javascripts/dashboard.js +6 -0
- data/web/assets/stylesheets/application.css +9 -8
- data/web/locales/en.yml +3 -1
- data/web/locales/fr.yml +0 -1
- data/web/locales/gd.yml +0 -1
- data/web/locales/it.yml +32 -1
- data/web/locales/ja.yml +0 -1
- data/web/locales/pt-br.yml +1 -2
- data/web/locales/tr.yml +1 -2
- data/web/locales/uk.yml +24 -1
- data/web/locales/zh-cn.yml +0 -1
- data/web/locales/zh-tw.yml +0 -1
- data/web/views/_footer.erb +1 -2
- data/web/views/dashboard.erb +4 -1
- data/web/views/filtering.erb +1 -2
- data/web/views/metrics.erb +3 -4
- data/web/views/morgue.erb +2 -2
- data/web/views/queue.erb +1 -1
- metadata +10 -12
@@ -67,11 +67,15 @@ module Sidekiq
|
|
67
67
|
end
|
68
68
|
|
69
69
|
get "/metrics" do
|
70
|
+
x = params[:substr]
|
71
|
+
class_filter = (x.nil? || x == "") ? nil : Regexp.new(Regexp.escape(x), Regexp::IGNORECASE)
|
72
|
+
|
70
73
|
q = Sidekiq::Metrics::Query.new
|
71
74
|
@period = h((params[:period] || "")[0..1])
|
72
75
|
@periods = METRICS_PERIODS
|
73
76
|
minutes = @periods.fetch(@period, @periods.values.first)
|
74
|
-
@query_result = q.top_jobs(minutes: minutes)
|
77
|
+
@query_result = q.top_jobs(minutes: minutes, class_filter: class_filter)
|
78
|
+
|
75
79
|
erb(:metrics)
|
76
80
|
end
|
77
81
|
|
@@ -153,9 +157,15 @@ module Sidekiq
|
|
153
157
|
end
|
154
158
|
|
155
159
|
get "/morgue" do
|
156
|
-
|
157
|
-
|
158
|
-
|
160
|
+
x = params[:substr]
|
161
|
+
|
162
|
+
if x && x != ""
|
163
|
+
@dead = search(Sidekiq::DeadSet.new, x)
|
164
|
+
else
|
165
|
+
@count = (params["count"] || 25).to_i
|
166
|
+
(@current_page, @total_size, @dead) = page("dead", params["page"], @count, reverse: true)
|
167
|
+
@dead = @dead.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
168
|
+
end
|
159
169
|
|
160
170
|
erb(:morgue)
|
161
171
|
end
|
@@ -174,7 +184,7 @@ module Sidekiq
|
|
174
184
|
end
|
175
185
|
|
176
186
|
post "/morgue" do
|
177
|
-
redirect(request.path) unless
|
187
|
+
redirect(request.path) unless url_params("key")
|
178
188
|
|
179
189
|
params["key"].each do |key|
|
180
190
|
job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
|
@@ -197,7 +207,7 @@ module Sidekiq
|
|
197
207
|
end
|
198
208
|
|
199
209
|
post "/morgue/:key" do
|
200
|
-
key = route_params
|
210
|
+
key = route_params(:key)
|
201
211
|
halt(404) unless key
|
202
212
|
|
203
213
|
job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
|
@@ -207,9 +217,15 @@ module Sidekiq
|
|
207
217
|
end
|
208
218
|
|
209
219
|
get "/retries" do
|
210
|
-
|
211
|
-
|
212
|
-
|
220
|
+
x = url_params("substr")
|
221
|
+
|
222
|
+
if x && x != ""
|
223
|
+
@retries = search(Sidekiq::RetrySet.new, x)
|
224
|
+
else
|
225
|
+
@count = (params["count"] || 25).to_i
|
226
|
+
(@current_page, @total_size, @retries) = page("retry", params["page"], @count)
|
227
|
+
@retries = @retries.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
228
|
+
end
|
213
229
|
|
214
230
|
erb(:retries)
|
215
231
|
end
|
@@ -262,9 +278,15 @@ module Sidekiq
|
|
262
278
|
end
|
263
279
|
|
264
280
|
get "/scheduled" do
|
265
|
-
|
266
|
-
|
267
|
-
|
281
|
+
x = params[:substr]
|
282
|
+
|
283
|
+
if x && x != ""
|
284
|
+
@scheduled = search(Sidekiq::ScheduledSet.new, x)
|
285
|
+
else
|
286
|
+
@count = (params["count"] || 25).to_i
|
287
|
+
(@current_page, @total_size, @scheduled) = page("schedule", params["page"], @count)
|
288
|
+
@scheduled = @scheduled.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
289
|
+
end
|
268
290
|
|
269
291
|
erb(:scheduled)
|
270
292
|
end
|
@@ -328,72 +350,6 @@ module Sidekiq
|
|
328
350
|
json Sidekiq::Stats.new.queues
|
329
351
|
end
|
330
352
|
|
331
|
-
########
|
332
|
-
# Filtering
|
333
|
-
|
334
|
-
get "/filter/metrics" do
|
335
|
-
redirect "#{root_path}metrics"
|
336
|
-
end
|
337
|
-
|
338
|
-
post "/filter/metrics" do
|
339
|
-
x = params[:substr]
|
340
|
-
q = Sidekiq::Metrics::Query.new
|
341
|
-
@period = h((params[:period] || "")[0..1])
|
342
|
-
@periods = METRICS_PERIODS
|
343
|
-
minutes = @periods.fetch(@period, @periods.values.first)
|
344
|
-
@query_result = q.top_jobs(minutes: minutes, class_filter: Regexp.new(Regexp.escape(x), Regexp::IGNORECASE))
|
345
|
-
|
346
|
-
erb :metrics
|
347
|
-
end
|
348
|
-
|
349
|
-
get "/filter/retries" do
|
350
|
-
x = params[:substr]
|
351
|
-
return redirect "#{root_path}retries" unless x && x != ""
|
352
|
-
|
353
|
-
@retries = search(Sidekiq::RetrySet.new, params[:substr])
|
354
|
-
erb :retries
|
355
|
-
end
|
356
|
-
|
357
|
-
post "/filter/retries" do
|
358
|
-
x = params[:substr]
|
359
|
-
return redirect "#{root_path}retries" unless x && x != ""
|
360
|
-
|
361
|
-
@retries = search(Sidekiq::RetrySet.new, params[:substr])
|
362
|
-
erb :retries
|
363
|
-
end
|
364
|
-
|
365
|
-
get "/filter/scheduled" do
|
366
|
-
x = params[:substr]
|
367
|
-
return redirect "#{root_path}scheduled" unless x && x != ""
|
368
|
-
|
369
|
-
@scheduled = search(Sidekiq::ScheduledSet.new, params[:substr])
|
370
|
-
erb :scheduled
|
371
|
-
end
|
372
|
-
|
373
|
-
post "/filter/scheduled" do
|
374
|
-
x = params[:substr]
|
375
|
-
return redirect "#{root_path}scheduled" unless x && x != ""
|
376
|
-
|
377
|
-
@scheduled = search(Sidekiq::ScheduledSet.new, params[:substr])
|
378
|
-
erb :scheduled
|
379
|
-
end
|
380
|
-
|
381
|
-
get "/filter/dead" do
|
382
|
-
x = params[:substr]
|
383
|
-
return redirect "#{root_path}morgue" unless x && x != ""
|
384
|
-
|
385
|
-
@dead = search(Sidekiq::DeadSet.new, params[:substr])
|
386
|
-
erb :morgue
|
387
|
-
end
|
388
|
-
|
389
|
-
post "/filter/dead" do
|
390
|
-
x = params[:substr]
|
391
|
-
return redirect "#{root_path}morgue" unless x && x != ""
|
392
|
-
|
393
|
-
@dead = search(Sidekiq::DeadSet.new, params[:substr])
|
394
|
-
erb :morgue
|
395
|
-
end
|
396
|
-
|
397
353
|
post "/change_locale" do
|
398
354
|
locale = params["locale"]
|
399
355
|
|
@@ -428,7 +384,8 @@ module Sidekiq
|
|
428
384
|
Rack::CONTENT_TYPE => "text/html",
|
429
385
|
Rack::CACHE_CONTROL => "private, no-store",
|
430
386
|
Web::CONTENT_LANGUAGE => action.locale,
|
431
|
-
Web::CONTENT_SECURITY_POLICY => process_csp(env, CSP_HEADER_TEMPLATE)
|
387
|
+
Web::CONTENT_SECURITY_POLICY => process_csp(env, CSP_HEADER_TEMPLATE),
|
388
|
+
Web::X_CONTENT_TYPE_OPTIONS => "nosniff"
|
432
389
|
}
|
433
390
|
# we'll let Rack calculate Content-Length for us.
|
434
391
|
[200, headers, [resp]]
|
data/lib/sidekiq/web/helpers.rb
CHANGED
@@ -36,7 +36,7 @@ module Sidekiq
|
|
36
36
|
# NB: keys and values are not escaped; do not allow user input
|
37
37
|
# in the attributes
|
38
38
|
private def html_tag(tagname, attrs)
|
39
|
-
s = "<#{tagname}"
|
39
|
+
s = +"<#{tagname}"
|
40
40
|
attrs.each_pair do |k, v|
|
41
41
|
next unless v
|
42
42
|
s << " #{k}=\"#{v}\""
|
@@ -52,11 +52,11 @@ module Sidekiq
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def strings(lang)
|
55
|
-
|
55
|
+
@@strings ||= {}
|
56
56
|
|
57
57
|
# Allow sidekiq-web extensions to add locale paths
|
58
58
|
# so extensions can be localized
|
59
|
-
|
59
|
+
@@strings[lang] ||= settings.locales.each_with_object({}) do |path, global|
|
60
60
|
find_locale_files(lang).each do |file|
|
61
61
|
strs = YAML.safe_load(File.read(file))
|
62
62
|
global.merge!(strs[lang])
|
@@ -77,19 +77,19 @@ module Sidekiq
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def clear_caches
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
@@strings = nil
|
81
|
+
@@locale_files = nil
|
82
|
+
@@available_locales = nil
|
83
83
|
end
|
84
84
|
|
85
85
|
def locale_files
|
86
|
-
|
86
|
+
@@locale_files ||= settings.locales.flat_map { |path|
|
87
87
|
Dir["#{path}/*.yml"]
|
88
88
|
}
|
89
89
|
end
|
90
90
|
|
91
91
|
def available_locales
|
92
|
-
|
92
|
+
@@available_locales ||= Set.new(locale_files.map { |path| File.basename(path, ".yml") })
|
93
93
|
end
|
94
94
|
|
95
95
|
def find_locale_files(lang)
|
@@ -111,7 +111,7 @@ module Sidekiq
|
|
111
111
|
if within.nil?
|
112
112
|
::Rack::Utils.escape_html(jid)
|
113
113
|
else
|
114
|
-
"<a href='#{root_path}
|
114
|
+
"<a href='#{root_path}#{within}?substr=#{jid}'>#{::Rack::Utils.escape_html(jid)}</a>"
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
@@ -184,7 +184,8 @@ module Sidekiq
|
|
184
184
|
|
185
185
|
# sidekiq/sidekiq#3243
|
186
186
|
def unfiltered?
|
187
|
-
|
187
|
+
s = url_params("substr")
|
188
|
+
yield unless s && s.size > 0
|
188
189
|
end
|
189
190
|
|
190
191
|
def get_locale
|
data/lib/sidekiq/web/router.rb
CHANGED
@@ -39,10 +39,13 @@ module Sidekiq
|
|
39
39
|
route(DELETE, path, &block)
|
40
40
|
end
|
41
41
|
|
42
|
-
def route(
|
42
|
+
def route(*methods, path, &block)
|
43
43
|
@routes ||= {GET => [], POST => [], PUT => [], PATCH => [], DELETE => [], HEAD => []}
|
44
44
|
|
45
|
-
|
45
|
+
methods.each do |method|
|
46
|
+
method = method.to_s.upcase
|
47
|
+
@routes[method] << WebRoute.new(method, path, block)
|
48
|
+
end
|
46
49
|
end
|
47
50
|
|
48
51
|
def match(env)
|
data/lib/sidekiq/web.rb
CHANGED
@@ -40,14 +40,21 @@ module Sidekiq
|
|
40
40
|
CONTENT_SECURITY_POLICY = "Content-Security-Policy"
|
41
41
|
LOCATION = "Location"
|
42
42
|
X_CASCADE = "X-Cascade"
|
43
|
+
X_CONTENT_TYPE_OPTIONS = "X-Content-Type-Options"
|
43
44
|
else
|
44
45
|
CONTENT_LANGUAGE = "content-language"
|
45
46
|
CONTENT_SECURITY_POLICY = "content-security-policy"
|
46
47
|
LOCATION = "location"
|
47
48
|
X_CASCADE = "x-cascade"
|
49
|
+
X_CONTENT_TYPE_OPTIONS = "x-content-type-options"
|
48
50
|
end
|
49
51
|
|
50
52
|
class << self
|
53
|
+
# Forward compatibility with 8.0
|
54
|
+
def configure
|
55
|
+
yield self
|
56
|
+
end
|
57
|
+
|
51
58
|
def settings
|
52
59
|
self
|
53
60
|
end
|
@@ -211,7 +218,7 @@ module Sidekiq
|
|
211
218
|
Sidekiq::WebApplication.helpers WebHelpers
|
212
219
|
Sidekiq::WebApplication.helpers Sidekiq::Paginator
|
213
220
|
|
214
|
-
Sidekiq::WebAction.class_eval <<-RUBY,
|
221
|
+
Sidekiq::WebAction.class_eval <<-RUBY, Web::LAYOUT, -1 # standard:disable Style/EvalWithLocation
|
215
222
|
def _render
|
216
223
|
#{ERB.new(File.read(Web::LAYOUT)).src}
|
217
224
|
end
|
data/lib/sidekiq.rb
CHANGED
@@ -102,18 +102,19 @@ module Sidekiq
|
|
102
102
|
def self.freeze!
|
103
103
|
@frozen = true
|
104
104
|
@config_blocks = nil
|
105
|
+
default_configuration.freeze!
|
105
106
|
end
|
106
107
|
|
107
108
|
# Creates a Sidekiq::Config instance that is more tuned for embedding
|
108
109
|
# within an arbitrary Ruby process. Notably it reduces concurrency by
|
109
110
|
# default so there is less contention for CPU time with other threads.
|
110
111
|
#
|
111
|
-
#
|
112
|
+
# instance = Sidekiq.configure_embed do |config|
|
112
113
|
# config.queues = %w[critical default low]
|
113
114
|
# end
|
114
|
-
#
|
115
|
+
# instance.run
|
115
116
|
# sleep 10
|
116
|
-
#
|
117
|
+
# instance.stop
|
117
118
|
#
|
118
119
|
# NB: it is really easy to overload a Ruby process with threads due to the GIL.
|
119
120
|
# I do not recommend setting concurrency higher than 2-3.
|
data/sidekiq.gemspec
CHANGED
@@ -26,6 +26,6 @@ Gem::Specification.new do |gem|
|
|
26
26
|
gem.add_dependency "redis-client", ">= 0.22.2"
|
27
27
|
gem.add_dependency "connection_pool", ">= 2.3.0"
|
28
28
|
gem.add_dependency "rack", ">= 2.2.4"
|
29
|
-
gem.add_dependency "concurrent-ruby", "< 2"
|
30
29
|
gem.add_dependency "logger"
|
30
|
+
gem.add_dependency "base64"
|
31
31
|
end
|
@@ -83,6 +83,8 @@ class RealtimeChart extends DashboardChart {
|
|
83
83
|
this.chart.data.datasets[1].data.push(failed);
|
84
84
|
this.chart.update();
|
85
85
|
|
86
|
+
updateScreenReaderDashboardValues(processed, failed);
|
87
|
+
|
86
88
|
updateStatsSummary(this.stats.sidekiq);
|
87
89
|
updateRedisStats(this.stats.redis);
|
88
90
|
updateFooterUTCTime(this.stats.server_utc_time);
|
@@ -36,6 +36,12 @@ var ready = (callback) => {
|
|
36
36
|
else document.addEventListener("DOMContentLoaded", callback);
|
37
37
|
}
|
38
38
|
|
39
|
+
var updateScreenReaderDashboardValues = function(processed, failed) {
|
40
|
+
let lastDashboardUpdateSpan = document.getElementById("sr-last-dashboard-update");
|
41
|
+
var updateText = document.getElementById("sr-last-dashboard-update-template").innerText;
|
42
|
+
lastDashboardUpdateSpan.innerText = updateText.replace("PROCESSED_COUNT", processed).replace("FAILED_COUNT", failed);
|
43
|
+
}
|
44
|
+
|
39
45
|
ready(() => {
|
40
46
|
var sldr = document.getElementById('sldr');
|
41
47
|
if (typeof localStorage.sidekiqTimeInterval !== 'undefined') {
|
@@ -634,12 +634,8 @@ div.interval-slider input {
|
|
634
634
|
.container {
|
635
635
|
padding: 0;
|
636
636
|
}
|
637
|
-
.navbar-fixed-bottom {
|
638
|
-
position: relative;
|
639
|
-
top: auto;
|
640
|
-
}
|
641
637
|
@media (max-width: 767px) {
|
642
|
-
.navbar-fixed-top {
|
638
|
+
.navbar-fixed-top, .navbar-fixed-bottom {
|
643
639
|
position: relative;
|
644
640
|
top: auto;
|
645
641
|
}
|
@@ -652,18 +648,23 @@ div.interval-slider input {
|
|
652
648
|
|
653
649
|
@media (min-width: 768px) {
|
654
650
|
.redis-url {
|
655
|
-
max-width:
|
651
|
+
max-width: 160px;
|
652
|
+
}
|
653
|
+
|
654
|
+
.navbar-fixed-bottom .nav {
|
655
|
+
margin-left: -15px;
|
656
|
+
margin-right: -15px;
|
656
657
|
}
|
657
658
|
}
|
658
659
|
|
659
660
|
@media (min-width: 992px) {
|
660
661
|
.redis-url {
|
661
|
-
max-width:
|
662
|
+
max-width: 380px;
|
662
663
|
}
|
663
664
|
}
|
664
665
|
@media (min-width: 1200px) {
|
665
666
|
.redis-url {
|
666
|
-
max-width:
|
667
|
+
max-width: 580px;
|
667
668
|
}
|
668
669
|
}
|
669
670
|
|
data/web/locales/en.yml
CHANGED
@@ -34,6 +34,8 @@ en:
|
|
34
34
|
Jobs: Jobs
|
35
35
|
Kill: Kill
|
36
36
|
KillAll: Kill All
|
37
|
+
Language: Language
|
38
|
+
LastDashboardUpdateTemplateLiteral: "Latest poll: Processed: PROCESSED_COUNT. Failed: FAILED_COUNT."
|
37
39
|
LastRetry: Last Retry
|
38
40
|
Latency: Latency
|
39
41
|
LivePoll: Live Poll
|
@@ -53,6 +55,7 @@ en:
|
|
53
55
|
PeakMemoryUsage: Peak Memory Usage
|
54
56
|
Plugins: Plugins
|
55
57
|
PollingInterval: Polling interval
|
58
|
+
PollingIntervalMilliseconds: Polling interval milliseconds
|
56
59
|
Process: Process
|
57
60
|
Processed: Processed
|
58
61
|
Processes: Processes
|
@@ -95,7 +98,6 @@ en:
|
|
95
98
|
TotalExecutionTime: Total Execution Time
|
96
99
|
AvgExecutionTime: Average Execution Time
|
97
100
|
Context: Context
|
98
|
-
Bucket: Bucket
|
99
101
|
NoJobMetricsFound: No recent job metrics were found
|
100
102
|
Filter: Filter
|
101
103
|
AnyJobContent: Any job content
|
data/web/locales/fr.yml
CHANGED
data/web/locales/gd.yml
CHANGED
data/web/locales/it.yml
CHANGED
@@ -6,44 +6,60 @@ it:
|
|
6
6
|
AreYouSureDeleteJob: Sei sicuro di voler cancellare questo lavoro?
|
7
7
|
AreYouSureDeleteQueue: Sei sicuro di voler cancellare la coda %{queue}?
|
8
8
|
Arguments: Argomenti
|
9
|
+
BackToApp: Torna all'App
|
9
10
|
Busy: Occupato
|
10
11
|
Class: Classe
|
11
12
|
Connections: Connessioni
|
13
|
+
CreatedAt: Creato il
|
12
14
|
CurrentMessagesInQueue: Messaggi in <span class='title'>%{queue}</span>
|
13
15
|
Dashboard: Dashboard
|
14
16
|
Dead: Arrestato
|
15
17
|
DeadJobs: Lavori arrestati
|
16
18
|
Delete: Cancella
|
17
19
|
DeleteAll: Cancella tutti
|
20
|
+
Deploy: Distribuire
|
18
21
|
Enqueued: In coda
|
19
22
|
Error: Errore
|
20
23
|
ErrorBacktrace: Backtrace dell'errore
|
21
24
|
ErrorClass: Classe dell'errore
|
22
25
|
ErrorMessage: Messaggio di errore
|
26
|
+
ExecutionTime: Tempo di esecuzione
|
23
27
|
Extras: Extra
|
24
28
|
Failed: Fallito
|
25
29
|
Failures: Fallimenti
|
30
|
+
Failure: Fallimento
|
26
31
|
GoBack: ← Indietro
|
27
32
|
History: Storia
|
28
33
|
Job: Lavoro
|
29
34
|
Jobs: Lavori
|
30
35
|
Kill: Uccidere
|
36
|
+
KillAll: Uccidere tutti
|
31
37
|
LastRetry: Ultimo tentativo
|
38
|
+
Latency: Latenza
|
32
39
|
LivePoll: Live poll
|
33
40
|
MemoryUsage: Memoria utilizzata
|
41
|
+
Name: Nome
|
34
42
|
Namespace: Namespace
|
35
43
|
NextRetry: Prossimo tentativo
|
36
44
|
NoDeadJobsFound: Non ci sono lavori arrestati
|
37
45
|
NoRetriesFound: Non sono stati trovati nuovi tentativi
|
38
46
|
NoScheduledFound: Non ci sono lavori pianificati
|
47
|
+
NotYetEnqueued: Non ancora in coda
|
39
48
|
OneMonth: 1 mese
|
40
49
|
OneWeek: 1 settimana
|
41
50
|
OriginallyFailed: Primo fallimento
|
51
|
+
Pause: Metti in pausa
|
52
|
+
Paused: In pausa
|
42
53
|
PeakMemoryUsage: Memoria utilizzata (max.)
|
54
|
+
Plugins: Plugins
|
55
|
+
PollingInterval: Intervallo di polling
|
56
|
+
Process: Processo
|
43
57
|
Processed: Processato
|
44
58
|
Processes: Processi
|
45
59
|
Queue: Coda
|
46
60
|
Queues: Code
|
61
|
+
Quiet: Silenzia
|
62
|
+
QuietAll: Silenzia Tutti
|
47
63
|
Realtime: Tempo reale
|
48
64
|
Retries: Nuovi tentativi
|
49
65
|
RetryAll: Riprova tutti
|
@@ -51,19 +67,34 @@ it:
|
|
51
67
|
RetryNow: Riprova
|
52
68
|
Scheduled: Pianificato
|
53
69
|
ScheduledJobs: Lavori pianificati
|
70
|
+
Seconds: Secondi
|
54
71
|
ShowAll: Mostra tutti
|
55
72
|
SixMonths: 6 mesi
|
56
73
|
Size: Dimensione
|
57
74
|
Started: Iniziato
|
58
75
|
Status: Stato
|
76
|
+
Stop: Ferma
|
77
|
+
StopAll: Ferma Tutti
|
59
78
|
StopPolling: Ferma il polling
|
79
|
+
Success: Successo
|
80
|
+
Summary: Riepilogo
|
60
81
|
Thread: Thread
|
61
|
-
Threads:
|
82
|
+
Threads: Threads
|
62
83
|
ThreeMonths: 3 mesi
|
63
84
|
Time: Ora
|
85
|
+
Unpause: Riattiva
|
64
86
|
Uptime: Uptime (giorni)
|
87
|
+
Utilization: Utilizzo
|
65
88
|
Version: Versione
|
66
89
|
When: Quando
|
67
90
|
Worker: Lavoratore
|
68
91
|
active: attivo
|
69
92
|
idle: inattivo
|
93
|
+
Metrics: Metriche
|
94
|
+
NoDataFound: Nessun dato trovato
|
95
|
+
TotalExecutionTime: Tempo totale di esecuzione
|
96
|
+
AvgExecutionTime: Tempo medio di esecuzione
|
97
|
+
Context: Contesto
|
98
|
+
NoJobMetricsFound: Metriche recenti di lavoro non trovate
|
99
|
+
Filter: Filtro
|
100
|
+
AnyJobContent: Qualsiasi contenuto di lavoro
|
data/web/locales/ja.yml
CHANGED
data/web/locales/pt-br.yml
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
Arguments: Argumentos
|
8
8
|
AvgExecutionTime: Tempo médio de execução
|
9
9
|
BackToApp: De volta ao aplicativo
|
10
|
-
Bucket: Bucket
|
11
10
|
Busy: Ocupados
|
12
11
|
Class: Classe
|
13
12
|
Connections: Conexões
|
@@ -93,4 +92,4 @@
|
|
93
92
|
Utilization: Utilização
|
94
93
|
Version: Versão
|
95
94
|
When: Quando
|
96
|
-
Worker: Trabalhador
|
95
|
+
Worker: Trabalhador
|
data/web/locales/tr.yml
CHANGED
@@ -4,7 +4,7 @@ tr:
|
|
4
4
|
AddToQueue: Kuyruğa ekle
|
5
5
|
AreYouSure: Emin misiniz?
|
6
6
|
AreYouSureDeleteJob: Bu işi silmek istediğinizden emin misiniz?
|
7
|
-
AreYouSureDeleteQueue: %{queue} kuyruğunu silmek istediğinizden emin misiniz?
|
7
|
+
AreYouSureDeleteQueue: "%{queue} kuyruğunu silmek istediğinizden emin misiniz?"
|
8
8
|
Arguments: Argümanlar
|
9
9
|
BackToApp: Uygulamaya geri dön
|
10
10
|
Busy: Meşgul
|
@@ -95,7 +95,6 @@ tr:
|
|
95
95
|
TotalExecutionTime: Toplam Yürütme Süresi
|
96
96
|
AvgExecutionTime: Ortalama Yürütme Süresi
|
97
97
|
Context: Bağlam
|
98
|
-
Bucket: Kova
|
99
98
|
NoJobMetricsFound: Son iş metrikleri bulunamadı
|
100
99
|
Filter: Filtre
|
101
100
|
AnyJobContent: Herhangi bir iş içeriği
|
data/web/locales/uk.yml
CHANGED
@@ -6,31 +6,39 @@ uk:
|
|
6
6
|
AreYouSureDeleteJob: Ви впевнені у тому, що хочете видалити задачу?
|
7
7
|
AreYouSureDeleteQueue: Ви впевнені у тому, що хочете видалити чергу %{queue}?
|
8
8
|
Arguments: Аргументи
|
9
|
+
BackToApp: Назад
|
9
10
|
Busy: Зайнятих
|
10
11
|
Class: Клас
|
11
12
|
Connections: З'єднань
|
13
|
+
CreatedAt: Створено
|
12
14
|
CurrentMessagesInQueue: Поточні задачі у черзі <span class='title'>%{queue}</span>
|
13
15
|
Dashboard: Панель керування
|
14
16
|
Dead: Вбитих
|
15
17
|
DeadJobs: Вбиті задачі
|
16
18
|
Delete: Видалити
|
17
19
|
DeleteAll: Видалити усі
|
20
|
+
Deploy: Деплой
|
18
21
|
Enqueued: У черзі
|
19
22
|
Error: Помилка
|
20
23
|
ErrorBacktrace: Трасування помилки
|
21
24
|
ErrorClass: Клас помилки
|
22
25
|
ErrorMessage: Повідомлення про помилку
|
26
|
+
ExecutionTime: Час виконання
|
23
27
|
Extras: Додатково
|
24
28
|
Failed: Невдалих
|
25
29
|
Failures: Невдачі
|
30
|
+
Failure: Невдача
|
26
31
|
GoBack: ← Назад
|
27
32
|
History: Історія
|
28
33
|
Job: Задача
|
29
34
|
Jobs: Задачі
|
30
|
-
Kill:
|
35
|
+
Kill: Вбити
|
36
|
+
KillAll: Вбити все
|
31
37
|
LastRetry: Остання спроба
|
38
|
+
Latency: Затримка
|
32
39
|
LivePoll: Постійне опитування
|
33
40
|
MemoryUsage: Використання пам'яті
|
41
|
+
Name: Назва
|
34
42
|
Namespace: Простір імен
|
35
43
|
NextRetry: Наступна спроба
|
36
44
|
NoDeadJobsFound: Вбитих задач не знайдено
|
@@ -40,10 +48,12 @@ uk:
|
|
40
48
|
OneMonth: 1 місяць
|
41
49
|
OneWeek: 1 тиждень
|
42
50
|
OriginallyFailed: Перша невдала спроба
|
51
|
+
Pause: Призупинити
|
43
52
|
Paused: Призупинено
|
44
53
|
PeakMemoryUsage: Максимальне використання пам'яті
|
45
54
|
Plugins: Плагіни
|
46
55
|
PollingInterval: Інтервал опитування
|
56
|
+
Process: Процес
|
47
57
|
Processed: Опрацьовано
|
48
58
|
Processes: Процеси
|
49
59
|
Queue: Черга
|
@@ -57,6 +67,7 @@ uk:
|
|
57
67
|
RetryNow: Повторити зараз
|
58
68
|
Scheduled: Заплановано
|
59
69
|
ScheduledJobs: Заплановані задачі
|
70
|
+
Seconds: Секунди
|
60
71
|
ShowAll: Відобразити усі
|
61
72
|
SixMonths: 6 місяців
|
62
73
|
Size: Розмір
|
@@ -65,13 +76,25 @@ uk:
|
|
65
76
|
Stop: Зупинити
|
66
77
|
StopAll: Зупинити усі
|
67
78
|
StopPolling: Зупинити опитування
|
79
|
+
Success: Успіх
|
80
|
+
Summary: Підсумок
|
68
81
|
Thread: Потік
|
69
82
|
Threads: Потоки
|
70
83
|
ThreeMonths: 3 місяці
|
71
84
|
Time: Час
|
85
|
+
Unpause: Відновити
|
72
86
|
Uptime: Днів безперебійної роботи
|
87
|
+
Utilization: Утилізація
|
73
88
|
Version: Версія
|
74
89
|
When: Коли
|
75
90
|
Worker: Обробник
|
76
91
|
active: активний
|
77
92
|
idle: незайнятий
|
93
|
+
Metrics: Метрики
|
94
|
+
NoDataFound: Даних не знайдено
|
95
|
+
TotalExecutionTime: Загальний час виконання
|
96
|
+
AvgExecutionTime: Середній час виконання
|
97
|
+
Context: Контекст
|
98
|
+
NoJobMetricsFound: Недавніх метрик задачі не знайдено
|
99
|
+
Filter: Фільтр
|
100
|
+
AnyJobContent: Будь-який атрибут задачі
|
data/web/locales/zh-cn.yml
CHANGED
data/web/locales/zh-tw.yml
CHANGED
data/web/views/_footer.erb
CHANGED
@@ -17,8 +17,7 @@
|
|
17
17
|
<li>
|
18
18
|
<form id="locale-form" class="form-inline" action="<%= root_path %>change_locale" method="post">
|
19
19
|
<%= csrf_tag %>
|
20
|
-
<
|
21
|
-
<select id="locale-select" class="form-control" name="locale">
|
20
|
+
<select id="locale-select" class="form-control" aria-label="<%= t("Language") %>" name="locale">
|
22
21
|
<% available_locales.each do |locale_option| %>
|
23
22
|
<% if locale_option == locale %>
|
24
23
|
<option selected value="<%= locale_option %>"><%= locale_option %></option>
|