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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +81 -0
  3. data/bin/sidekiqload +21 -12
  4. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +75 -0
  5. data/lib/generators/sidekiq/job_generator.rb +2 -0
  6. data/lib/sidekiq/api.rb +62 -33
  7. data/lib/sidekiq/capsule.rb +5 -3
  8. data/lib/sidekiq/cli.rb +1 -1
  9. data/lib/sidekiq/client.rb +21 -1
  10. data/lib/sidekiq/component.rb +22 -0
  11. data/lib/sidekiq/config.rb +22 -2
  12. data/lib/sidekiq/deploy.rb +2 -0
  13. data/lib/sidekiq/embedded.rb +2 -0
  14. data/lib/sidekiq/iterable_job.rb +2 -0
  15. data/lib/sidekiq/job/interrupt_handler.rb +2 -0
  16. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +3 -3
  17. data/lib/sidekiq/job/iterable.rb +69 -6
  18. data/lib/sidekiq/job_logger.rb +11 -23
  19. data/lib/sidekiq/job_util.rb +2 -0
  20. data/lib/sidekiq/launcher.rb +1 -1
  21. data/lib/sidekiq/metrics/query.rb +2 -0
  22. data/lib/sidekiq/metrics/shared.rb +15 -4
  23. data/lib/sidekiq/metrics/tracking.rb +13 -5
  24. data/lib/sidekiq/middleware/current_attributes.rb +19 -2
  25. data/lib/sidekiq/middleware/modules.rb +2 -0
  26. data/lib/sidekiq/monitor.rb +2 -1
  27. data/lib/sidekiq/paginator.rb +6 -0
  28. data/lib/sidekiq/processor.rb +10 -10
  29. data/lib/sidekiq/rails.rb +12 -0
  30. data/lib/sidekiq/redis_connection.rb +8 -1
  31. data/lib/sidekiq/ring_buffer.rb +2 -0
  32. data/lib/sidekiq/systemd.rb +2 -0
  33. data/lib/sidekiq/testing.rb +5 -5
  34. data/lib/sidekiq/version.rb +5 -1
  35. data/lib/sidekiq/web/action.rb +20 -4
  36. data/lib/sidekiq/web/application.rb +36 -79
  37. data/lib/sidekiq/web/helpers.rb +11 -10
  38. data/lib/sidekiq/web/router.rb +5 -2
  39. data/lib/sidekiq/web.rb +8 -1
  40. data/lib/sidekiq.rb +4 -3
  41. data/sidekiq.gemspec +1 -1
  42. data/web/assets/javascripts/dashboard-charts.js +2 -0
  43. data/web/assets/javascripts/dashboard.js +6 -0
  44. data/web/assets/stylesheets/application.css +9 -8
  45. data/web/locales/en.yml +3 -1
  46. data/web/locales/fr.yml +0 -1
  47. data/web/locales/gd.yml +0 -1
  48. data/web/locales/it.yml +32 -1
  49. data/web/locales/ja.yml +0 -1
  50. data/web/locales/pt-br.yml +1 -2
  51. data/web/locales/tr.yml +1 -2
  52. data/web/locales/uk.yml +24 -1
  53. data/web/locales/zh-cn.yml +0 -1
  54. data/web/locales/zh-tw.yml +0 -1
  55. data/web/views/_footer.erb +1 -2
  56. data/web/views/dashboard.erb +4 -1
  57. data/web/views/filtering.erb +1 -2
  58. data/web/views/metrics.erb +3 -4
  59. data/web/views/morgue.erb +2 -2
  60. data/web/views/queue.erb +1 -1
  61. 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
- @count = (params["count"] || 25).to_i
157
- (@current_page, @total_size, @dead) = page("dead", params["page"], @count, reverse: true)
158
- @dead = @dead.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
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 params["key"]
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[:key]
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
- @count = (params["count"] || 25).to_i
211
- (@current_page, @total_size, @retries) = page("retry", params["page"], @count)
212
- @retries = @retries.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
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
- @count = (params["count"] || 25).to_i
266
- (@current_page, @total_size, @scheduled) = page("schedule", params["page"], @count)
267
- @scheduled = @scheduled.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
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]]
@@ -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
- @strings ||= {}
55
+ @@strings ||= {}
56
56
 
57
57
  # Allow sidekiq-web extensions to add locale paths
58
58
  # so extensions can be localized
59
- @strings[lang] ||= settings.locales.each_with_object({}) do |path, global|
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
- @strings = nil
81
- @locale_files = nil
82
- @available_locales = nil
80
+ @@strings = nil
81
+ @@locale_files = nil
82
+ @@available_locales = nil
83
83
  end
84
84
 
85
85
  def locale_files
86
- @locale_files ||= settings.locales.flat_map { |path|
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
- @available_locales ||= Set.new(locale_files.map { |path| File.basename(path, ".yml") })
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}filter/#{within}?substr=#{jid}'>#{::Rack::Utils.escape_html(jid)}</a>"
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
- yield unless env["PATH_INFO"].start_with?("/filter/")
187
+ s = url_params("substr")
188
+ yield unless s && s.size > 0
188
189
  end
189
190
 
190
191
  def get_locale
@@ -39,10 +39,13 @@ module Sidekiq
39
39
  route(DELETE, path, &block)
40
40
  end
41
41
 
42
- def route(method, path, &block)
42
+ def route(*methods, path, &block)
43
43
  @routes ||= {GET => [], POST => [], PUT => [], PATCH => [], DELETE => [], HEAD => []}
44
44
 
45
- @routes[method] << WebRoute.new(method, path, block)
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, __FILE__, __LINE__ + 1
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
- # inst = Sidekiq.configure_embed do |config|
112
+ # instance = Sidekiq.configure_embed do |config|
112
113
  # config.queues = %w[critical default low]
113
114
  # end
114
- # inst.run
115
+ # instance.run
115
116
  # sleep 10
116
- # inst.stop
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: 250px;
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: 490px;
662
+ max-width: 380px;
662
663
  }
663
664
  }
664
665
  @media (min-width: 1200px) {
665
666
  .redis-url {
666
- max-width: 600px;
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
@@ -95,5 +95,4 @@ fr:
95
95
  TotalExecutionTime: Temps d'exécution total
96
96
  AvgExecutionTime: Temps d'exécution moyen
97
97
  Context: Contexte
98
- Bucket: Bucket
99
98
  NoJobMetricsFound: Aucune statistique de tâche récente n'a été trouvée
data/web/locales/gd.yml CHANGED
@@ -95,5 +95,4 @@ gd:
95
95
  TotalExecutionTime: Ùine iomlan nan gnìomhan
96
96
  AvgExecutionTime: Ùine cuibheasach nan gnìomhan
97
97
  Context: Co-theacsa
98
- Bucket: Bucaid
99
98
  NoJobMetricsFound: Cha deach meatraigeachd o chionn goirid air obair a lorg
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: Thread
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
@@ -87,5 +87,4 @@ ja:
87
87
  TotalExecutionTime: 合計実行時間
88
88
  AvgExecutionTime: 平均実行時間
89
89
  Context: コンテキスト
90
- Bucket: バケット
91
90
  NoJobMetricsFound: 直近のジョブメトリクスが見つかりませんでした
@@ -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: Будь-який атрибут задачі
@@ -89,7 +89,6 @@ zh-cn: # <---- change this to your locale code
89
89
  TotalExecutionTime: 总执行时间
90
90
  AvgExecutionTime: 平均执行时间
91
91
  Context: 上下文
92
- Bucket: 桶
93
92
  NoJobMetricsFound: 无任务相关指标数据
94
93
  Success: 成功
95
94
  Failure: 失败
@@ -98,5 +98,4 @@ zh-tw: # <---- change this to your locale code
98
98
  TotalExecutionTime: 總執行時間
99
99
  AvgExecutionTime: 平均執行時間
100
100
  Context: 上下文
101
- Bucket: 桶
102
101
  NoJobMetricsFound: 找無工作相關計量資料
@@ -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
- <label class="sr-only" for="locale">Language</label>
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>