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.
- data/Gruntfile.js +41 -0
- data/README.md +13 -1
- data/Rakefile +0 -2
- data/lib/beanstalkd_view/beanstalkd_utils.rb +11 -16
- data/lib/beanstalkd_view/resources/css/beanstalkd_view.css +76 -0
- data/lib/beanstalkd_view/resources/js/beanstalkd_view.js +242 -0
- data/lib/beanstalkd_view/resources/js/beanstalkd_view.min.js +6 -0
- data/lib/beanstalkd_view/server.rb +0 -17
- data/lib/beanstalkd_view/version.rb +1 -1
- data/lib/beanstalkd_view/views/index.erb +30 -78
- data/lib/beanstalkd_view/views/job_info_popup.erb +67 -6
- data/lib/beanstalkd_view/views/layout.erb +2 -7
- data/lib/beanstalkd_view/views/peek_range.erb +1 -1
- data/lib/beanstalkd_view/views/tube_stats.erb +34 -35
- data/lib/beanstalkd_view.rb +0 -1
- data/package.json +10 -0
- data/spec/{integration → features}/rails_integration_spec.rb +1 -1
- data/spec/{integration → features}/sinatra_integration_spec.rb +1 -1
- data/spec/rails_app/log/test.log +990 -3
- data/spec/support/integration_test_shared_examples.rb +3 -3
- data/spec/support/queue_browser_shared_examples.rb +13 -13
- data/{lib/beanstalkd_view/resources → web}/css/app.css +0 -0
- data/{lib/beanstalkd_view/resources → web}/css/vendor/bootstrap.min.css +0 -0
- data/web/js/draw_chart.js +49 -0
- data/web/js/initialization.js +20 -0
- data/web/js/peek_jobs.js +135 -0
- data/web/js/peek_range.js +24 -0
- data/{lib/beanstalkd_view/resources → web}/js/vendor/bluff-0.3.6.2/bluff-min.js +0 -0
- data/{lib/beanstalkd_view/resources → web}/js/vendor/bluff-0.3.6.2/js-class.js +0 -0
- data/{lib/beanstalkd_view/resources → web}/js/vendor/bootstrap.min.js +0 -0
- data/{lib/beanstalkd_view/resources → web}/js/vendor/jquery-1.7.1.min.js +0 -0
- data/{lib/beanstalkd_view/resources → web}/js/vendor/json2.js +0 -0
- data/web/js/vendor/underscore-min.js +1 -0
- metadata +25 -34
- data/lib/beanstalkd_view/resources/js/app.js +0 -4
- data/lib/beanstalkd_view/resources/js/peek_jobs.js +0 -169
- 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
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
101
|
-
|
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
|
-
|
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
|
-
|
282
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
314
|
+
<canvas id="buried_jobs_chart" data-set='<%= "#{@buried_jobs_data.to_json.to_s}" %>'></canvas>
|
313
315
|
</div>
|
314
316
|
</div>
|
315
|
-
|
317
|
+
</div>
|
316
318
|
</div>
|
317
319
|
|
318
|
-
|
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
|
-
|
6
|
-
<div class="modal-body" id="job_info_popup_body">
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
8
|
-
|
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 -->
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
91
|
-
|
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
|
-
|
94
|
-
|
95
|
-
|
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
|
-
|
99
|
-
|
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
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
117
|
+
<form class="well" name="peek_jobs">
|
118
118
|
<a id="peek_ready_btn" href="#" class="btn">Peek Ready</a>
|
119
|
-
|
120
|
-
|
121
|
-
|
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>
|
data/lib/beanstalkd_view.rb
CHANGED
data/package.json
ADDED