sidekiq_monitor 0.0.3 → 0.0.4
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.
- data/README.md +7 -1
- data/app/assets/javascripts/sidekiq/monitor/abstract_jobs_table.js.coffee +21 -4
- data/app/assets/javascripts/sidekiq/monitor/jobs_table.js.coffee +14 -12
- data/app/assets/javascripts/sidekiq/monitor/queue_jobs_table.js.coffee +14 -12
- data/app/controllers/sidekiq/monitor/api/jobs_controller.rb +17 -3
- data/app/datatables/sidekiq/monitor/jobs_datatable.rb +2 -0
- data/app/views/sidekiq/monitor/jobs/_jobs.slim +1 -0
- data/app/views/sidekiq/monitor/queues/_jobs.slim +1 -0
- data/config/routes.rb +1 -1
- data/lib/sidekiq/monitor.rb +2 -0
- data/lib/sidekiq/monitor/custom_views.rb +26 -0
- data/lib/sidekiq/monitor/processor.rb +3 -1
- data/lib/sidekiq/monitor/version.rb +1 -1
- metadata +19 -2
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Advanced monitoring for Sidekiq
|
|
4
4
|
|
5
5
|
Description
|
6
6
|
-----------
|
7
|
-
Sidekiq Monitor offers a detailed
|
7
|
+
Sidekiq Monitor offers a detailed UI for monitoring Sidekiq jobs, letting you filter, search, and sort jobs by many attributes, view error backtraces, set job completion metadata, and more.
|
8
8
|
|
9
9
|
It lets you:
|
10
10
|
|
@@ -30,6 +30,12 @@ And it looks like this:
|
|
30
30
|
|
31
31
|
[<img src="https://raw.github.com/socialpandas/sidekiq_monitor/master/examples/screenshot.png" />](https://raw.github.com/socialpandas/sidekiq_monitor/master/examples/screenshot.png)
|
32
32
|
|
33
|
+
Sidekiq Monitor stores jobs using ActiveRecord, allowing you to perform complex queries and delete specific collections of jobs:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
Sidekiq::Monitor::Job.where(queue: 'user_update').where('enqueued_at > ?', 2.days.ago).destroy_all
|
37
|
+
```
|
38
|
+
|
33
39
|
Installation
|
34
40
|
------------
|
35
41
|
|
@@ -58,8 +58,8 @@ class SidekiqMonitor.AbstractJobsTable
|
|
58
58
|
@show_job(job)
|
59
59
|
false
|
60
60
|
@table.on 'click', '.retry-job', (e) =>
|
61
|
-
|
62
|
-
$.getJSON SidekiqMonitor.settings.api_url('jobs/retry
|
61
|
+
id = $(e.target).attr('data-job-id')
|
62
|
+
$.getJSON SidekiqMonitor.settings.api_url('jobs/retry/'+id), =>
|
63
63
|
@reload_table()
|
64
64
|
false
|
65
65
|
|
@@ -77,8 +77,10 @@ class SidekiqMonitor.AbstractJobsTable
|
|
77
77
|
show_job: (job) =>
|
78
78
|
return false if !job?
|
79
79
|
|
80
|
+
id = job[@columns.id]
|
80
81
|
jid = job[@columns.jid]
|
81
82
|
class_name = job[@columns.class_name]
|
83
|
+
name = job[@columns.name]
|
82
84
|
started_at = job[@columns.started_at]
|
83
85
|
duration = job[@columns.duration]
|
84
86
|
status = job[@columns.status]
|
@@ -122,9 +124,13 @@ class SidekiqMonitor.AbstractJobsTable
|
|
122
124
|
<th>Class</th>
|
123
125
|
<td>#{class_name}</td>
|
124
126
|
</tr>
|
127
|
+
<tr>
|
128
|
+
<th>Name</th>
|
129
|
+
<td>#{name}</td>
|
130
|
+
</tr>
|
125
131
|
<tr>
|
126
132
|
<th>Args</th>
|
127
|
-
<td>#{args}</td>
|
133
|
+
<td>#{JSON.stringify(args, null, 2)}</td>
|
128
134
|
</tr>
|
129
135
|
<tr>
|
130
136
|
<th>Started</th>
|
@@ -140,12 +146,23 @@ class SidekiqMonitor.AbstractJobsTable
|
|
140
146
|
</tr>
|
141
147
|
</table>
|
142
148
|
#{result_html}
|
149
|
+
<div class="job-custom-views"></div>
|
143
150
|
</div>
|
144
151
|
</div>
|
145
152
|
"""
|
146
153
|
$('.job-modal').modal('hide')
|
147
154
|
$('body').append(modal_html)
|
148
|
-
$('.job-modal:last')
|
155
|
+
modal = $('.job-modal:last')
|
156
|
+
modal.modal
|
157
|
+
width: 480
|
158
|
+
$.getJSON SidekiqMonitor.settings.api_url("jobs/custom_views/#{id}"), (views) ->
|
159
|
+
html = ''
|
160
|
+
for view in views
|
161
|
+
html += """
|
162
|
+
<h4>#{view['name']}</h4>
|
163
|
+
#{view['html']}
|
164
|
+
"""
|
165
|
+
$('.job-custom-views', modal).html(html)
|
149
166
|
|
150
167
|
on_poll: =>
|
151
168
|
@reload_table()
|
@@ -4,18 +4,20 @@ class SidekiqMonitor.JobsTable extends SidekiqMonitor.AbstractJobsTable
|
|
4
4
|
options =
|
5
5
|
table_selector: 'table.jobs'
|
6
6
|
columns:
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
id: 0
|
8
|
+
jid: 1
|
9
|
+
queue: 2
|
10
|
+
class_name: 3
|
11
|
+
name: 4
|
12
|
+
enqueued_at: 5
|
13
|
+
started_at: 6
|
14
|
+
duration: 7
|
15
|
+
message: 8
|
16
|
+
status: 9
|
17
|
+
result: 10
|
18
|
+
args: 11
|
18
19
|
column_options: [
|
20
|
+
{ bVisible: false }
|
19
21
|
{ bVisible: false }
|
20
22
|
null
|
21
23
|
null
|
@@ -44,7 +46,7 @@ class SidekiqMonitor.JobsTable extends SidekiqMonitor.AbstractJobsTable
|
|
44
46
|
'info'
|
45
47
|
html = """<a href="#" class="btn btn-#{class_name} btn-mini status-value">#{oObj.aData[@columns.status]}</a>"""
|
46
48
|
if status == 'failed'
|
47
|
-
html += """<a href="#" class="btn btn-mini btn-primary retry-job" data-job-
|
49
|
+
html += """<a href="#" class="btn btn-mini btn-primary retry-job" data-job-id="#{oObj.aData[@columns.id]}">Retry<a>"""
|
48
50
|
"""<span class="action-buttons">#{html}</span>"""
|
49
51
|
}
|
50
52
|
{ bVisible: false }
|
@@ -4,18 +4,20 @@ class SidekiqMonitor.QueuesTable extends SidekiqMonitor.AbstractJobsTable
|
|
4
4
|
options =
|
5
5
|
table_selector: 'table.queue-jobs'
|
6
6
|
columns:
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
7
|
+
id: 0
|
8
|
+
jid: 1
|
9
|
+
queue: 2
|
10
|
+
class_name: 3
|
11
|
+
name: 4
|
12
|
+
enqueued_at: 5
|
13
|
+
started_at: 6
|
14
|
+
duration: 7
|
15
|
+
message: 8
|
16
|
+
status: 9
|
17
|
+
result: 10
|
18
|
+
args: 11
|
18
19
|
column_options: [
|
20
|
+
{ bVisible: false }
|
19
21
|
{ bVisible: false }
|
20
22
|
{ bVisible: false }
|
21
23
|
null
|
@@ -44,7 +46,7 @@ class SidekiqMonitor.QueuesTable extends SidekiqMonitor.AbstractJobsTable
|
|
44
46
|
'info'
|
45
47
|
html = """<a href="#" class="btn btn-#{class_name} btn-mini status-value">#{oObj.aData[@columns.status]}</a>"""
|
46
48
|
if status == 'failed'
|
47
|
-
html += """<a href="#" class="btn btn-mini btn-primary retry-job" data-job-
|
49
|
+
html += """<a href="#" class="btn btn-mini btn-primary retry-job" data-job-id="#{oObj.aData[@columns.id]}">Retry<a>"""
|
48
50
|
"""<span class="action-buttons">#{html}</span>"""
|
49
51
|
}
|
50
52
|
{ bVisible: false }
|
@@ -8,11 +8,25 @@ module Sidekiq
|
|
8
8
|
render json: JobsDatatable.new(view_context)
|
9
9
|
end
|
10
10
|
|
11
|
+
def custom_views
|
12
|
+
job = Job.find(params[:id])
|
13
|
+
render json: {}, status: 404 and return if job.blank?
|
14
|
+
|
15
|
+
views = CustomViews.for_job(job)
|
16
|
+
views = views.collect do |view|
|
17
|
+
{
|
18
|
+
name: view[:name],
|
19
|
+
html: render_to_string(view[:path], locals: {job: job, path: view[:path]})
|
20
|
+
}
|
21
|
+
end
|
22
|
+
render json: views, status: :ok
|
23
|
+
end
|
24
|
+
|
11
25
|
def retry
|
12
|
-
|
13
|
-
render json: {}, status: 404 and return if
|
26
|
+
id = params[:id]
|
27
|
+
render json: {}, status: 404 and return if id.blank?
|
14
28
|
|
15
|
-
job = Job.
|
29
|
+
job = Job.find(id)
|
16
30
|
render json: {}, status: 404 and return if job.blank?
|
17
31
|
|
18
32
|
args = job.args
|
@@ -6,6 +6,7 @@ module Sidekiq
|
|
6
6
|
def initialize(view)
|
7
7
|
@model_name = Sidekiq::Monitor::Job
|
8
8
|
@columns = [
|
9
|
+
'sidekiq_jobs.id',
|
9
10
|
'sidekiq_jobs.jid',
|
10
11
|
'sidekiq_jobs.queue',
|
11
12
|
'sidekiq_jobs.class_name',
|
@@ -33,6 +34,7 @@ module Sidekiq
|
|
33
34
|
def data
|
34
35
|
jobs.map do |job|
|
35
36
|
[
|
37
|
+
job.id,
|
36
38
|
job.jid,
|
37
39
|
job.queue,
|
38
40
|
job.class_name,
|
data/config/routes.rb
CHANGED
data/lib/sidekiq/monitor.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Sidekiq
|
2
|
+
module Monitor
|
3
|
+
class CustomViews
|
4
|
+
@views = []
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def add(name, path, &block)
|
8
|
+
@views << {
|
9
|
+
name: name,
|
10
|
+
path: path,
|
11
|
+
filter: block
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def for_job(job)
|
16
|
+
views = []
|
17
|
+
@views.each do |view|
|
18
|
+
is_valid = view[:filter].call(job)
|
19
|
+
views << view.dup if is_valid
|
20
|
+
end
|
21
|
+
views
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -19,6 +19,7 @@ module Sidekiq
|
|
19
19
|
def start(worker, msg, queue)
|
20
20
|
jid = msg['jid']
|
21
21
|
args = msg['args']
|
22
|
+
now = DateTime.now
|
22
23
|
job = Sidekiq::Monitor::Job.find_by_jid(jid)
|
23
24
|
if job.blank?
|
24
25
|
name = job_name(worker.class, args)
|
@@ -28,11 +29,12 @@ module Sidekiq
|
|
28
29
|
class_name: worker.class.name,
|
29
30
|
args: args,
|
30
31
|
retry: msg['retry'],
|
32
|
+
enqueued_at: now,
|
31
33
|
name: name
|
32
34
|
)
|
33
35
|
end
|
34
36
|
job.update_attributes(
|
35
|
-
started_at:
|
37
|
+
started_at: now,
|
36
38
|
status: 'running'
|
37
39
|
)
|
38
40
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_monitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
@@ -43,6 +43,22 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: jquery-datatables-rails
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: ajax-datatables-rails
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,6 +115,7 @@ files:
|
|
99
115
|
- lib/generators/sidekiq/monitor/install/templates/create_sidekiq_jobs.rb
|
100
116
|
- lib/sidekiq/monitor/cleaner.rb
|
101
117
|
- lib/sidekiq/monitor/client/middleware.rb
|
118
|
+
- lib/sidekiq/monitor/custom_views.rb
|
102
119
|
- lib/sidekiq/monitor/engine.rb
|
103
120
|
- lib/sidekiq/monitor/processor.rb
|
104
121
|
- lib/sidekiq/monitor/server/middleware.rb
|