sidekiq 7.0.3 → 7.1.2

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

Potentially problematic release.


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

Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +82 -9
  3. data/README.md +29 -22
  4. data/bin/sidekiqload +204 -109
  5. data/bin/sidekiqmon +3 -0
  6. data/lib/sidekiq/api.rb +33 -10
  7. data/lib/sidekiq/capsule.rb +1 -0
  8. data/lib/sidekiq/cli.rb +3 -2
  9. data/lib/sidekiq/client.rb +33 -20
  10. data/lib/sidekiq/component.rb +3 -1
  11. data/lib/sidekiq/config.rb +12 -4
  12. data/lib/sidekiq/embedded.rb +1 -1
  13. data/lib/sidekiq/fetch.rb +1 -1
  14. data/lib/sidekiq/job.rb +1 -5
  15. data/lib/sidekiq/job_retry.rb +8 -5
  16. data/lib/sidekiq/job_util.rb +49 -15
  17. data/lib/sidekiq/launcher.rb +3 -2
  18. data/lib/sidekiq/metrics/query.rb +1 -1
  19. data/lib/sidekiq/metrics/shared.rb +3 -3
  20. data/lib/sidekiq/metrics/tracking.rb +2 -0
  21. data/lib/sidekiq/middleware/chain.rb +12 -9
  22. data/lib/sidekiq/middleware/current_attributes.rb +55 -16
  23. data/lib/sidekiq/monitor.rb +1 -3
  24. data/lib/sidekiq/paginator.rb +1 -1
  25. data/lib/sidekiq/processor.rb +4 -1
  26. data/lib/sidekiq/rails.rb +10 -0
  27. data/lib/sidekiq/redis_client_adapter.rb +5 -24
  28. data/lib/sidekiq/scheduled.rb +1 -1
  29. data/lib/sidekiq/version.rb +1 -1
  30. data/lib/sidekiq/web/application.rb +14 -2
  31. data/lib/sidekiq/web/helpers.rb +2 -2
  32. data/lib/sidekiq/web.rb +1 -1
  33. data/sidekiq.gemspec +7 -15
  34. data/web/assets/javascripts/metrics.js +30 -2
  35. data/web/assets/stylesheets/application.css +1 -1
  36. data/web/locales/da.yml +11 -4
  37. data/web/locales/fr.yml +14 -0
  38. data/web/locales/gd.yml +99 -0
  39. data/web/locales/ja.yml +3 -1
  40. data/web/views/_footer.erb +2 -2
  41. data/web/views/_metrics_period_select.erb +12 -0
  42. data/web/views/busy.erb +3 -3
  43. data/web/views/metrics.erb +6 -4
  44. data/web/views/metrics_for_job.erb +11 -12
  45. metadata +14 -19
@@ -7,26 +7,32 @@ module Sidekiq
7
7
  # This can be useful for multi-tenancy, i18n locale, timezone, any implicit
8
8
  # per-request attribute. See +ActiveSupport::CurrentAttributes+.
9
9
  #
10
+ # For multiple current attributes, pass an array of current attributes.
11
+ #
10
12
  # @example
11
13
  #
12
14
  # # in your initializer
13
15
  # require "sidekiq/middleware/current_attributes"
14
16
  # Sidekiq::CurrentAttributes.persist("Myapp::Current")
17
+ # # or multiple current attributes
18
+ # Sidekiq::CurrentAttributes.persist(["Myapp::Current", "Myapp::OtherCurrent"])
15
19
  #
16
20
  module CurrentAttributes
17
21
  class Save
18
22
  include Sidekiq::ClientMiddleware
19
23
 
20
- def initialize(cattr)
21
- @strklass = cattr
24
+ def initialize(cattrs)
25
+ @cattrs = cattrs
22
26
  end
23
27
 
24
28
  def call(_, job, _, _)
25
- if !job.has_key?("cattr")
26
- attrs = @strklass.constantize.attributes
27
- # Retries can push the job N times, we don't
28
- # want retries to reset cattr. #5692, #5090
29
- job["cattr"] = attrs if attrs.any?
29
+ @cattrs.each do |(key, strklass)|
30
+ if !job.has_key?(key)
31
+ attrs = strklass.constantize.attributes
32
+ # Retries can push the job N times, we don't
33
+ # want retries to reset cattr. #5692, #5090
34
+ job[key] = attrs if attrs.any?
35
+ end
30
36
  end
31
37
  yield
32
38
  end
@@ -35,22 +41,55 @@ module Sidekiq
35
41
  class Load
36
42
  include Sidekiq::ServerMiddleware
37
43
 
38
- def initialize(cattr)
39
- @strklass = cattr
44
+ def initialize(cattrs)
45
+ @cattrs = cattrs
40
46
  end
41
47
 
42
48
  def call(_, job, _, &block)
43
- if job.has_key?("cattr")
44
- @strklass.constantize.set(job["cattr"], &block)
45
- else
46
- yield
49
+ cattrs_to_reset = []
50
+
51
+ @cattrs.each do |(key, strklass)|
52
+ if job.has_key?(key)
53
+ constklass = strklass.constantize
54
+ cattrs_to_reset << constklass
55
+
56
+ job[key].each do |(attribute, value)|
57
+ constklass.public_send("#{attribute}=", value)
58
+ end
59
+ end
47
60
  end
61
+
62
+ yield
63
+ ensure
64
+ cattrs_to_reset.each(&:reset)
48
65
  end
49
66
  end
50
67
 
51
- def self.persist(klass, config = Sidekiq.default_configuration)
52
- config.client_middleware.add Save, klass.to_s
53
- config.server_middleware.add Load, klass.to_s
68
+ class << self
69
+ def persist(klass_or_array, config = Sidekiq.default_configuration)
70
+ cattrs = build_cattrs_hash(klass_or_array)
71
+
72
+ config.client_middleware.add Save, cattrs
73
+ config.server_middleware.add Load, cattrs
74
+ end
75
+
76
+ private
77
+
78
+ def build_cattrs_hash(klass_or_array)
79
+ if klass_or_array.is_a?(Array)
80
+ {}.tap do |hash|
81
+ klass_or_array.each_with_index do |klass, index|
82
+ hash[key_at(index)] = klass.to_s
83
+ end
84
+ end
85
+ else
86
+ {key_at(0) => klass_or_array.to_s}
87
+ end
88
+ end
89
+
90
+ def key_at(index)
91
+ (index == 0) ? "cattr" : "cattr_#{index}"
92
+ end
54
93
  end
55
94
  end
56
95
  end
@@ -16,8 +16,6 @@ class Sidekiq::Monitor
16
16
  return
17
17
  end
18
18
  send(section)
19
- rescue => e
20
- abort "Couldn't get status: #{e}"
21
19
  end
22
20
 
23
21
  def all
@@ -58,7 +56,7 @@ class Sidekiq::Monitor
58
56
  # {"default" => 1, "critical" => 10}
59
57
  queues =
60
58
  if process["weights"]
61
- process["weights"].sort_by { |queue| queue[0] }.map { |queue| queue.join(": ") }
59
+ process["weights"].sort_by { |queue| queue[0] }.map { |capsule| capsule.map { |name, weight| (weight > 0) ? "#{name}: #{weight}" : name }.join(", ") }
62
60
  else
63
61
  process["queues"].sort
64
62
  end
@@ -19,7 +19,7 @@ module Sidekiq
19
19
  total_size, items = conn.multi { |transaction|
20
20
  transaction.zcard(key)
21
21
  if rev
22
- transaction.zrevrange(key, starting, ending, withscores: true)
22
+ transaction.zrange(key, starting, ending, "REV", withscores: true)
23
23
  else
24
24
  transaction.zrange(key, starting, ending, withscores: true)
25
25
  end
@@ -146,6 +146,9 @@ module Sidekiq
146
146
  end
147
147
  end
148
148
 
149
+ IGNORE_SHUTDOWN_INTERRUPTS = {Sidekiq::Shutdown => :never}
150
+ private_constant :IGNORE_SHUTDOWN_INTERRUPTS
151
+
149
152
  def process(uow)
150
153
  jobstr = uow.job
151
154
  queue = uow.queue_name
@@ -195,7 +198,7 @@ module Sidekiq
195
198
  ensure
196
199
  if ack
197
200
  # We don't want a shutdown signal to interrupt job acknowledgment.
198
- Thread.handle_interrupt(Sidekiq::Shutdown => :never) do
201
+ Thread.handle_interrupt(IGNORE_SHUTDOWN_INTERRUPTS) do
199
202
  uow.acknowledge
200
203
  end
201
204
  end
data/lib/sidekiq/rails.rb CHANGED
@@ -20,6 +20,10 @@ module Sidekiq
20
20
  def inspect
21
21
  "#<Sidekiq::Rails::Reloader @app=#{@app.class.name}>"
22
22
  end
23
+
24
+ def to_json(*)
25
+ Sidekiq.dump_json(inspect)
26
+ end
23
27
  end
24
28
 
25
29
  # By including the Options module, we allow AJs to directly control sidekiq features
@@ -50,6 +54,12 @@ module Sidekiq
50
54
  end
51
55
  end
52
56
 
57
+ initializer "sidekiq.backtrace_cleaner" do
58
+ Sidekiq.configure_server do |config|
59
+ config[:backtrace_cleaner] = ->(backtrace) { ::Rails.backtrace_cleaner.clean(backtrace) }
60
+ end
61
+ end
62
+
53
63
  # This hook happens after all initializers are run, just before returning
54
64
  # from config/environment.rb back to sidekiq/cli.rb.
55
65
  #
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
3
4
  require "redis_client"
4
5
  require "redis_client/decorator"
5
6
 
@@ -8,13 +9,14 @@ module Sidekiq
8
9
  BaseError = RedisClient::Error
9
10
  CommandError = RedisClient::CommandError
10
11
 
12
+ # You can add/remove items or clear the whole thing if you don't want deprecation warnings.
13
+ DEPRECATED_COMMANDS = %i[rpoplpush zrangebyscore zrevrange zrevrangebyscore getset hmset setex setnx].to_set
14
+
11
15
  module CompatMethods
12
- # TODO Deprecate and remove this
13
16
  def info
14
17
  @client.call("INFO") { |i| i.lines(chomp: true).map { |l| l.split(":", 2) }.select { |l| l.size == 2 }.to_h }
15
18
  end
16
19
 
17
- # TODO Deprecate and remove this
18
20
  def evalsha(sha, keys, argv)
19
21
  @client.call("EVALSHA", sha, keys.size, *keys, *argv)
20
22
  end
@@ -24,6 +26,7 @@ module Sidekiq
24
26
  # this allows us to use methods like `conn.hmset(...)` instead of having to use
25
27
  # redis-client's native `conn.call("hmset", ...)`
26
28
  def method_missing(*args, &block)
29
+ warn("[sidekiq#5788] Redis has deprecated the `#{args.first}`command, called at #{caller(1..1)}") if DEPRECATED_COMMANDS.include?(args.first)
27
30
  @client.call(*args, *block)
28
31
  end
29
32
  ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
@@ -39,28 +42,6 @@ module Sidekiq
39
42
  def config
40
43
  @client.config
41
44
  end
42
-
43
- def message
44
- yield nil, @queue.pop
45
- end
46
-
47
- # NB: this method does not return
48
- def subscribe(chan)
49
- @queue = ::Queue.new
50
-
51
- pubsub = @client.pubsub
52
- pubsub.call("subscribe", chan)
53
-
54
- loop do
55
- evt = pubsub.next_event
56
- next if evt.nil?
57
- next unless evt[0] == "message" && evt[1] == chan
58
-
59
- (_, _, msg) = evt
60
- @queue << msg
61
- yield self
62
- end
63
- end
64
45
  end
65
46
 
66
47
  def initialize(options)
@@ -12,7 +12,7 @@ module Sidekiq
12
12
 
13
13
  LUA_ZPOPBYSCORE = <<~LUA
14
14
  local key, now = KEYS[1], ARGV[1]
15
- local jobs = redis.call("zrangebyscore", key, "-inf", now, "limit", 0, 1)
15
+ local jobs = redis.call("zrange", key, "-inf", now, "byscore", "limit", 0, 1)
16
16
  if jobs[1] then
17
17
  redis.call("zrem", key, jobs[1])
18
18
  return jobs[1]
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sidekiq
4
- VERSION = "7.0.3"
4
+ VERSION = "7.1.2"
5
5
  MAJOR = 7
6
6
  end
@@ -20,6 +20,12 @@ module Sidekiq
20
20
  "worker-src 'self'",
21
21
  "base-uri 'self'"
22
22
  ].join("; ").freeze
23
+ METRICS_PERIODS = {
24
+ "1h" => 60,
25
+ "2h" => 120,
26
+ "4h" => 240,
27
+ "8h" => 480
28
+ }
23
29
 
24
30
  def initialize(klass)
25
31
  @klass = klass
@@ -62,14 +68,20 @@ module Sidekiq
62
68
 
63
69
  get "/metrics" do
64
70
  q = Sidekiq::Metrics::Query.new
65
- @query_result = q.top_jobs
71
+ @period = h((params[:period] || "")[0..1])
72
+ @periods = METRICS_PERIODS
73
+ minutes = @periods.fetch(@period, @periods.values.first)
74
+ @query_result = q.top_jobs(minutes: minutes)
66
75
  erb(:metrics)
67
76
  end
68
77
 
69
78
  get "/metrics/:name" do
70
79
  @name = route_params[:name]
80
+ @period = h((params[:period] || "")[0..1])
71
81
  q = Sidekiq::Metrics::Query.new
72
- @query_result = q.for_job(@name)
82
+ @periods = METRICS_PERIODS
83
+ minutes = @periods.fetch(@period, @periods.values.first)
84
+ @query_result = q.for_job(@name, minutes: minutes)
73
85
  erb(:metrics_for_job)
74
86
  end
75
87
 
@@ -15,7 +15,7 @@ module Sidekiq
15
15
  # so extensions can be localized
16
16
  @strings[lang] ||= settings.locales.each_with_object({}) do |path, global|
17
17
  find_locale_files(lang).each do |file|
18
- strs = YAML.safe_load(File.open(file))
18
+ strs = YAML.safe_load(File.read(file))
19
19
  global.merge!(strs[lang])
20
20
  end
21
21
  end
@@ -118,7 +118,7 @@ module Sidekiq
118
118
  }.join(" ")
119
119
  end
120
120
 
121
- # mperham/sidekiq#3243
121
+ # sidekiq/sidekiq#3243
122
122
  def unfiltered?
123
123
  yield unless env["PATH_INFO"].start_with?("/filter/")
124
124
  end
data/lib/sidekiq/web.rb CHANGED
@@ -137,7 +137,7 @@ module Sidekiq
137
137
  m = middlewares
138
138
 
139
139
  rules = []
140
- rules = [[:all, {"cache-control" => "public, max-age=86400"}]] unless ENV["SIDEKIQ_WEB_TESTING"]
140
+ rules = [[:all, {"Cache-Control" => "private, max-age=86400"}]] unless ENV["SIDEKIQ_WEB_TESTING"]
141
141
 
142
142
  ::Rack::Builder.new do
143
143
  use Rack::Static, urls: ["/stylesheets", "/images", "/javascripts"],
data/sidekiq.gemspec CHANGED
@@ -2,7 +2,7 @@ require_relative "lib/sidekiq/version"
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.authors = ["Mike Perham"]
5
- gem.email = ["mperham@gmail.com"]
5
+ gem.email = ["info@contribsys.com"]
6
6
  gem.summary = "Simple, efficient background processing for Ruby"
7
7
  gem.description = "Simple, efficient background processing for Ruby."
8
8
  gem.homepage = "https://sidekiq.org"
@@ -16,23 +16,15 @@ Gem::Specification.new do |gem|
16
16
 
17
17
  gem.metadata = {
18
18
  "homepage_uri" => "https://sidekiq.org",
19
- "bug_tracker_uri" => "https://github.com/mperham/sidekiq/issues",
20
- "documentation_uri" => "https://github.com/mperham/sidekiq/wiki",
21
- "changelog_uri" => "https://github.com/mperham/sidekiq/blob/main/Changes.md",
22
- "source_code_uri" => "https://github.com/mperham/sidekiq"
19
+ "bug_tracker_uri" => "https://github.com/sidekiq/sidekiq/issues",
20
+ "documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
21
+ "changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
22
+ "source_code_uri" => "https://github.com/sidekiq/sidekiq",
23
+ "rubygems_mfa_required" => "true"
23
24
  }
24
25
 
25
- gem.add_dependency "redis-client", ">= 0.11.0"
26
+ gem.add_dependency "redis-client", ">= 0.14.0"
26
27
  gem.add_dependency "connection_pool", ">= 2.3.0"
27
28
  gem.add_dependency "rack", ">= 2.2.4"
28
29
  gem.add_dependency "concurrent-ruby", "< 2"
29
- gem.post_install_message = <<~EOM
30
-
31
- Welcome to Sidekiq 7.0!
32
-
33
- 1. Use `gem 'sidekiq', '<7'` in your Gemfile if you don't want this new version.
34
- 2. Read the release notes at https://github.com/mperham/sidekiq/blob/main/docs/7.0-Upgrade.md
35
- 3. If you have problems, search for open/closed issues at https://github.com/mperham/sidekiq/issues/
36
-
37
- EOM
38
30
  end
@@ -4,6 +4,14 @@ class JobMetricsOverviewChart extends BaseChart {
4
4
  this.swatches = [];
5
5
  this.visibleKls = options.visibleKls;
6
6
 
7
+ const countBuckets = this.options.labels.length / 60;
8
+ this.labelBuckets = this.options.labels.reduce((acc, label, index) => {
9
+ const bucket = Math.floor(index / countBuckets);
10
+ acc[bucket] = acc[bucket] || [];
11
+ acc[bucket].push(label);
12
+ return acc;
13
+ }, []);
14
+
7
15
  this.init();
8
16
  }
9
17
 
@@ -52,7 +60,7 @@ class JobMetricsOverviewChart extends BaseChart {
52
60
 
53
61
  return {
54
62
  label: kls,
55
- data: this.options.series[kls],
63
+ data: this.buildSeries(kls),
56
64
  borderColor: color,
57
65
  backgroundColor: color,
58
66
  borderWidth: 2,
@@ -60,6 +68,26 @@ class JobMetricsOverviewChart extends BaseChart {
60
68
  };
61
69
  }
62
70
 
71
+ buildSeries(kls) {
72
+ // `series` is an object that maps labels to counts => { "20:15" => 2, "20:16" => 3, ... }
73
+ const series = this.options.series[kls];
74
+ return this.labelBuckets.reduce((acc, labels) => {
75
+ const bucketValues = labels.map(label => series[label]).filter(v => v);
76
+ if (bucketValues.length > 0) {
77
+ // Sum up the values for each bucket that has data.
78
+ // The new label is the bucket's first label, its start time.
79
+ acc[labels[0]] = bucketValues.reduce((a, b) => a + b, 0);
80
+ }
81
+ return acc;
82
+ }, {});
83
+ }
84
+
85
+ buildTooltipTitle(items) {
86
+ const [first, ...rest] = this.labelBuckets.find((labels) => labels[0] === items[0].label);
87
+ const title = [first, rest[rest.length - 1]].filter(v => v).join(" - ");
88
+ return `${title} UTC`
89
+ }
90
+
63
91
  get chartOptions() {
64
92
  return {
65
93
  ...super.chartOptions,
@@ -80,7 +108,7 @@ class JobMetricsOverviewChart extends BaseChart {
80
108
  tooltip: {
81
109
  ...super.chartOptions.plugins.tooltip,
82
110
  callbacks: {
83
- title: (items) => `${items[0].label} UTC`,
111
+ title: (items) => this.buildTooltipTitle(items),
84
112
  label: (item) =>
85
113
  `${item.dataset.label}: ${item.parsed.y.toFixed(1)} ` +
86
114
  `${this.options.units}`,
@@ -72,7 +72,7 @@ h1, h2, h3 {
72
72
  line-height: 45px;
73
73
  }
74
74
 
75
- .header-container {
75
+ .header-container, .header-container .page-title-container {
76
76
  display: flex;
77
77
  justify-content: space-between;
78
78
  align-items: center;
data/web/locales/da.yml CHANGED
@@ -1,11 +1,12 @@
1
1
  # elements like %{queue} are variables and should not be translated
2
2
  da:
3
- Actions: Actions
3
+ Actions: Handlinger
4
4
  AddToQueue: Tilføj til kø
5
5
  AreYouSure: Er du sikker?
6
6
  AreYouSureDeleteJob: Er du sikker på at du vil slette dette job?
7
7
  AreYouSureDeleteQueue: Er du sikker på at du vil slette %{queue} køen?
8
8
  Arguments: Argumenter
9
+ AvgExecutionTime: Gennemsnitlig eksekveringstid
9
10
  Busy: Travl
10
11
  Class: Klasse
11
12
  Connections: Forbindelser
@@ -18,21 +19,25 @@ da:
18
19
  Enqueued: I kø
19
20
  Error: Fejl
20
21
  ErrorBacktrace: Fejl backtrace
21
- ErrorClass: Fejl klasse
22
- ErrorMessage: Fejl besked
22
+ ErrorClass: Fejlklasse
23
+ ErrorMessage: Fejlbesked
23
24
  Extras: Ekstra
24
25
  Failed: Fejlet
26
+ Failure: Fejl
25
27
  Failures: Fejl
26
28
  GoBack: ← Tilbage
27
29
  History: Historik
28
30
  Job: Job
29
31
  Jobs: Jobs
32
+ Latency: Forsinkelse
30
33
  LastRetry: Sidste forsøg
31
34
  LivePoll: Live Poll
32
35
  MemoryUsage: RAM forbrug
36
+ Name: Navn
33
37
  Namespace: Namespace
34
38
  NextRetry: Næste forsøg
35
39
  NoDeadJobsFound: Ingen døde jobs fundet
40
+ NoJobMetricsFound: Ingen nylig job-metrics blev fundet
36
41
  NoRetriesFound: Ingen gen-forsøg var fundet
37
42
  NoScheduledFound: Ingen jobs i kø fundet
38
43
  OneMonth: 1 måned
@@ -43,7 +48,7 @@ da:
43
48
  Processes: Processer
44
49
  Queue: Kø
45
50
  Queues: Køer
46
- Realtime: Real-time
51
+ Realtime: Realtid
47
52
  Retries: Forsøg
48
53
  RetryAll: Forsøg alle
49
54
  RetryCount: Antal forsøg
@@ -56,10 +61,12 @@ da:
56
61
  Started: Startet
57
62
  Status: Status
58
63
  StopPolling: Stop Polling
64
+ Success: Succes
59
65
  Thread: Tråd
60
66
  Threads: Tråde
61
67
  ThreeMonths: 3 måneder
62
68
  Time: Tid
69
+ TotalExecutionTime: Total eksekveringstid
63
70
  Uptime: Oppetid (dage)
64
71
  Version: Version
65
72
  When: Når
data/web/locales/fr.yml CHANGED
@@ -17,14 +17,17 @@ fr:
17
17
  DeadJobs: Tâches mortes
18
18
  Delete: Supprimer
19
19
  DeleteAll: Tout supprimer
20
+ Deploy: Déploiement
20
21
  Enqueued: En attente
21
22
  Error: Erreur
22
23
  ErrorBacktrace: Backtrace d’erreur
23
24
  ErrorClass: Classe d’erreur
24
25
  ErrorMessage: Message d’erreur
26
+ ExecutionTime: Temps d'exécution
25
27
  Extras: Extras
26
28
  Failed: Échouées
27
29
  Failures: Echecs
30
+ Failure: Echec
28
31
  GoBack: ← Retour
29
32
  History: Historique
30
33
  Job: Tâche
@@ -35,6 +38,7 @@ fr:
35
38
  Latency: Latence
36
39
  LivePoll: Temps réel
37
40
  MemoryUsage: Mémoire utilisée
41
+ Name: Nom
38
42
  Namespace: Namespace
39
43
  NextRetry: Prochain essai
40
44
  NoDeadJobsFound: Aucune tâche morte n'a été trouvée
@@ -63,6 +67,7 @@ fr:
63
67
  RetryNow: Réessayer maintenant
64
68
  Scheduled: Planifiées
65
69
  ScheduledJobs: Tâches planifiées
70
+ Seconds: Secondes
66
71
  ShowAll: Tout montrer
67
72
  SixMonths: 6 mois
68
73
  Size: Taille
@@ -71,6 +76,8 @@ fr:
71
76
  Stop: Arrêter
72
77
  StopAll: Tout arrêter
73
78
  StopPolling: Arrêt du temps réel
79
+ Success: Succès
80
+ Summary: Résumé
74
81
  Thread: Thread
75
82
  Threads: Threads
76
83
  ThreeMonths: 3 mois
@@ -83,3 +90,10 @@ fr:
83
90
  Worker: Travailleur
84
91
  active: actif
85
92
  idle: inactif
93
+ Metrics: Métriques
94
+ NoDataFound: Aucune donnée disponible
95
+ TotalExecutionTime: Temps d'exécution total
96
+ AvgExecutionTime: Temps d'exécution moyen
97
+ Context: Contexte
98
+ Bucket: Bucket
99
+ NoJobMetricsFound: Aucune statistique de tâche récente n'a été trouvée
@@ -0,0 +1,99 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ gd:
3
+ Actions: Gnìomhan
4
+ AddToQueue: Cuir ris a’ chiutha
5
+ AreYouSure: A bheil thu cinnteach?
6
+ AreYouSureDeleteJob: A bheil thu cinnteach gu bheil thu airson an obair seo a sguabadh às?
7
+ 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.
8
+ Arguments: Argamaidean
9
+ BackToApp: Till dhan aplacaid
10
+ Busy: Trang
11
+ Class: Clas
12
+ Connections: Ceanglaichean
13
+ CreatedAt: Air a chruthachadh
14
+ CurrentMessagesInQueue: Obraichean làithreach am broinn <span class='title'>%{queue}</span>
15
+ Dashboard: Deas-bhòrd
16
+ Dead: Marbh
17
+ DeadJobs: Obraichean marbh
18
+ Delete: Sguab às
19
+ DeleteAll: Sguab às na h-uile
20
+ Deploy: Cuir an gnìomh
21
+ Enqueued: Sa chiutha
22
+ Error: Mearachd
23
+ ErrorBacktrace: Backtrace na mearachd
24
+ ErrorClass: Clas na mearachd
25
+ ErrorMessage: Teachdaireachd na mearachd
26
+ ExecutionTime: Àm a’ ghnìomha
27
+ Extras: Nithean a bharrachd
28
+ Failed: Air fàilligeadh
29
+ Failures: Fàilligidhean
30
+ Failure: Fàilligeadh
31
+ GoBack: ← Air ais
32
+ History: Eachdraidh
33
+ Job: Obair
34
+ Jobs: Obraichean
35
+ Kill: Marbh
36
+ KillAll: Marbh na h-uile
37
+ LastRetry: An oidhirp mu dheireadh
38
+ Latency: Foillidheachd
39
+ LivePoll: Ath-nuadhachadh beò
40
+ MemoryUsage: Cleachdadh a’ chuimhne
41
+ Name: Ainm
42
+ Namespace: Ainm-spàs
43
+ NextRetry: An ath-oidhirp
44
+ NoDeadJobsFound: Cha deach obair mharbh a lorg
45
+ NoRetriesFound: Cha deach ath-oidhirp a lorg
46
+ NoScheduledFound: Cha deach obair air an sgeideal a lorg
47
+ NotYetEnqueued: Chan eil seo sa chiutha fhathast
48
+ OneMonth: Mìos
49
+ OneWeek: Seachdain
50
+ OriginallyFailed: Dh’fhàillig e o thùs
51
+ Pause: Cuir ’na stad
52
+ Paused: ’Na stad
53
+ PeakMemoryUsage: Bàrr cleachdadh a’ chuimhne
54
+ Plugins: Plugain
55
+ PollingInterval: Eadaramh an ath-nuadhachaidh
56
+ Process: Pròiseas
57
+ Processed: Air pròiseasadh
58
+ Processes: Pròiseasan
59
+ Queue: Ciutha
60
+ Queues: Ciuthan
61
+ Quiet: Mùch
62
+ QuietAll: Mùch na h-uile
63
+ Realtime: Fìor-àm
64
+ Retries: Oidhirpean
65
+ RetryAll: Feuch ris na h-uile a-rithist
66
+ RetryCount: Cunntas nan oidhirpean
67
+ RetryNow: Feuch ris a-rithist an-dràsta
68
+ Scheduled: Air an sgeideal
69
+ ScheduledJobs: Obraichean air an sgeideal
70
+ Seconds: Diogan
71
+ ShowAll: Seall na h-uile
72
+ SixMonths: Leth-bhliadhna
73
+ Size: Meud
74
+ Started: Air a thòiseachadh
75
+ Status: Staid
76
+ Stop: Cuir stad air
77
+ StopAll: Cuir stad air na h-uile
78
+ StopPolling: Sguir dhen ath-nuadhachadh
79
+ Success: Chaidh leis
80
+ Summary: Geàrr-chunntas
81
+ Thread: Snàithlean
82
+ Threads: Snàithleanan
83
+ ThreeMonths: 3 mìosan
84
+ Time: Àm
85
+ Unpause: Lean air
86
+ Uptime: Beò fad (làithean)
87
+ Utilization: Cleachdadh
88
+ Version: Tionndadh
89
+ When: Cuin
90
+ Worker: Obraiche
91
+ active: gnìomhach
92
+ idle: ’na thàmh
93
+ Metrics: Meatraigeachd
94
+ NoDataFound: Cha deach dàta a lorg
95
+ TotalExecutionTime: Ùine iomlan nan gnìomhan
96
+ AvgExecutionTime: Ùine cuibheasach nan gnìomhan
97
+ Context: Co-theacsa
98
+ Bucket: Bucaid
99
+ NoJobMetricsFound: Cha deach meatraigeachd o chionn goirid air obair a lorg
data/web/locales/ja.yml CHANGED
@@ -27,6 +27,7 @@ ja:
27
27
  Extras: エクストラ
28
28
  Failed: 失敗
29
29
  Failures: 失敗
30
+ Failure: 失敗
30
31
  GoBack: ← 戻る
31
32
  History: 履歴
32
33
  Job: ジョブ
@@ -75,6 +76,7 @@ ja:
75
76
  Stop: 停止
76
77
  StopAll: すべて停止
77
78
  StopPolling: ポーリング停止
79
+ Success: 成功
78
80
  Thread: スレッド
79
81
  Threads: スレッド
80
82
  ThreeMonths: 3 ヶ月
@@ -82,7 +84,7 @@ ja:
82
84
  Unpause: 一時停止を解除
83
85
  Metrics: メトリクス
84
86
  NoDataFound: データが見つかりませんでした
85
- ExecutionTime: 合計実行時間
87
+ TotalExecutionTime: 合計実行時間
86
88
  AvgExecutionTime: 平均実行時間
87
89
  Context: コンテキスト
88
90
  Bucket: バケット