dj_mon 0.0.6 → 0.1.0

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 CHANGED
@@ -16,6 +16,9 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install dj_mon
18
18
 
19
+ ## Note
20
+ Supports only `activerecord` for now.
21
+
19
22
  ## Usage
20
23
 
21
24
  If you are using Rails =< 3.1, or if `config.assets.initialize_on_precompile` is set to false, then add this to `config/environments/production.rb`.
@@ -32,13 +35,15 @@ This uses http basic auth for authentication. Set the credentials in an initiali
32
35
  YourApp::Application.config.dj_mon.password = "password"
33
36
 
34
37
  If the credentials are not set, then the username and password are assumed to be the above mentioned.
35
-
38
+
36
39
  Now visit `http://localhost:3000/dj_mon` and profit!
37
40
 
38
- ## Features
39
- * See Jobs by status
40
- * Inspect the payload
41
- * Inspect the last run error.
41
+ ## Demo
42
+ * Source [DJ Mon](https://github.com/akshayrawat/dj_mon)
43
+ * URL: [Demo](http://dj-mon-demo.herokuapp.com/)
44
+ * Username: `dj_mon`
45
+ * Password: `password`
46
+
42
47
 
43
48
  ## ROADMAP
44
49
  * Delete failed or queued jobs
@@ -53,4 +58,4 @@ Now visit `http://localhost:3000/dj_mon` and profit!
53
58
  2. Create your feature branch (`git checkout -b my-new-feature`)
54
59
  3. Commit your changes (`git commit -am 'Added some feature'`)
55
60
  4. Push to the branch (`git push origin my-new-feature`)
56
- 5. Create new Pull Request
61
+ 5. Create new Pull Request
@@ -29,8 +29,8 @@ $(function(){
29
29
  });
30
30
 
31
31
  $('a[rel=modal]').live('click', function(){
32
- var template = $('#last_error_template').html();
33
- var output = Mustache.render(template, { last_error: $(this).data('content') });
32
+ var template = $($(this).attr('href')).html();
33
+ var output = Mustache.render(template, { content: $(this).data('content') });
34
34
  $(output).appendTo($('body')).show();
35
35
  });
36
36
 
@@ -4,16 +4,16 @@ body {
4
4
  padding: 90px;
5
5
  }
6
6
 
7
- table.table td, table.table th {
7
+ table#jobs-table td, table#jobs-table th {
8
8
  text-align: center;
9
9
  }
10
10
 
11
- table.table td.date, table.table th.date {
11
+ table#jobs-table td.date, table#jobs-table th.date {
12
12
  text-align: left;
13
13
  }
14
14
 
15
- table.table td.date {
16
- font-size: 90%;
15
+ table#jobs-table td.date {
16
+ font-size: 80%;
17
17
  }
18
18
 
19
19
  .centered {
@@ -24,6 +24,7 @@ code.block {
24
24
  display: block;
25
25
  word-wrap: break-word;
26
26
  }
27
+
27
28
  #dj-counts-view {
28
29
  position: relative;
29
30
  top: 12px;
@@ -33,4 +34,4 @@ code.block {
33
34
  #dj-counts-view .badge {
34
35
  float: right;
35
36
  margin: 0 2px;
36
- }
37
+ }
@@ -27,6 +27,10 @@ module DjMon
27
27
  def dj_counts
28
28
  respond_with DjReport.dj_counts
29
29
  end
30
+
31
+ def settings
32
+ respond_with DjReport.settings
33
+ end
30
34
 
31
35
  protected
32
36
 
@@ -1,7 +1,8 @@
1
1
  module DjMon
2
2
  class DjReport
3
+
3
4
  attr_accessor :delayed_job
4
-
5
+
5
6
  def initialize delayed_job
6
7
  self.delayed_job = delayed_job
7
8
  end
@@ -12,12 +13,12 @@ module DjMon
12
13
  payload: delayed_job.payload_object.object.to_yaml,
13
14
  priority: delayed_job.priority,
14
15
  attempts: delayed_job.attempts,
15
- queue: delayed_job.queue,
16
+ queue: delayed_job.queue || "global",
16
17
  last_error_summary: delayed_job.last_error.to_s.truncate(30),
17
18
  last_error: delayed_job.last_error,
18
- failed_at: l_date(delayed_job.failed_at),
19
- run_at: l_date(delayed_job.run_at),
20
- created_at: l_date(delayed_job.created_at)
19
+ failed_at: l_datetime(delayed_job.failed_at),
20
+ run_at: l_datetime(delayed_job.run_at),
21
+ created_at: l_datetime(delayed_job.created_at)
21
22
  }
22
23
  end
23
24
 
@@ -32,7 +33,7 @@ module DjMon
32
33
  end
33
34
 
34
35
  def active
35
- Delayed::Job.where('delayed_jobs.locked_by IS NOT NULL')
36
+ Delayed::Job.where('delayed_jobs.failed_at IS NULL AND delayed_jobs.locked_by IS NOT NULL')
36
37
  end
37
38
 
38
39
  def queued
@@ -67,12 +68,22 @@ module DjMon
67
68
  }
68
69
  end
69
70
 
71
+ def settings
72
+ {
73
+ destroy_failed_jobs: Delayed::Worker.destroy_failed_jobs,
74
+ sleep_delay: Delayed::Worker.sleep_delay,
75
+ max_attempts: Delayed::Worker.max_attempts,
76
+ max_run_time: Delayed::Worker.max_run_time,
77
+ read_ahead: Delayed::Worker.read_ahead,
78
+ delay_jobs: Delayed::Worker.delay_jobs
79
+ }
80
+ end
70
81
  end
71
82
 
72
83
  private
73
-
74
- def l_date date
84
+ def l_datetime date
75
85
  date.present? ? I18n.l(date) : ""
76
86
  end
77
87
  end
78
- end
88
+
89
+ end
@@ -1,34 +1,32 @@
1
- %header
2
- %p.lead Delayed Jobs
3
- .subnav
4
- %ul.nav.nav-tabs
5
- %li.active
6
- = link_to "All", "#all", "data-toggle" => "tab"
7
- %li
8
- = link_to "Failed", "#failed", "data-toggle" => "tab"
9
- %li
10
- = link_to "Queued", "#queued", "data-toggle" => "tab"
11
- %li
12
- = link_to "Active", "#active", "data-toggle" => "tab"
1
+ %p.lead Delayed Jobs
2
+ %ul.nav.nav-tabs
3
+ %li.active
4
+ = link_to "All", "#all", "data-toggle" => "tab"
5
+ %li
6
+ = link_to "Failed", "#failed", "data-toggle" => "tab"
7
+ %li
8
+ = link_to "Queued", "#queued", "data-toggle" => "tab"
9
+ %li
10
+ = link_to "Active", "#active", "data-toggle" => "tab"
13
11
 
14
- .tab-content
15
- .tab-pane#all.active{ 'data-url' => all_dj_reports_url }
16
- .tab-pane#failed{ 'data-url'=> failed_dj_reports_url }
17
- .tab-pane#active{ 'data-url'=> active_dj_reports_url }
18
- .tab-pane#queued{ 'data-url'=> queued_dj_reports_url }
12
+ .tab-content
13
+ .tab-pane#all.active{ 'data-url' => all_dj_reports_url }
14
+ .tab-pane#failed{ 'data-url'=> failed_dj_reports_url }
15
+ .tab-pane#active{ 'data-url'=> active_dj_reports_url }
16
+ .tab-pane#queued{ 'data-url'=> queued_dj_reports_url }
19
17
 
20
18
  %script#dj_reports_template{ :type=> "text/x-handlebars-template" }
21
- %table.table.table-striped
19
+ %table.table.table-striped#jobs-table
22
20
  %thead
23
21
  %tr
22
+ %th
23
+ Queue
24
24
  %th
25
25
  ID
26
26
  %th
27
27
  Priority
28
28
  %th
29
29
  Attempts
30
- %th
31
- Queue
32
30
  %th
33
31
  Last Error
34
32
  %th.date
@@ -40,6 +38,9 @@
40
38
  %tbody
41
39
  {{#.}}
42
40
  %tr
41
+ %td
42
+ .label.label-info
43
+ {{queue}}
43
44
  %td
44
45
  <a href="#" data-content="<code class='block'>{{payload}}</code>" rel='popover' title='Payload'> {{id}} </a>
45
46
  %td
@@ -47,19 +48,17 @@
47
48
  %td
48
49
  {{attempts}}
49
50
  %td
50
- {{queue}}
51
- %td
52
- <a href="#" data-content="{{last_error}}" rel='modal' title='Last Error'> {{last_error_summary}} </a>
51
+ <a href="#last_error_template" data-content="{{last_error}}" rel='modal' title='Last Error'> {{last_error_summary}} </a>
53
52
  %td.date
54
53
  {{failed_at}}
55
54
  %td.date
56
- {{job.run_at}}
55
+ {{run_at}}
57
56
  %td.date
58
57
  {{created_at}}
59
58
  {{/.}}
60
59
 
61
60
  %script#last_error_template{ :type=> "text/x-handlebars-template" }
62
- .modal.hide#last_error_modal
61
+ .modal.hide
63
62
  .modal-header
64
63
  %button{ type: "button", class: "close", 'data-dismiss' => "modal" }
65
64
  ×
@@ -67,6 +66,6 @@
67
66
  Last Error
68
67
  .modal-body
69
68
  %code
70
- {{last_error}}
69
+ {{content}}
71
70
  .modal-footer
72
- = link_to "Close", '#', class: 'btn btn-primary', 'data-dismiss'=> 'modal'
71
+ = link_to "Close", '#', class: 'btn btn-primary', 'data-dismiss'=> 'modal'
@@ -11,6 +11,9 @@
11
11
  .container
12
12
  .pull-left
13
13
  = link_to "DJ Mon", dj_reports_url, class: "brand"
14
+ .pull-right
15
+ = link_to "Settings", "#dj_settings_template", rel: 'modal', 'data-content'=> "#{DjMon::DjReport.settings.to_json}", id: 'settings', class: 'btn btn-primary btn-mini'
16
+
14
17
  .pull-right
15
18
  #dj-counts-view
16
19
 
@@ -21,9 +24,53 @@
21
24
  = javascript_include_tag "dj_mon.js"
22
25
 
23
26
  %script#dj_counts_template{ :type=> "text/x-handlebars-template" }
24
- %span.badge.badge-warning
25
- {{active}} active
26
- %span.badge.badge-info
27
+ %span.badge
27
28
  {{queued}} queued
28
- %span.badge.badge-important
29
+ %span.badge.badge-info
30
+ {{active}} active
31
+ %span.badge.badge-warning
29
32
  {{failed}} failed
33
+
34
+ %script#dj_settings_template{ :type=> "text/x-handlebars-template" }
35
+ .modal.hide
36
+ .modal-header
37
+ %button{ type: "button", class: "close", 'data-dismiss' => "modal" }
38
+ ×
39
+ %h3
40
+ Delayed Job Settings
41
+ .modal-body
42
+ %table.table.table-bordered.table-striped
43
+ %tr
44
+ %td
45
+ Destroy failed jobs:
46
+ %td
47
+ <code>{{content.destroy_failed_jobs}}</code>
48
+ %tr
49
+ %td
50
+ Sleep delay:
51
+ %td
52
+ <code>{{content.sleep_delay}}</code> seconds
53
+ %tr
54
+ %td
55
+ Max attempts:
56
+ %td
57
+ <code>{{content.max_attempts}}</code>
58
+ %tr
59
+ %td
60
+ Max run time:
61
+ %td
62
+ <code>{{content.max_run_time}}</code> seconds
63
+ %tr
64
+ %td
65
+ Read ahead:
66
+ %td
67
+ <code>{{content.read_ahead}}</code>
68
+ %tr
69
+ %td
70
+ Delay Jobs:
71
+ %td
72
+ <code>{{content.delay_jobs}}</code>
73
+
74
+ .modal-footer
75
+ = link_to "Close", '#', class: 'btn btn-primary', 'data-dismiss'=> 'modal'
76
+
data/config/routes.rb CHANGED
@@ -7,6 +7,7 @@ DjMon::Engine.routes.draw do
7
7
  get :active
8
8
  get :queued
9
9
  get :dj_counts
10
+ get :settings
10
11
  end
11
12
  end
12
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dj_mon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: