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.
- checksums.yaml +4 -4
- data/Changes.md +82 -9
- data/README.md +29 -22
- data/bin/sidekiqload +204 -109
- data/bin/sidekiqmon +3 -0
- data/lib/sidekiq/api.rb +33 -10
- data/lib/sidekiq/capsule.rb +1 -0
- data/lib/sidekiq/cli.rb +3 -2
- data/lib/sidekiq/client.rb +33 -20
- data/lib/sidekiq/component.rb +3 -1
- data/lib/sidekiq/config.rb +12 -4
- data/lib/sidekiq/embedded.rb +1 -1
- data/lib/sidekiq/fetch.rb +1 -1
- data/lib/sidekiq/job.rb +1 -5
- data/lib/sidekiq/job_retry.rb +8 -5
- data/lib/sidekiq/job_util.rb +49 -15
- data/lib/sidekiq/launcher.rb +3 -2
- data/lib/sidekiq/metrics/query.rb +1 -1
- data/lib/sidekiq/metrics/shared.rb +3 -3
- data/lib/sidekiq/metrics/tracking.rb +2 -0
- data/lib/sidekiq/middleware/chain.rb +12 -9
- data/lib/sidekiq/middleware/current_attributes.rb +55 -16
- data/lib/sidekiq/monitor.rb +1 -3
- data/lib/sidekiq/paginator.rb +1 -1
- data/lib/sidekiq/processor.rb +4 -1
- data/lib/sidekiq/rails.rb +10 -0
- data/lib/sidekiq/redis_client_adapter.rb +5 -24
- data/lib/sidekiq/scheduled.rb +1 -1
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/application.rb +14 -2
- data/lib/sidekiq/web/helpers.rb +2 -2
- data/lib/sidekiq/web.rb +1 -1
- data/sidekiq.gemspec +7 -15
- data/web/assets/javascripts/metrics.js +30 -2
- data/web/assets/stylesheets/application.css +1 -1
- data/web/locales/da.yml +11 -4
- data/web/locales/fr.yml +14 -0
- data/web/locales/gd.yml +99 -0
- data/web/locales/ja.yml +3 -1
- data/web/views/_footer.erb +2 -2
- data/web/views/_metrics_period_select.erb +12 -0
- data/web/views/busy.erb +3 -3
- data/web/views/metrics.erb +6 -4
- data/web/views/metrics_for_job.erb +11 -12
- 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(
|
21
|
-
@
|
24
|
+
def initialize(cattrs)
|
25
|
+
@cattrs = cattrs
|
22
26
|
end
|
23
27
|
|
24
28
|
def call(_, job, _, _)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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(
|
39
|
-
@
|
44
|
+
def initialize(cattrs)
|
45
|
+
@cattrs = cattrs
|
40
46
|
end
|
41
47
|
|
42
48
|
def call(_, job, _, &block)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
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
|
data/lib/sidekiq/monitor.rb
CHANGED
@@ -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 { |
|
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
|
data/lib/sidekiq/paginator.rb
CHANGED
@@ -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.
|
22
|
+
transaction.zrange(key, starting, ending, "REV", withscores: true)
|
23
23
|
else
|
24
24
|
transaction.zrange(key, starting, ending, withscores: true)
|
25
25
|
end
|
data/lib/sidekiq/processor.rb
CHANGED
@@ -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(
|
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)
|
data/lib/sidekiq/scheduled.rb
CHANGED
@@ -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("
|
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]
|
data/lib/sidekiq/version.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
@
|
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
|
|
data/lib/sidekiq/web/helpers.rb
CHANGED
@@ -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.
|
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
|
-
#
|
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, {"
|
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 = ["
|
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/
|
20
|
-
"documentation_uri" => "https://github.com/
|
21
|
-
"changelog_uri" => "https://github.com/
|
22
|
-
"source_code_uri" => "https://github.com/
|
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.
|
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.
|
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) =>
|
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}`,
|
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:
|
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:
|
22
|
-
ErrorMessage:
|
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:
|
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
|
data/web/locales/gd.yml
ADDED
@@ -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
|
-
|
87
|
+
TotalExecutionTime: 合計実行時間
|
86
88
|
AvgExecutionTime: 平均実行時間
|
87
89
|
Context: コンテキスト
|
88
90
|
Bucket: バケット
|