beanstalkd_view 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/Gruntfile.js +41 -0
  2. data/README.md +13 -1
  3. data/Rakefile +0 -2
  4. data/lib/beanstalkd_view/beanstalkd_utils.rb +11 -16
  5. data/lib/beanstalkd_view/resources/css/beanstalkd_view.css +76 -0
  6. data/lib/beanstalkd_view/resources/js/beanstalkd_view.js +242 -0
  7. data/lib/beanstalkd_view/resources/js/beanstalkd_view.min.js +6 -0
  8. data/lib/beanstalkd_view/server.rb +0 -17
  9. data/lib/beanstalkd_view/version.rb +1 -1
  10. data/lib/beanstalkd_view/views/index.erb +30 -78
  11. data/lib/beanstalkd_view/views/job_info_popup.erb +67 -6
  12. data/lib/beanstalkd_view/views/layout.erb +2 -7
  13. data/lib/beanstalkd_view/views/peek_range.erb +1 -1
  14. data/lib/beanstalkd_view/views/tube_stats.erb +34 -35
  15. data/lib/beanstalkd_view.rb +0 -1
  16. data/package.json +10 -0
  17. data/spec/{integration → features}/rails_integration_spec.rb +1 -1
  18. data/spec/{integration → features}/sinatra_integration_spec.rb +1 -1
  19. data/spec/rails_app/log/test.log +990 -3
  20. data/spec/support/integration_test_shared_examples.rb +3 -3
  21. data/spec/support/queue_browser_shared_examples.rb +13 -13
  22. data/{lib/beanstalkd_view/resources → web}/css/app.css +0 -0
  23. data/{lib/beanstalkd_view/resources → web}/css/vendor/bootstrap.min.css +0 -0
  24. data/web/js/draw_chart.js +49 -0
  25. data/web/js/initialization.js +20 -0
  26. data/web/js/peek_jobs.js +135 -0
  27. data/web/js/peek_range.js +24 -0
  28. data/{lib/beanstalkd_view/resources → web}/js/vendor/bluff-0.3.6.2/bluff-min.js +0 -0
  29. data/{lib/beanstalkd_view/resources → web}/js/vendor/bluff-0.3.6.2/js-class.js +0 -0
  30. data/{lib/beanstalkd_view/resources → web}/js/vendor/bootstrap.min.js +0 -0
  31. data/{lib/beanstalkd_view/resources → web}/js/vendor/jquery-1.7.1.min.js +0 -0
  32. data/{lib/beanstalkd_view/resources → web}/js/vendor/json2.js +0 -0
  33. data/web/js/vendor/underscore-min.js +1 -0
  34. metadata +25 -34
  35. data/lib/beanstalkd_view/resources/js/app.js +0 -4
  36. data/lib/beanstalkd_view/resources/js/peek_jobs.js +0 -169
  37. data/lib/beanstalkd_view/resources/js/peek_range.js +0 -21
@@ -24,15 +24,17 @@
24
24
  </tr>
25
25
  </thead>
26
26
  <tbody>
27
+ <% tube_names = [] %>
27
28
  <% @tubes.each do |tube| %>
28
- <tr>
29
- <td><a href="<%= u("/tube/#{CGI::escape(tube.name)}") %>"><%= tube.name %></a></td>
30
- </tr>
29
+ <% tube_names << tube.name.strip %>
30
+ <tr>
31
+ <td><a href="<%= u("/tube/#{CGI::escape(tube.name)}") %>"><%= tube.name %></a></td>
32
+ </tr>
31
33
  <% end %>
32
34
  </tbody>
33
35
  </table>
34
36
 
35
- <table class="table">
37
+ <table class="table">
36
38
  <thead>
37
39
  <tr>
38
40
  <th colspan="2">Current Jobs</th>
@@ -41,11 +43,11 @@
41
43
  <tbody>
42
44
  <tr rel="tooltip" title="The number of ready jobs with priority < 1024.">
43
45
  <td>Urgent</td>
44
- <% if @stats[:current_jobs_urgent] > 0 %>
45
- <td class="data_cell"><span class="badge badge-warning"><%= @stats[:current_jobs_urgent] %></span></td>
46
- <% else %>
47
- <td class="data_cell"><%= @stats[:current_jobs_urgent] %></td>
48
- <% end %>
46
+ <% if @stats[:current_jobs_urgent] > 0 %>
47
+ <td class="data_cell"><span class="badge badge-warning"><%= @stats[:current_jobs_urgent] %></span></td>
48
+ <% else %>
49
+ <td class="data_cell"><%= @stats[:current_jobs_urgent] %></td>
50
+ <% end %>
49
51
  </tr>
50
52
  <tr rel="tooltip" title="The number of jobs in the ready queue.">
51
53
  <td>Ready</td>
@@ -61,9 +63,9 @@
61
63
  </tr>
62
64
  <tr rel="tooltip" title="he number of buried jobs.">
63
65
  <td>Buried</td>
64
- <% if @stats[:current_jobs_buried] > 0 %>
65
- <td class="data_cell"><span class="badge badge-error"><%= @stats[:current_jobs_buried] %></span></td>
66
- <% else %>
66
+ <% if @stats[:current_jobs_buried] > 0 %>
67
+ <td class="data_cell"><span class="badge badge-error"><%= @stats[:current_jobs_buried] %></span></td>
68
+ <% else %>
67
69
  <td class="data_cell"><%= @stats[:current_jobs_buried] %></td>
68
70
  <% end %>
69
71
  </tr>
@@ -79,26 +81,26 @@
79
81
  <tbody>
80
82
  <tr rel="tooltip" title="The rate of job bury calls to reserve calls.">
81
83
  <td>Bury Rate</td>
82
- <% bury_reserve_rate = (@stats[:cmd_bury].to_f / @stats[:cmd_reserve].to_f) %>
83
- <% bury_reserve_rate = 0 if bury_reserve_rate.nan? %>
84
- <% if bury_reserve_rate > 0.01 %>
84
+ <% bury_reserve_rate = (@stats[:cmd_bury].to_f / @stats[:cmd_reserve].to_f) %>
85
+ <% bury_reserve_rate = 0 if bury_reserve_rate.nan? %>
86
+ <% if bury_reserve_rate > 0.01 %>
85
87
  <td class="data_cell"><span class="badge badge-error"><%= bury_reserve_rate %></span></td>
86
88
  <% else %>
87
89
  <td class="data_cell"><%= bury_reserve_rate %></td>
88
90
  <% end %>
89
91
  </tr>
90
- <tr rel="tooltip" title="The rate of job timeouts to reserve calls.">
92
+ <tr rel="tooltip" title="The rate of job timeouts to reserve calls.">
91
93
  <td>Timeout Rate</td>
92
94
  <% timeout_reserve_rate = (@stats[:job_timeouts].to_f / @stats[:cmd_reserve].to_f) %>
93
95
  <% timeout_reserve_rate = 0 if timeout_reserve_rate.nan? %>
94
- <% if timeout_reserve_rate > 0.01 %>
96
+ <% if timeout_reserve_rate > 0.01 %>
95
97
  <td class="data_cell"><span class="badge badge-error"><%= timeout_reserve_rate %></span></td>
96
98
  <% else %>
97
99
  <td class="data_cell"><%= timeout_reserve_rate %></td>
98
100
  <% end %>
99
101
  </tr>
100
- </tbody>
101
- </table>
102
+ </tbody>
103
+ </table>
102
104
 
103
105
  <table class="table">
104
106
  <thead>
@@ -162,7 +164,7 @@
162
164
  </tbody>
163
165
  </table>
164
166
 
165
- <table class="table">
167
+ <table class="table">
166
168
  <thead>
167
169
  <tr>
168
170
  <th colspan="2">Binlog</th>
@@ -278,10 +280,10 @@
278
280
  </div>
279
281
 
280
282
  <div class="span6">
281
- <div class="span6">
282
- <h3>Add Job</h3>
283
+ <div class="span6">
284
+ <h3>Add Job</h3>
283
285
  <form id="add_job_form" class="well" name="add_job_form" action="<%= u("/add_job") %>" method="POST">
284
- <input id="form_tube_name" type="text" class="span3" placeholder="Tube name" name="tube" data-provide="typeahead" autocomplete="off">
286
+ <input id="form_tube_name" type="text" class="span3" placeholder="Tube name" name="tube" data-provide="typeahead" autocomplete="off" data-tubes='<%= "#{tube_names.to_json.to_s}" %>'>
285
287
  <input id="form_job_priority" type="text" class="span3" placeholder="Priority, e.g. 65536" name="priority">
286
288
  <input id="form_job_delay" type="text" class="span3" placeholder="Delay, e.g. 0" name="delay">
287
289
  <input id="form_job_ttr" type="text" class="span3" placeholder="TTR, e.g. 120" name="ttr">
@@ -290,7 +292,7 @@
290
292
  <br/>
291
293
  <a id="add_job_btn" href="#" class="btn">Add Job</a>
292
294
  </form>
293
- </div>
295
+ </div>
294
296
 
295
297
  <div class="span6">
296
298
  <h3>Peek Range</h3>
@@ -304,65 +306,15 @@
304
306
  <div class="span6">
305
307
  <div id="total_jobs_container">
306
308
  <h3>Total Jobs</h3>
307
- <canvas id="total_jobs_chart"></canvas>
309
+ <canvas id="total_jobs_chart" data-set='<%= "#{@total_jobs_data.to_json.to_s}" %>'></canvas>
308
310
  </div>
309
311
  <div id="buried_jobs_container" style="visibility:hidden">
310
312
  <br/>
311
313
  <h3>Current Jobs Buried</h3>
312
- <canvas id="buried_jobs_chart"></canvas>
314
+ <canvas id="buried_jobs_chart" data-set='<%= "#{@buried_jobs_data.to_json.to_s}" %>'></canvas>
313
315
  </div>
314
316
  </div>
315
- </div>
317
+ </div>
316
318
  </div>
317
319
 
318
- <script type="text/javascript">
319
- $(document).ready(function(){
320
-
321
- function draw_pie_chart(div, data) {
322
- //Create pie charts
323
- var chart = new Bluff.Bar(div, 460);
324
- //Setup theme
325
- var colors = ['#6886B4', '#FDD84E', '#72AE6E', '#D1695E', '#8A6EAF', '#EFAA43', 'white'];
326
- chart.set_theme({
327
- colors: colors,
328
- marker_color: 'white',
329
- font_color: 'white',
330
- background_colors: ['#008000', '#008000']
331
- });
332
- chart.tooltips = true;
333
- chart.hide_line_markers = false;
334
- chart.minimum_value = 0;
335
- var max_value = 0;
336
- //Add each data item to chart
337
- for (i in data.items) {
338
- var item = data.items[i];
339
- chart.data(item.label, item.data);
340
- if (item.data > max_value) {
341
- max_value = item.data;
342
- }
343
- }
344
- chart.maximum_value = max_value;
345
- //Finally draw the chart
346
- chart.draw();
347
- }
348
-
349
- <% if @total_jobs_data %>
350
- var total_jobs_data = <%= @total_jobs_data.to_json %>
351
- draw_pie_chart('total_jobs_chart', total_jobs_data);
352
- <% end %>
353
- <% if @buried_jobs_data %>
354
- var buried_jobs_data = <%= @buried_jobs_data.to_json %>
355
- draw_pie_chart('buried_jobs_chart', buried_jobs_data);
356
- $("#buried_jobs_container").css('visibility', 'visible');
357
- <% end %>
358
-
359
- //Setup Typeahead For Tube Names on Add Job Form
360
- var tubeNames = [];
361
- <% @tubes.each do |tube| %>
362
- tubeNames.push('<%=tube.name%>');
363
- <% end %>
364
- $('#form_tube_name').typeahead({source: tubeNames});
365
- });
366
- </script>
367
-
368
- <%= erb :job_info_popup %>
320
+ <%= erb :job_info_popup %>
@@ -2,9 +2,70 @@
2
2
  <div class="modal-header">
3
3
  <a class="close" data-dismiss="modal">×</a>
4
4
  <h3 id="job_info_popup_title"></h3>
5
- </div>
6
- <div class="modal-body" id="job_info_popup_body">
7
- </div>
8
- <div class="modal-footer" id="job_info_popup_footer">
9
- </div>
10
- </div>
5
+ </div>
6
+ <div class="modal-body" id="job_info_popup_body"></div>
7
+ <div class="modal-footer" id="job_info_popup_footer"></div>
8
+ </div>
9
+
10
+ <script id="job_modal_template" type="text/template">
11
+ <table class="table">
12
+ <tbody>
13
+ <tr rel="tooltip" data-original-title="The tube to which the job will be added.">
14
+ <td>tube</td>
15
+ <td>{{= data.tube }}</td>
16
+ </tr>
17
+ <tr rel="tooltip" data-original-title="The priority value set by the put, release, or bury commands.">
18
+ <td>pri</td>
19
+ <td>{{= data.pri }}</td>
20
+ </tr>
21
+ {{ if (data.age !== undefined) { }}
22
+ <tr rel="tooltip" data-original-title="The time in seconds since the put command that created this job.">
23
+ <td>age</td>
24
+ <td>{{= data.age }}</td>
25
+ </tr>
26
+ {{ } }}
27
+ <tr rel="tooltip" data-original-title="The delay value in seconds">
28
+ <td>delay</td>
29
+ <td>{{= data.delay }}</td>
30
+ </tr>
31
+ <tr rel="tooltip" data-original-title="The number of seconds to allow a worker to run this job. This time is counted from the moment a worker reserves this job. If the worker does not delete, release, or bury the job within ttr seconds, the job will time out and the server will release the job.">
32
+ <td>ttr</td>
33
+ <td>{{= data.ttr }}</td>
34
+ </tr>
35
+ {{ if (data.reserves !== undefined) { }}
36
+ <tr rel="tooltip" data-original-title="The number of times this job has been reserved">
37
+ <td>reserves</td>
38
+ <td>{{= data.reserves }}</td>
39
+ </tr>
40
+ {{ } }}
41
+ {{ if (data.timeouts !== undefined) { }}
42
+ <tr rel="tooltip" data-original-title="The number of times this job has timed out during a reservation.">
43
+ <td>timeouts</td>
44
+ <td>{{= data.timeouts }}</td>
45
+ </tr>
46
+ {{ } }}
47
+ {{ if (data.releases !== undefined) { }}
48
+ <tr rel="tooltip" data-original-title="The number of times a client has released this job from a reservation.">
49
+ <td>releases</td>
50
+ <td>{{= data.releases }}</td>
51
+ </tr>
52
+ {{ } }}
53
+ {{ if (data.buries !== undefined) { }}
54
+ <tr rel="tooltip" data-original-title=" The number of times this job has been buried.">
55
+ <td>buries</td>
56
+ <td>{{= data.buries }}</td>
57
+ </tr>
58
+ {{ } }}
59
+ {{ if (data.kicks !== undefined) { }}
60
+ <tr rel="tooltip" data-original-title="The number of times this job has been kicked.">
61
+ <td>kicks</td>
62
+ <td>{{= data.kicks }}</td>
63
+ </tr>
64
+ {{ } }}
65
+ <tr rel="tooltip" data-original-title="The jobs body content.">
66
+ <td>body</td>
67
+ <td>{{= data.body }}</td>
68
+ </tr>
69
+ </tbody>
70
+ </table>
71
+ </script>
@@ -4,13 +4,8 @@
4
4
  <head>
5
5
  <title>Beanstalkd View - <%= BeanstalkdView::VERSION %></title>
6
6
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
7
- <% css_imports = css :application, :media => 'screen' %>
8
- <% js_imports = js :application %>
9
- <%# Must modify sinatra-assetpack output to use the Mount prefix when embedding through Rails %>
10
- <% if path_prefix %>
11
- <%= css_imports.gsub(/href='/, "href='#{path_prefix}") %>
12
- <%= js_imports.gsub(/src='/, "src='#{path_prefix}") %>
13
- <% end %>
7
+ <link rel="stylesheet" type="text/css" href="<%= "#{path_prefix}/css/beanstalkd_view.css" %>">
8
+ <script type="text/javascript" src="<%= "#{path_prefix}/js/beanstalkd_view.min.js" %>"></script>
14
9
  </head>
15
10
  <body>
16
11
  <!-- Header -->
@@ -50,4 +50,4 @@
50
50
  <% end %>
51
51
  </table>
52
52
  </div>
53
- </div>
53
+ </div>
@@ -11,7 +11,7 @@
11
11
  <tbody>
12
12
  <tr rel="tooltip" title="The number of ready jobs with priority < 1024 in this tube.">
13
13
  <td>Urgent</td>
14
- <% if @stats[:current_jobs_urgent] > 0 %>
14
+ <% if @stats[:current_jobs_urgent] > 0 %>
15
15
  <td class="data_cell"><span class="badge badge-warning"><%= @stats[:current_jobs_urgent] %></span></td>
16
16
  <% else %>
17
17
  <td class="data_cell"><%= @stats[:current_jobs_urgent] %></td>
@@ -31,7 +31,7 @@
31
31
  </tr>
32
32
  <tr rel="tooltip" title="The number of buried jobs in this tube.">
33
33
  <td>Buried</td>
34
- <% if @stats[:current_jobs_buried] > 0 %>
34
+ <% if @stats[:current_jobs_buried] > 0 %>
35
35
  <td class="data_cell"><span class="badge badge-error"><%= @stats[:current_jobs_buried] %></span></td>
36
36
  <% else %>
37
37
  <td class="data_cell"><%= @stats[:current_jobs_buried] %></td>
@@ -70,7 +70,7 @@
70
70
  </tbody>
71
71
  </table>
72
72
 
73
- <table class="table">
73
+ <table class="table">
74
74
  <thead>
75
75
  <tr>
76
76
  <th colspan="2">API Call Histogram</th>
@@ -87,49 +87,48 @@
87
87
 
88
88
  <div class="span6">
89
89
  <h3>Pause Tube</h3>
90
- <form id="pause_form" class="well form-inline" name="pause_form" action="<%= u("/pause") %>" method="POST">
91
- <input id="form_tube_name" type="hidden" name="tube" value="<%= @tube.name %>">
90
+ <form id="pause_form" class="well form-inline" name="pause_form" action="<%= u("/pause") %>" method="POST">
91
+ <input id="form_tube_name" type="hidden" name="tube" value="<%= @tube.name %>">
92
92
  <input id="form_url_base" type="hidden" name="url_base" value="<%= u("/") %>">
93
- <input type="text" class="span3" placeholder="Number of seconds to wait" name="delay">
94
- <button type="submit" class="btn">Pause</button>
95
- </form>
93
+ <input type="text" class="span3" placeholder="Number of seconds to wait" name="delay">
94
+ <button type="submit" class="btn">Pause</button>
95
+ </form>
96
96
 
97
97
  <h3>Clear Tube</h3>
98
- <form id="clear_form" class="well form-inline" name="clear_form" action="<%= u("/clear") %>" method="POST">
99
- <input type="hidden" name="tube" value="<%= @tube.name %>">
98
+ <form id="clear_form" class="well form-inline" name="clear_form" action="<%= u("/clear") %>" method="POST">
99
+ <input type="hidden" name="tube" value="<%= @tube.name %>">
100
100
  <input type="hidden" name="url_base" value="<%= u("/") %>">
101
101
  <select name="state" class="span3">
102
- <option value="buried">Buried</option>
103
- <option value="ready">Ready</option>
104
- <option value="delayed">Delayed</option>
105
- </select>
106
- <button type="submit" class="btn">Clear</button>
107
- </form>
102
+ <option value="buried">Buried</option>
103
+ <option value="ready">Ready</option>
104
+ <option value="delayed">Delayed</option>
105
+ </select>
106
+ <button type="submit" class="btn">Clear</button>
107
+ </form>
108
108
 
109
109
  <h3>Kick Tube</h3>
110
- <form id="kick_form" class="well form-inline" name="kick_form" action="<%= u("/kick") %>" method="POST">
111
- <input type="hidden" name="tube" value="<%= @tube.name %>">
112
- <input type="text" class="span3" placeholder="Number of jobs" name="bound">
113
- <button type="submit" class="btn">Kick</button>
114
- </form>
110
+ <form id="kick_form" class="well form-inline" name="kick_form" action="<%= u("/kick") %>" method="POST">
111
+ <input type="hidden" name="tube" value="<%= @tube.name %>">
112
+ <input type="text" class="span3" placeholder="Number of jobs" name="bound">
113
+ <button type="submit" class="btn">Kick</button>
114
+ </form>
115
115
 
116
116
  <h3>Peek Jobs</h3>
117
- <form class="well" name="peek_jobs">
117
+ <form class="well" name="peek_jobs">
118
118
  <a id="peek_ready_btn" href="#" class="btn">Peek Ready</a>
119
- <a id="peek_delayed_btn" href="#" class="btn">Peek Delayed</a>
120
- <a id="peek_buried_btn" href="#" class="btn">Peek Buried</a>
121
- </form>
122
-
123
- <h3>Peek Range</h3>
124
- <form id="peek_range_form" class="well form-inline" name="peek_range_form" action="<%= u("/peek-range") %>" method="GET">
125
- <input type="hidden" name="tube" value="<%= @tube.name %>">
126
- <input type="text" class="span2" placeholder="0" name="min">
127
- <input type="text" class="span2" placeholder="0" name="max">
128
- <button type="submit" class="btn">Peek</button>
129
- </form>
119
+ <a id="peek_delayed_btn" href="#" class="btn">Peek Delayed</a>
120
+ <a id="peek_buried_btn" href="#" class="btn">Peek Buried</a>
121
+ </form>
130
122
 
123
+ <h3>Peek Range</h3>
124
+ <form id="peek_range_form" class="well form-inline" name="peek_range_form" action="<%= u("/peek-range") %>" method="GET">
125
+ <input type="hidden" name="tube" value="<%= @tube.name %>">
126
+ <input type="text" class="span2" placeholder="0" name="min">
127
+ <input type="text" class="span2" placeholder="0" name="max">
128
+ <button type="submit" class="btn">Peek</button>
129
+ </form>
131
130
  </div>
132
131
 
133
- <%= erb :job_info_popup %>
132
+ <%= erb :job_info_popup %>
134
133
 
135
- </div>
134
+ </div>
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'sinatra/base'
3
3
  require 'sinatra/cookies'
4
- require 'sinatra/assetpack'
5
4
  require 'erb'
6
5
  require "beaneater"
7
6
  require "json"
data/package.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "beanstalkd_view",
3
+ "version": "1.2.0",
4
+ "devDependencies": {
5
+ "grunt": "~0.4.1",
6
+ "grunt-contrib-jshint": "~0.3.0",
7
+ "grunt-contrib-concat": "~0.1.3",
8
+ "grunt-contrib-uglify": "~0.2.0"
9
+ }
10
+ }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "RailsIntegration", :type => :request do
3
+ describe "RailsIntegration", :type => :feature do
4
4
 
5
5
  before(:all) do
6
6
  # Configure Capybara for Rails
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "SinatraIntegration", :type => :request do
3
+ describe "SinatraIntegration", :type => :feature do
4
4
 
5
5
  before :all do
6
6
  Capybara.app = BeanstalkdView::Server.new