beanstalkd_view 1.1.3 → 1.2.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/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