sidekiq 8.1.5 → 8.1.7

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +16 -0
  3. data/README.md +2 -0
  4. data/bin/sidekiqload +2 -0
  5. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +1 -1
  6. data/lib/sidekiq/api.rb +4 -3
  7. data/lib/sidekiq/client.rb +3 -3
  8. data/lib/sidekiq/config.rb +3 -7
  9. data/lib/sidekiq/job.rb +1 -1
  10. data/lib/sidekiq/job_retry.rb +7 -7
  11. data/lib/sidekiq/launcher.rb +1 -1
  12. data/lib/sidekiq/manager.rb +1 -0
  13. data/lib/sidekiq/metrics/query.rb +6 -1
  14. data/lib/sidekiq/paginator.rb +3 -0
  15. data/lib/sidekiq/processor.rb +5 -4
  16. data/lib/sidekiq/redis_client_adapter.rb +2 -2
  17. data/lib/sidekiq/testing.rb +1 -0
  18. data/lib/sidekiq/tui/tabs/base_tab.rb +41 -15
  19. data/lib/sidekiq/tui/tabs/busy.rb +2 -16
  20. data/lib/sidekiq/tui/tabs/dead.rb +0 -5
  21. data/lib/sidekiq/tui/tabs/home.rb +11 -40
  22. data/lib/sidekiq/tui/tabs/metrics.rb +2 -19
  23. data/lib/sidekiq/tui/tabs/queues.rb +2 -14
  24. data/lib/sidekiq/tui/tabs/retries.rb +0 -5
  25. data/lib/sidekiq/tui/tabs/scheduled.rb +0 -5
  26. data/lib/sidekiq/tui/tabs/set_tab.rb +15 -20
  27. data/lib/sidekiq/tui.rb +78 -70
  28. data/lib/sidekiq/version.rb +1 -1
  29. data/lib/sidekiq/web/action.rb +2 -2
  30. data/lib/sidekiq/web/application.rb +11 -2
  31. data/lib/sidekiq/web/helpers.rb +9 -14
  32. data/lib/sidekiq/web/router.rb +2 -2
  33. data/sidekiq.gemspec +2 -1
  34. data/web/locales/en.yml +1 -0
  35. data/web/locales/hi.yml +34 -0
  36. data/web/locales/ta.yml +81 -47
  37. data/web/views/_footer.html.erb +1 -1
  38. data/web/views/_job_info.html.erb +1 -1
  39. data/web/views/busy.html.erb +50 -46
  40. data/web/views/metrics.html.erb +1 -1
  41. data/web/views/metrics_for_job.html.erb +1 -1
  42. data/web/views/morgue.html.erb +1 -1
  43. data/web/views/profiles.html.erb +1 -1
  44. data/web/views/retries.html.erb +1 -1
  45. data/web/views/scheduled.html.erb +1 -1
  46. metadata +3 -2
data/lib/sidekiq/tui.rb CHANGED
@@ -105,63 +105,46 @@ module Sidekiq
105
105
  @tui.constraint_length(4)
106
106
  ]
107
107
  )
108
- content = @tui.block(
109
- title: " #{Sidekiq::NAME} ",
110
- borders: [:all],
111
- title_style: @tui.style(fg: :light_red, modifiers: [:bold]),
112
- children: [
113
- # TODO convert to table
114
- @tui.paragraph(
115
- text: [
116
- @tui.text_line(spans: ["Welcome to the Sidekiq Terminal UI"], alignment: :center),
117
- @tui.text_line(spans: [
118
- @tui.text_span(content: "Global hotkeys")
119
- ]),
120
- @tui.text_line(spans: []),
121
- @tui.text_line(spans: [
122
- @tui.text_span(content: "Esc", style: @hotkey_style),
123
- @tui.text_span(content: ": Close this window")
124
- ]),
125
- @tui.text_line(spans: [
126
- @tui.text_span(content: "←/→", style: @hotkey_style),
127
- @tui.text_span(content: ": Move between tabs")
128
- ]),
129
- @tui.text_line(spans: [
130
- @tui.text_span(content: "h/l", style: @hotkey_style),
131
- @tui.text_span(content: ": Move to prev/next page of data")
132
- ]),
133
- @tui.text_line(spans: [
134
- @tui.text_span(content: "j/k", style: @hotkey_style),
135
- @tui.text_span(content: ": Move to prev/next row in current page")
136
- ]),
137
- @tui.text_line(spans: [
138
- @tui.text_span(content: "x", style: @hotkey_style),
139
- @tui.text_span(content: ": Select/deselect current row")
140
- ]),
141
- @tui.text_line(spans: [
142
- @tui.text_span(content: "A", style: @hotkey_style),
143
- @tui.text_span(content: ": Select/deselect All rows in current page")
144
- ]),
145
- @tui.text_line(spans: [
146
- @tui.text_span(content: "q", style: @hotkey_style),
147
- @tui.text_span(content: ": Quit")
148
- ])
149
- ]
150
- )
151
- ]
108
+
109
+ help_data = [
110
+ ["Esc", "Close this window"],
111
+ ["←/→", "Move between tabs"],
112
+ ["h/l", "Move to prev/next page of data"],
113
+ ["j/k", "Move to prev/next row in current page"],
114
+ ["x", "Select/deselect current row"],
115
+ ["A", "Select/deselect All rows in current page"],
116
+ ["q", "Quit"]
117
+ ]
118
+
119
+ # striped styling like other tables in the app
120
+ help_rows = help_data.map.with_index { |cells, idx|
121
+ @tui.table_row(
122
+ cells: cells,
123
+ style: idx.even? ? nil : @tui.style(bg: :dark_gray)
124
+ )
125
+ }
126
+
127
+ table = @tui.table(
128
+ block: @tui.block(
129
+ title: " #{Sidekiq::NAME} - Welcome to the Sidekiq Terminal UI ",
130
+ borders: [:all],
131
+ title_style: @tui.style(fg: :light_red, modifiers: [:bold])
132
+ ),
133
+ header: ["Key", "Action"],
134
+ rows: help_rows,
135
+ widths: [
136
+ @tui.constraint_length(15),
137
+ @tui.constraint_fill(1)
138
+ ],
139
+ column_spacing: 1
152
140
  )
153
- frame.render_widget(content, main_area)
141
+ frame.render_widget(table, main_area)
154
142
  controls = @tui.block(
155
143
  title: t("Controls"),
156
144
  borders: [:all],
157
145
  children: [
158
146
  @tui.paragraph(
159
- text: [
160
- @tui.text_line(spans: [
161
- @tui.text_span(content: "Esc", style: @hotkey_style),
162
- @tui.text_span(content: ": Close ")
163
- ])
164
- ]
147
+ text: [hotkey_line("Esc", "Close ")]
165
148
  )
166
149
  ]
167
150
  )
@@ -180,27 +163,36 @@ module Sidekiq
180
163
  def render_controls(frame, area)
181
164
  active_keys = current_tab.controls.filter { |hash| hash[:description] }
182
165
 
183
- # Split controls into two lines, 8 is arbitrary
184
- # TODO Dynamically split based on term width?
185
- first = active_keys[...8]
166
+ # Dynamically split controls based on terminal width
167
+ # Estimate space needed: each control needs ~key_length + description_length + 4 chars for ": " and spacing
168
+ available_width = area.width - 4 # Account for borders
169
+
186
170
  lines = []
187
- lines << @tui.text_line(spans: first.map { |hash|
188
- [
189
- @tui.text_span(content: hash[:display] || hash[:code], style: @hotkey_style),
190
- @tui.text_span(content: ": #{t(hash[:description])} ")
191
- ]
192
- }.flatten)
171
+ current_line = []
172
+ current_width = 0
173
+
174
+ active_keys.each do |hash|
175
+ # Estimate control width: key + ": " + description + " " (spacing)
176
+ key_text = hash[:display] || hash[:code]
177
+ control_width = key_text.length + 2 + t(hash[:description]).length + 2
178
+
179
+ if current_width + control_width > available_width && !current_line.empty?
180
+ # Start a new line
181
+ lines << controls_line(current_line)
182
+ current_line = [hash]
183
+ current_width = control_width
184
+ else
185
+ current_line << hash
186
+ current_width += control_width
187
+ end
188
+ end
193
189
 
194
- last = active_keys[8...]
195
- lines << if last && last.size > 0
196
- @tui.text_line(spans: last.map { |hash|
197
- [
198
- @tui.text_span(content: hash[:display] || hash[:code], style: @hotkey_style),
199
- @tui.text_span(content: ": #{t(hash[:description])} ")
200
- ]
201
- }.flatten)
202
- else
203
- @tui.text_line(spans: [])
190
+ # Add the last line
191
+ lines << controls_line(current_line) unless current_line.empty?
192
+
193
+ # Ensure we have at least 2 lines for layout consistency
194
+ while lines.length < 2
195
+ lines << @tui.text_line(spans: [])
204
196
  end
205
197
 
206
198
  footer = [
@@ -225,6 +217,22 @@ module Sidekiq
225
217
  frame.render_widget(controls, area)
226
218
  end
227
219
 
220
+ def hotkey_line(key, description)
221
+ @tui.text_line(spans: [
222
+ @tui.text_span(content: key, style: @hotkey_style),
223
+ @tui.text_span(content: ": #{description}")
224
+ ])
225
+ end
226
+
227
+ def controls_line(keys)
228
+ @tui.text_line(spans: keys.map { |hash|
229
+ [
230
+ @tui.text_span(content: hash[:display] || hash[:code], style: @hotkey_style),
231
+ @tui.text_span(content: ": #{t(hash[:description])} ")
232
+ ]
233
+ }.flatten)
234
+ end
235
+
228
236
  def handle_input
229
237
  # We shouldn't need more than 10 FPS for a data-oriented app.
230
238
  # This throttles down our CPU usage. Default is 60 FPS.
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sidekiq
4
- VERSION = "8.1.5"
4
+ VERSION = "8.1.7"
5
5
  MAJOR = 8
6
6
 
7
7
  def self.gem_version
@@ -24,8 +24,8 @@ module Sidekiq
24
24
  @request ||= ::Rack::Request.new(env)
25
25
  end
26
26
 
27
- def halt(res)
28
- throw :halt, [res, {"content-type" => "text/plain"}, [res.to_s]]
27
+ def halt(res, msg = nil)
28
+ throw :halt, [res, {"content-type" => "text/plain"}, [msg || res.to_s]]
29
29
  end
30
30
 
31
31
  # external redirect
@@ -90,9 +90,18 @@ module Sidekiq
90
90
 
91
91
  get "/busy" do
92
92
  @count = (url_params("count") || 100).to_i
93
- (@current_page, @total_size, @workset) = page_items(workset, url_params("page"), @count)
94
93
 
95
- @iterable_states = Sidekiq::IterableJobQuery.new(workset.map { |_, _, work| work.job.jid })
94
+ # Use /busy?only=(jobs|processes) to limit page data
95
+ only = url_params("only")
96
+ halt 401, "Invalid value for only" unless only.nil? || only == "jobs" || only == "processes"
97
+
98
+ @show_jobs = (only != "processes")
99
+ @show_processes = (only != "jobs")
100
+
101
+ if @show_jobs
102
+ (@current_page, @total_size, @workset) = page_items(workset, url_params("page"), @count)
103
+ @iterable_states = Sidekiq::IterableJobQuery.new(workset.map { |_, _, work| work.job.jid })
104
+ end
96
105
 
97
106
  erb(:busy)
98
107
  end
@@ -72,19 +72,13 @@ module Sidekiq
72
72
  # so extensions can be localized
73
73
  @@strings[lang] ||= config.locales.each_with_object({}) do |path, global|
74
74
  find_locale_files(lang).each do |file|
75
- strs = parse_yaml_new(file)
75
+ strs = parse_yaml(file)
76
76
  global.merge!(strs[lang])
77
77
  end
78
78
  end
79
79
  end
80
80
 
81
- # TODO Remove
82
- def parse_yaml_old(path)
83
- require "yaml"
84
- YAML.safe_load_file(path)
85
- end
86
-
87
- def parse_yaml_new(path)
81
+ def parse_yaml(path)
88
82
  locale = nil
89
83
  map = {}
90
84
  IO.readlines(path, chomp: true).each do |line|
@@ -156,17 +150,18 @@ module Sidekiq
156
150
  erb(:filtering, locals: {which:, placeholder_key:, label_key:})
157
151
  end
158
152
 
159
- def filter_link(jid, within = "retries")
153
+ def filter_link(str, within = "retries")
154
+ hstr = h(str)
160
155
  if within.nil?
161
- ::Rack::Utils.escape_html(jid)
156
+ hstr
162
157
  else
163
- "<a href='#{root_path}#{within}?substr=#{jid}'>#{::Rack::Utils.escape_html(jid)}</a>"
158
+ "<a href='#{root_path}#{within}?substr=#{hstr}'>#{hstr}</a>"
164
159
  end
165
160
  end
166
161
 
167
162
  def display_tags(job, within = "retries")
168
163
  job.tags.map { |tag|
169
- "<span class='label label-info jobtag jobtag-#{Rack::Utils.escape_html(tag)}'>#{filter_link(tag, within)}</span>"
164
+ "<span class='label label-info jobtag jobtag-#{h(tag)}'>#{filter_link(tag, within)}</span>"
170
165
  }.join(" ")
171
166
  end
172
167
 
@@ -337,7 +332,7 @@ module Sidekiq
337
332
  [score.to_f, jid]
338
333
  end
339
334
 
340
- SAFE_QPARAMS = %w[page direction]
335
+ SAFE_QPARAMS = %w[page direction only]
341
336
 
342
337
  # Merge options with current params, filter safe params, and stringify to query string
343
338
  def qparams(options)
@@ -420,7 +415,7 @@ module Sidekiq
420
415
  end
421
416
 
422
417
  def h(text)
423
- ::Rack::Utils.escape_html(text.to_s)
418
+ ::CGI.escapeHTML(text.to_s)
424
419
  rescue ArgumentError => e
425
420
  raise unless e.message.eql?("invalid byte sequence in UTF-8")
426
421
  text.encode!("UTF-16", "UTF-8", invalid: :replace, replace: "").encode!("UTF-8", "UTF-16")
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rack"
3
+ require "uri"
4
4
 
5
5
  module Sidekiq
6
6
  class Web
@@ -28,7 +28,7 @@ module Sidekiq
28
28
 
29
29
  def match(env)
30
30
  request_method = env["REQUEST_METHOD"].downcase.to_sym
31
- path_info = ::Rack::Utils.unescape_path env["PATH_INFO"]
31
+ path_info = ::URI::RFC2396_PARSER.unescape env["PATH_INFO"]
32
32
 
33
33
  # There are servers which send an empty string when requesting the root.
34
34
  # These servers should be ashamed of themselves.
data/sidekiq.gemspec CHANGED
@@ -20,7 +20,8 @@ Gem::Specification.new do |gem|
20
20
  "documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
21
21
  "changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
22
22
  "source_code_uri" => "https://github.com/sidekiq/sidekiq",
23
- "rubygems_mfa_required" => "true"
23
+ "rubygems_mfa_required" => "true",
24
+ "mailing_list_uri" => "https://www.rubyforum.org/tag/sidekiq"
24
25
  }
25
26
 
26
27
  gem.add_dependency "redis-client", ">= 0.29.0"
data/web/locales/en.yml CHANGED
@@ -108,3 +108,4 @@ en:
108
108
  View: View
109
109
  Token: Token
110
110
  ElapsedTime: Elapsed Time
111
+ ClickToLearnMore: Click to learn more
data/web/locales/hi.yml CHANGED
@@ -8,42 +8,57 @@ hi:
8
8
  AreYouSureDeleteJob: क्या आप इस कार्य को हटाना चाहते है?
9
9
  AreYouSureDeleteQueue: क्या आप %{queue} कतार को हटाना चाहते है?
10
10
  Arguments: अर्गुमेन्ट्स्
11
+ BackToApp: ऐप पर वापस जाएँ
11
12
  Busy: व्यस्थ
12
13
  Class: क्लास
13
14
  Connections: कनेक्श्न
15
+ CreatedAt: बनाया गया
14
16
  CurrentMessagesInQueue: <span class='title'>%{queue}</span> कतार मे वर्तमान कार्य
15
17
  Dashboard: डैशबोर्ड
16
18
  Dead: निष्प्राण
17
19
  DeadJobs: निष्प्राण कार्य
18
20
  Delete: हटाओ
19
21
  DeleteAll: सब हटाओ
22
+ Deploy: परिनियोजन
20
23
  Enqueued: कतारबद्ध
21
24
  Error: एरर
22
25
  ErrorBacktrace: एरर बैकट्रेस
23
26
  ErrorClass: एरर क्लास
24
27
  ErrorMessage: एरर संदेश
28
+ ExecutionTime: निष्पादन समय
25
29
  Extras: अतिरिक्त
26
30
  Failed: असफल
27
31
  Failures: असफलता
32
+ Failure: असफलता
28
33
  GoBack: ← पीछे
29
34
  History: वृत्तान्त
30
35
  Job: कार्य
31
36
  Jobs: कार्य
32
37
  Kill: नष्ट करे
38
+ KillAll: सभी को समाप्त करें
39
+ Language: भाषा
40
+ LastDashboardUpdateTemplateLiteral: "नवीनतम पोल: संसाधित: PROCESSED_COUNT. असफल: FAILED_COUNT."
33
41
  LastRetry: अंतिम पुन:प्रयास
42
+ Latency: विलंब
34
43
  LivePoll: लाईव सर्वेक्षण
35
44
  MemoryUsage: मेमरी उपयोग
45
+ Name: नाम
36
46
  Namespace: नामस्थान
37
47
  NextRetry: अगला पुन:प्रयास
38
48
  NoDeadJobsFound: कोई निष्प्राण कार्य नही पाए गए
39
49
  NoRetriesFound: कोई पुनर्प्रयास नही पाए गए
40
50
  NoScheduledFound: कोई परिगणित कार्य नही पाए गए
51
+ NotYetEnqueued: अभी तक कतार में नहीं जोड़ा गया
41
52
  OneMonth: १ महीना
42
53
  OneWeek: १ सप्ताह
43
54
  OriginallyFailed: पहिले से विफल
55
+ Pause: रोकें
44
56
  Paused: थमे हुए
45
57
  PeakMemoryUsage: अधिकतम मेमरी उपयोग
58
+ Plugins: प्लगइन्स
46
59
  PollingInterval: सर्वेक्षण अंतराल
60
+ PollingIntervalMilliseconds: सर्वेक्षण अंतराल (मिलीसेकंड)
61
+ Process: प्रक्रिया
47
62
  Processed: कार्रवाई कृत
48
63
  Processes: प्रोसेसेस्
49
64
  Queue: कतार
@@ -57,6 +72,7 @@ hi:
57
72
  RetryNow: पुन:प्रयास करे
58
73
  Scheduled: परिगणित
59
74
  ScheduledJobs: परिगणित कार्य
75
+ Seconds: सेकंड
60
76
  ShowAll: सब दिखाएं
61
77
  SixMonths: ६ महीने
62
78
  Size: आकार
@@ -65,13 +81,31 @@ hi:
65
81
  Stop: रोको
66
82
  StopAll: सब रोको
67
83
  StopPolling: सर्वेक्षण रोको
84
+ Success: सफल
85
+ Summary: सारांश
68
86
  Thread: थ्रेड
69
87
  Threads: थ्रेड्स्
70
88
  ThreeMonths: ३ महीने
71
89
  Time: समय
90
+ Unpause: पुनः प्रारंभ करें
72
91
  Uptime: उपरिकाल (दिवस)
92
+ Utilization: उपयोग
73
93
  Version: वर्जन
74
94
  When: कब
75
95
  Worker: वर्कर
76
96
  active: सक्रिय
77
97
  idle: निष्क्रिय
98
+ Metrics: मेट्रिक्स
99
+ NoDataFound: कोई डेटा नहीं मिला
100
+ TotalExecutionTime: कुल निष्पादन समय
101
+ AvgExecutionTime: औसत निष्पादन समय
102
+ Context: संदर्भ
103
+ NoJobMetricsFound: हाल के कार्यों के लिए कोई मेट्रिक्स नहीं मिले
104
+ Filter: फ़िल्टर
105
+ AnyJobContent: कोई भी कार्य सामग्री
106
+ Profiles: प्रोफ़ाइल
107
+ Data: डेटा
108
+ View: देखें
109
+ Token: टोकन
110
+ ElapsedTime: बीता हुआ समय
111
+ ClickToLearnMore: अधिक जानने के लिए क्लिक करें
data/web/locales/ta.yml CHANGED
@@ -5,73 +5,107 @@ ta:
5
5
  AddToQueue: வரிசையில் சேர்
6
6
  AddAllToQueue: அனைத்தையும் வரிசையில் சேர்
7
7
  AreYouSure: நீங்கள் உறுதியாக இருக்கிறீர்களா?
8
- AreYouSureDeleteJob: நீ இந்த வேலையை நீக்க வேண்டும் என்று உறுதியாக இருக்கிறீர்களா?
9
- AreYouSureDeleteQueue: நீங்கள் %{queue} வரிசையில் நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?
10
- Arguments: வாதங்கள்,
11
- Busy: பணிமிகுதி
8
+ AreYouSureDeleteJob: இந்த பணியை நீக்க விரும்புகிறீர்களா?
9
+ AreYouSureDeleteQueue: "%{queue} வரிசையை நீக்க விரும்புகிறீர்களா? இது வரிசையிலுள்ள அனைத்து பணிகளையும் நீக்கிவிடும், எதிர்காலத்தில் மேலும் பணிகளை அனுப்பினால் இது மீண்டும் தோன்றும்."
10
+ Arguments: அளவுருக்கள்
11
+ BackToApp: பயன்பாட்டிற்குத் திரும்பு
12
+ Busy: செயலில்
12
13
  Class: வகுப்பு
13
14
  Connections: இணைப்புகள்
14
- CurrentMessagesInQueue: தற்போதைய வேலைகள் <span class='title'>%{queue}</span>
15
- Dashboard: டாஷ்போர்டு
16
- Dead: இறந்துபோன
17
- DeadJobs: டெட் வேலைகள்
15
+ CreatedAt: உருவாக்கப்பட்ட நேரம்
16
+ CurrentMessagesInQueue: <span class='title'>%{queue}</span> இல் உள்ள தற்போதைய பணிகள்
17
+ Dashboard: தகவற்பலகை
18
+ Dead: முடிந்தது
19
+ DeadJobs: முடிந்த பணிகள்
18
20
  Delete: நீக்கு
19
- DeleteAll: அனைத்து நீக்கு
20
- Enqueued: வரிசைப்படுத்தப்பட்டவை
21
+ DeleteAll: அனைத்தையும் நீக்கு
22
+ Deploy: வரிசைப்படுத்து
23
+ Enqueued: வரிசையிடப்பட்டது
21
24
  Error: பிழை
22
- ErrorBacktrace: பிழை பின்தேடுலை
25
+ ErrorBacktrace: பிழை பின்தடம்
23
26
  ErrorClass: பிழை வகுப்பு
24
27
  ErrorMessage: பிழை செய்தி
25
- Extras: உபரி
26
- Failed: தோல்வி
27
- Failures: தோல்விகள்
28
- GoBack: பின்புறம்
28
+ ExecutionTime: செயல்படுத்தும் நேரம்
29
+ Extras: கூடுதல்
30
+ Failed: தோல்வியடைந்தது
31
+ Failures: தோல்விகள்
32
+ Failure: தோல்வி
33
+ GoBack: ← பின் செல்
29
34
  History: வரலாறு
30
- Job: வேலை
31
- Jobs: வேலை வாய்ப்புகள்
32
- Kill: கொல்
33
- LastRetry: கடைசியாக, மீண்டும் முயற்சிக்கவும்
34
- LivePoll: நேரடி கணிப்பு
35
+ Job: பணி
36
+ Jobs: பணிகள்
37
+ Kill: நிறுத்து
38
+ KillAll: அனைத்தையும் நிறுத்து
39
+ Language: மொழி
40
+ LastDashboardUpdateTemplateLiteral: "கடைசி சோதனை: செயலாக்கப்பட்டவை: PROCESSED_COUNT. தோல்வியடைந்தவை: FAILED_COUNT."
41
+ LastRetry: கடைசி மறுமுயற்சி
42
+ Latency: தாமதம்
43
+ LivePoll: நேரடி சோதனை
35
44
  MemoryUsage: நினைவக பயன்பாடு
45
+ Name: பெயர்
36
46
  Namespace: பெயர்வெளி
37
- NextRetry: அடுத்த, மீண்டும் முயற்சிக்கவும்
38
- NoDeadJobsFound: இறந்த வேலை எதுவும் இல்லை
39
- NoRetriesFound: இல்லை மீண்டும் காணப்படவில்லை
40
- NoScheduledFound: திட்டமிட்ட வேலைகள் காணப்படவில்லை
47
+ NextRetry: அடுத்த மறுமுயற்சி
48
+ NoDeadJobsFound: முடிந்த பணிகள் எதுவும் கிடைக்கவில்லை
49
+ NoRetriesFound: மறுமுயற்சிகள் எதுவும் கிடைக்கவில்லை
50
+ NoScheduledFound: திட்டமிடப்பட்ட பணிகள் எதுவும் கிடைக்கவில்லை
51
+ NotYetEnqueued: இன்னும் வரிசையிடப்படவில்லை
41
52
  OneMonth: 1 மாதம்
42
53
  OneWeek: 1 வாரம்
43
- OriginallyFailed: முதலில் தோல்வி
44
- Paused: தற்காலிக பணிநிறுத்தம்
45
- PeakMemoryUsage: உச்ச நினைவக பயன்பாடு
46
- PollingInterval: வாக்குப்பதிவு இடைவெளி
47
- Processed: நிறையுற்றது
54
+ OriginallyFailed: முதலில் தோல்வியடைந்தது
55
+ Pause: இடைநிறுத்து
56
+ Paused: இடைநிறுத்தப்பட்டது
57
+ PeakMemoryUsage: அதிகபட்ச நினைவக பயன்பாடு
58
+ Plugins: செருகுநிரல்கள்
59
+ PollingInterval: சோதனை இடைவெளி
60
+ PollingIntervalMilliseconds: சோதனை இடைவெளி மில்லிவினாடிகள்
61
+ Process: செயல்முறை
62
+ Processed: செயலாக்கப்பட்டது
48
63
  Processes: செயல்முறைகள்
49
64
  Queue: வரிசை
50
- Queues: வரிசை
51
- Quiet: அமைதியான
52
- QuietAll: அமைதியான அனைத்து
53
- Realtime: நேரலை
54
- Retries: மீண்டும் முயற்சிக்க,
55
- RetryAll: அனைத்து, மீண்டும் முயற்சிக்கவும்
56
- RetryCount: கணிப்பீடு, மீண்டும் முயற்சிக்கவும்
57
- RetryNow: இப்போது மீண்டும் முயற்சி செய்க
58
- Scheduled: திட்டமிடப்பட்ட
59
- ScheduledJobs: திட்டமிட்ட வேலைகள்
60
- ShowAll: அனைத்து காட்டு
65
+ Queues: வரிசைகள்
66
+ Quiet: அமைதி
67
+ QuietAll: அனைத்தையும் அமைதிப்படுத்து
68
+ Realtime: நிகழ்நேரம்
69
+ Retries: மறுமுயற்சிகள்
70
+ RetryAll: அனைத்தையும் மறுமுயற்சி செய்
71
+ RetryCount: மறுமுயற்சி எண்ணிக்கை
72
+ RetryNow: இப்போது மறுமுயற்சி செய்
73
+ Scheduled: திட்டமிடப்பட்டது
74
+ ScheduledJobs: திட்டமிடப்பட்ட பணிகள்
75
+ Seconds: வினாடிகள்
76
+ ShowAll: அனைத்தையும் காட்டு
61
77
  SixMonths: 6 மாதங்கள்
62
78
  Size: அளவு
63
- Started: தொடங்குதல்
64
- Status: நிலைமை
79
+ Started: தொடங்கப்பட்டது
80
+ Status: நிலை
65
81
  Stop: நிறுத்து
66
- StopAll: நிறுத்து அனைத்து
67
- StopPolling: நிறுத்து வாக்குப்பதிவு
82
+ StopAll: அனைத்தையும் நிறுத்து
83
+ StopPolling: சோதனையை நிறுத்து
84
+ Success: வெற்றி
85
+ Summary: சுருக்கம்
68
86
  Thread: நூல்
69
87
  Threads: நூல்கள்
70
88
  ThreeMonths: 3 மாதங்கள்
71
89
  Time: நேரம்
72
- Uptime: இயக்க நேரம் (நாட்கள்)
90
+ Unpause: இடைநிறுத்தத்தை நீக்கு
91
+ Uptime: இயங்கிய நேரம் (நாட்கள்)
92
+ Utilization: பயன்பாட்டு விகிதம்
73
93
  Version: பதிப்பு
74
- When: எப்பொழுது?
94
+ When: எப்போது
75
95
  Worker: பணியாளர்
76
96
  active: செயலில்
77
- idle: முடங்கு நேரம்
97
+ idle: செயலற்று
98
+ Metrics: அளவீடுகள்
99
+ NoDataFound: தரவு எதுவும் கிடைக்கவில்லை
100
+ TotalExecutionTime: மொத்த செயல்படுத்தும் நேரம்
101
+ AvgExecutionTime: சராசரி செயல்படுத்தும் நேரம்
102
+ Context: சூழல்
103
+ NoJobMetricsFound: சமீபத்திய பணி அளவீடுகள் எதுவும் கிடைக்கவில்லை
104
+ Filter: வடிகட்டி
105
+ AnyJobContent: எந்த பணி உள்ளடக்கமும்
106
+ Profiles: சுயவிவரங்கள்
107
+ Data: தரவு
108
+ View: பார்வை
109
+ Token: டோக்கன்
110
+ ElapsedTime: கடந்த நேரம்
111
+ ClickToLearnMore: மேலும் அறிய கிளிக் செய்யவும்
@@ -11,7 +11,7 @@
11
11
  <p id="serverUtcTime"><%= server_utc_time %></p>
12
12
  </li>
13
13
  <li>
14
- <p><a rel="help" href="https://github.com/sidekiq/sidekiq/wiki">docs</a></p>
14
+ <p><a rel="help" href="https://sidekiq.org/wiki">docs</a></p>
15
15
  </li>
16
16
  <li>
17
17
  <form id="locale-form" action="<%= root_path %>change_locale" method="post">
@@ -9,7 +9,7 @@
9
9
  <tr>
10
10
  <th><%= t('Queue') %></th>
11
11
  <td>
12
- <a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
12
+ <a href="<%= root_path %>queues/<%= CGI.escape(job.queue) %>"><%= h job.queue %></a>
13
13
  </td>
14
14
  </tr>
15
15
  <tr>