2010-07-23 20:43:35 +08:00
|
|
|
UNKNOWN_REPR = '<span class="unknown">?</span>';
|
2011-02-04 22:38:26 +08:00
|
|
|
FD_THRESHOLDS=[[0.95, 'red'],
|
2011-02-18 22:26:12 +08:00
|
|
|
[0.8, 'yellow']];
|
2011-02-04 22:38:26 +08:00
|
|
|
SOCKETS_THRESHOLDS=[[1.0, 'red'],
|
2011-02-18 22:26:12 +08:00
|
|
|
[0.8, 'yellow']];
|
2011-02-04 22:38:26 +08:00
|
|
|
PROCESS_THRESHOLDS=[[0.75, 'red'],
|
2011-02-18 22:26:12 +08:00
|
|
|
[0.5, 'yellow']];
|
2010-10-30 00:58:21 +08:00
|
|
|
MEMORY_THRESHOLDS=[[1.0, 'red']];
|
2010-07-22 23:29:19 +08:00
|
|
|
|
|
|
|
|
function fmt_string(str) {
|
2010-07-23 20:43:35 +08:00
|
|
|
if (str == undefined) return UNKNOWN_REPR;
|
2010-07-22 23:29:19 +08:00
|
|
|
return str;
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-28 01:04:48 +08:00
|
|
|
function fmt_num(num) {
|
|
|
|
|
if (num == undefined) return UNKNOWN_REPR;
|
|
|
|
|
return num.toFixed(0);
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-22 23:29:19 +08:00
|
|
|
function fmt_bytes(bytes) {
|
2010-07-23 20:43:35 +08:00
|
|
|
if (bytes == undefined) return UNKNOWN_REPR;
|
2010-07-22 23:29:19 +08:00
|
|
|
|
|
|
|
|
function f(n, p) {
|
|
|
|
|
if (n > 1024) return f(n / 1024, p + 1);
|
|
|
|
|
else return [n, p];
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-01 00:56:33 +08:00
|
|
|
var num_power = f(bytes, 0);
|
|
|
|
|
var num = num_power[0];
|
|
|
|
|
var power = num_power[1];
|
2010-07-22 23:29:19 +08:00
|
|
|
var powers = ['B', 'kB', 'MB', 'GB', 'TB'];
|
|
|
|
|
return (power == 0 ? num.toFixed(0) : num.toFixed(1)) + powers[power];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_boolean(b) {
|
2010-07-23 20:43:35 +08:00
|
|
|
if (b == undefined) return UNKNOWN_REPR;
|
2010-07-22 23:29:19 +08:00
|
|
|
|
|
|
|
|
return b ? "●" : "○";
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-14 19:45:45 +08:00
|
|
|
function fmt_date(d) {
|
|
|
|
|
function f(i) {
|
|
|
|
|
return i < 10 ? "0" + i : i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return d.getFullYear() + "-" + f(d.getMonth() + 1) + "-" + f(d.getDay()) +
|
|
|
|
|
" " + f(d.getHours()) + ":" + f(d.getMinutes()) + ":" +
|
|
|
|
|
f(d.getSeconds());
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-29 20:01:22 +08:00
|
|
|
function fmt_parameters(obj) {
|
|
|
|
|
var res = '';
|
|
|
|
|
if (obj.durable) {
|
|
|
|
|
res += '<acronym title="Durable">D</acronym> ';
|
|
|
|
|
}
|
|
|
|
|
if (obj.auto_delete) {
|
|
|
|
|
res += '<acronym title="Auto-delete">AD</acronym> ';
|
|
|
|
|
}
|
2010-11-15 20:32:42 +08:00
|
|
|
if (obj.internal != undefined && obj.internal) {
|
|
|
|
|
res += '<acronym title="Internal">I</acronym> ';
|
|
|
|
|
}
|
2010-10-29 20:01:22 +08:00
|
|
|
var args = fmt_table_short(obj.arguments);
|
|
|
|
|
if (args != '') {
|
2011-02-15 19:51:32 +08:00
|
|
|
res += args;
|
2010-10-29 20:01:22 +08:00
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-21 21:17:41 +08:00
|
|
|
function fmt_channel_mode(ch) {
|
|
|
|
|
if (ch.transactional) {
|
|
|
|
|
return '<acronym title="Transactional">T</acronym>';
|
|
|
|
|
}
|
|
|
|
|
else if (ch.confirm) {
|
|
|
|
|
return '<acronym title="Confirm">C</acronym>';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-29 23:32:17 +08:00
|
|
|
function fmt_color(r, thresholds) {
|
2010-07-23 20:43:35 +08:00
|
|
|
if (r == undefined) return '';
|
2010-07-22 23:29:19 +08:00
|
|
|
|
2010-10-29 23:32:17 +08:00
|
|
|
for (var i in thresholds) {
|
2011-02-18 22:26:12 +08:00
|
|
|
var threshold = thresholds[i][0];
|
|
|
|
|
var color = thresholds[i][1];
|
2010-10-29 23:32:17 +08:00
|
|
|
|
2011-02-18 22:26:12 +08:00
|
|
|
if (r >= threshold) {
|
|
|
|
|
return color;
|
|
|
|
|
}
|
2010-10-29 23:32:17 +08:00
|
|
|
}
|
2010-10-30 00:58:21 +08:00
|
|
|
return 'green';
|
2010-07-22 23:29:19 +08:00
|
|
|
}
|
|
|
|
|
|
2011-02-28 19:19:36 +08:00
|
|
|
function fmt_rate(obj, name, show_total, cssClass) {
|
|
|
|
|
var res = fmt_rate0(obj, name, fmt_num, show_total);
|
|
|
|
|
if (cssClass == undefined || res == '') {
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
return '<span class="' + cssClass + '">' + res + '</span>';
|
|
|
|
|
}
|
2010-09-02 19:58:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_rate_bytes(obj, name) {
|
2010-10-29 20:01:22 +08:00
|
|
|
return fmt_rate0(obj, name, fmt_bytes, true);
|
2010-09-02 19:58:34 +08:00
|
|
|
}
|
2010-07-28 01:04:48 +08:00
|
|
|
|
2010-10-29 20:01:22 +08:00
|
|
|
function fmt_rate0(obj, name, fmt, show_total) {
|
2010-09-02 19:58:34 +08:00
|
|
|
if (obj == undefined || obj[name] == undefined) return '';
|
2010-10-29 20:01:22 +08:00
|
|
|
var res = '';
|
2010-09-02 19:58:34 +08:00
|
|
|
if (obj[name + '_details'] != undefined) {
|
2010-10-29 20:01:22 +08:00
|
|
|
res = fmt(obj[name + '_details'].rate) + '/s';
|
|
|
|
|
}
|
|
|
|
|
if (show_total) {
|
|
|
|
|
res += '<sub>(' + fmt(obj[name]) + ' total)</sub>';
|
2010-09-02 19:58:34 +08:00
|
|
|
}
|
|
|
|
|
return res;
|
2010-07-28 01:04:48 +08:00
|
|
|
}
|
|
|
|
|
|
2011-02-26 01:32:04 +08:00
|
|
|
function is_stat_empty(obj, name) {
|
2011-02-17 23:23:08 +08:00
|
|
|
if (obj == undefined
|
2011-02-18 18:38:41 +08:00
|
|
|
|| obj[name] == undefined
|
|
|
|
|
|| obj[name + '_details'] == undefined
|
|
|
|
|
|| obj[name + '_details'].rate < 0.00001) return true;
|
2011-02-17 23:23:08 +08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-26 01:32:04 +08:00
|
|
|
function is_col_empty(channels, name) {
|
|
|
|
|
for (var i = 0; i < channels.length; i++) {
|
|
|
|
|
var channel = channels[i];
|
|
|
|
|
if (!is_stat_empty(channel.message_stats, name)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-27 00:42:03 +08:00
|
|
|
function fmt_exchange(name) {
|
|
|
|
|
return name == '' ? '<i>(AMQP default)</i>' : name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_exchange_url(name) {
|
|
|
|
|
return name == '' ? 'amq.default' : name;
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-29 20:22:46 +08:00
|
|
|
function fmt_download_filename(host) {
|
|
|
|
|
var now = new Date();
|
2010-10-01 01:02:05 +08:00
|
|
|
return host.replace('@', '_') + "_" + now.getFullYear() + "-" +
|
|
|
|
|
(now.getMonth() + 1) + "-" + now.getDate() + ".json";
|
2010-09-29 20:22:46 +08:00
|
|
|
}
|
|
|
|
|
|
2010-10-12 21:08:17 +08:00
|
|
|
function fmt_table_short(table) {
|
2011-02-12 02:04:05 +08:00
|
|
|
return '<table class="mini">' + fmt_table_body(table, ':') + '</table>';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_table_long(table) {
|
|
|
|
|
return '<table class="facts">' + fmt_table_body(table, '') +
|
|
|
|
|
'</table><span class="br"></span>';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_table_body(table, x) {
|
2010-10-12 21:08:17 +08:00
|
|
|
var res = '';
|
|
|
|
|
for (k in table) {
|
2011-02-12 02:04:05 +08:00
|
|
|
res += '<tr><th>' + k + x + '</th><td>' + fmt_amqp_value(table[k]) +
|
|
|
|
|
'</td>';
|
2010-10-12 21:08:17 +08:00
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-12 02:04:05 +08:00
|
|
|
function fmt_amqp_value(val) {
|
2011-02-17 00:00:12 +08:00
|
|
|
if (val instanceof Array) {
|
2011-03-03 00:49:00 +08:00
|
|
|
var val2 = new Array();
|
|
|
|
|
for (var i = 0; i < val.length; i++) {
|
|
|
|
|
val2[i] = fmt_amqp_value(val[i]);
|
|
|
|
|
}
|
|
|
|
|
return val2.join("<br/>");
|
2011-02-17 00:00:12 +08:00
|
|
|
} else if (val instanceof Object) {
|
2011-02-17 19:47:23 +08:00
|
|
|
return fmt_table_short(val);
|
2011-03-10 00:26:25 +08:00
|
|
|
} else if (typeof(val) == 'string') {
|
|
|
|
|
return fmt_escape_html(val);
|
2011-02-12 02:04:05 +08:00
|
|
|
} else {
|
|
|
|
|
return val;
|
2010-10-28 22:30:32 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-11-09 18:49:47 +08:00
|
|
|
function fmt_uptime(u) {
|
|
|
|
|
var uptime = Math.floor(u / 1000);
|
|
|
|
|
var sec = uptime % 60;
|
|
|
|
|
var min = Math.floor(uptime / 60) % 60;
|
|
|
|
|
var hour = Math.floor(uptime / 3600) % 24;
|
|
|
|
|
var day = Math.floor(uptime / 86400);
|
|
|
|
|
|
|
|
|
|
if (day > 0)
|
|
|
|
|
return day + 'd ' + hour + 'h';
|
|
|
|
|
else if (hour > 0)
|
|
|
|
|
return hour + 'h ' + min + 'm';
|
|
|
|
|
else
|
|
|
|
|
return min + 'm ' + sec + 's';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_rabbit_version(applications) {
|
|
|
|
|
for (var i in applications) {
|
|
|
|
|
if (applications[i].name == 'rabbit') {
|
|
|
|
|
return applications[i].version;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 'unknown';
|
|
|
|
|
}
|
|
|
|
|
|
2010-11-16 23:41:17 +08:00
|
|
|
function fmt_idle(obj) {
|
|
|
|
|
if (obj.idle_since == undefined) {
|
|
|
|
|
return 'Active';
|
|
|
|
|
} else {
|
|
|
|
|
return '<acronym title="Idle since ' + obj.idle_since +
|
|
|
|
|
'">Idle</acronym>';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function fmt_idle_long(obj) {
|
|
|
|
|
if (obj.idle_since == undefined) {
|
|
|
|
|
return 'Active';
|
|
|
|
|
} else {
|
|
|
|
|
return 'Idle since<br/>' + obj.idle_since;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-02-22 02:20:33 +08:00
|
|
|
function fmt_escape_html(txt) {
|
|
|
|
|
return txt.replace(/</g, '<').replace(/>/g, '>');
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-22 23:29:19 +08:00
|
|
|
function alt_rows(i) {
|
2010-11-09 18:55:04 +08:00
|
|
|
return (i % 2 == 0) ? ' class="alt1"' : ' class="alt2"';
|
2010-07-22 23:29:19 +08:00
|
|
|
}
|
|
|
|
|
|
2010-08-24 18:37:54 +08:00
|
|
|
function esc(str) {
|
2010-09-14 22:46:19 +08:00
|
|
|
return encodeURIComponent(str);
|
2010-08-25 19:24:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function link_conn(name) {
|
|
|
|
|
return link_to(name, '#/connections/' + esc(name))
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-03 00:06:59 +08:00
|
|
|
function link_channel(name) {
|
|
|
|
|
return link_to(name, '#/channels/' + esc(name))
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-27 00:42:03 +08:00
|
|
|
function link_exchange(vhost, name) {
|
|
|
|
|
var url = esc(vhost) + '/' + (name == '' ? 'amq.default' : esc(name));
|
|
|
|
|
return link_to(fmt_exchange(name), '#/exchanges/' + url)
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-27 17:55:32 +08:00
|
|
|
function link_queue(vhost, name) {
|
|
|
|
|
return link_to(name, '#/queues/' + esc(vhost) + '/' + esc(name))
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-26 01:18:31 +08:00
|
|
|
function link_vhost(name) {
|
|
|
|
|
return link_to(name, '#/vhosts/' + esc(name))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function link_user(name) {
|
2010-08-27 01:23:44 +08:00
|
|
|
return link_to(name, '#/users/' + esc(name))
|
2010-08-26 01:18:31 +08:00
|
|
|
}
|
|
|
|
|
|
2010-11-03 01:19:14 +08:00
|
|
|
function link_node(name) {
|
|
|
|
|
return link_to(name, '#/nodes/' + esc(name))
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-25 19:24:34 +08:00
|
|
|
function link_to(name, url) {
|
|
|
|
|
return '<a href="' + url + '">' + name + '</a>';
|
2010-09-03 00:06:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function message_rates(stats) {
|
|
|
|
|
var res = "";
|
|
|
|
|
if (keys(stats).length > 0) {
|
2010-12-14 01:38:26 +08:00
|
|
|
var items = [['Publish', 'publish'], ['Confirm', 'confirm'],
|
|
|
|
|
['Deliver', 'deliver'], ['Acknowledge', 'ack'],
|
|
|
|
|
['Get', 'get'], ['Deliver (noack)', 'deliver_no_ack'],
|
2010-12-08 17:59:43 +08:00
|
|
|
['Get (noack)', 'get_no_ack'],
|
2011-02-04 21:40:15 +08:00
|
|
|
['Return (mandatory)', 'return_unroutable'],
|
2011-02-04 21:46:02 +08:00
|
|
|
['Return (immediate)', 'return_not_delivered']];
|
2010-09-03 00:06:59 +08:00
|
|
|
for (var i in items) {
|
|
|
|
|
var name = items[i][0];
|
|
|
|
|
var key = items[i][1] + '_details';
|
|
|
|
|
if (key in stats) {
|
|
|
|
|
res += '<div class="highlight">' + name;
|
|
|
|
|
res += '<strong>' + Math.round(stats[key].rate) + '</strong>';
|
|
|
|
|
res += 'msg/s</div>';
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-10-20 18:38:05 +08:00
|
|
|
|
|
|
|
|
if (res == "") {
|
|
|
|
|
res = '<p>Waiting for message rates...</p>';
|
|
|
|
|
}
|
2010-09-03 00:06:59 +08:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
res = '<p>Currently idle</p>';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res;
|
2010-09-29 21:45:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function maybe_truncate(items) {
|
|
|
|
|
var maximum = 500;
|
|
|
|
|
var str = '';
|
|
|
|
|
|
|
|
|
|
if (items.length > maximum) {
|
|
|
|
|
str = '<p class="warning">Only ' + maximum + ' of ' +
|
|
|
|
|
items.length + ' items are shown.</p>';
|
|
|
|
|
items.length = maximum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return str;
|
|
|
|
|
}
|
2010-10-12 00:05:06 +08:00
|
|
|
|
|
|
|
|
function fmt_sort(display, sort) {
|
|
|
|
|
var prefix = '';
|
|
|
|
|
if (current_sort == sort) {
|
|
|
|
|
prefix = '<span class="arrow">' +
|
|
|
|
|
(current_sort_reverse ? '▲ ' : '▼ ') +
|
|
|
|
|
'</span>';
|
|
|
|
|
}
|
|
|
|
|
return '<a class="sort" sort="' + sort + '">' + prefix + display + '</a>';
|
2011-02-17 00:00:12 +08:00
|
|
|
}
|