From 4144e2b6f039d034f1b0a398631c3fbdf16e6114 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Sun, 23 Aug 2015 12:23:58 -0700 Subject: [PATCH] Panel-ize status, move js to public --- themes/bootstrap/public/metrics.js | 127 ++++++ themes/bootstrap/templates/mailbox/_show.html | 2 +- themes/bootstrap/templates/root/status.html | 405 +++++++----------- 3 files changed, 274 insertions(+), 260 deletions(-) create mode 100644 themes/bootstrap/public/metrics.js diff --git a/themes/bootstrap/public/metrics.js b/themes/bootstrap/public/metrics.js new file mode 100644 index 0000000..ff01448 --- /dev/null +++ b/themes/bootstrap/public/metrics.js @@ -0,0 +1,127 @@ +// Inbucket Status Metrics +jQuery.ajaxSetup({ cache: false }); +flashOn = jQuery.Color("rgba(255,255,0,1)"); +flashOff = jQuery.Color("rgba(255,255,0,0)"); +dataHist = new Object(); + +function timeFilter(seconds) { + if (seconds < 60) { + return seconds + " seconds"; + } else if (seconds < 3600) { + return (seconds/60).toFixed(0) + " minute(s)"; + } else if (seconds < 86400) { + return (seconds/3600).toFixed(1) + " hour(s)"; + } + return (seconds/86400).toFixed(0) + " day(s)"; +} + +function sizeFilter(bytes) { + if (bytes < 1024) { + return bytes + " bytes"; + } else if (bytes < 1048576) { + return (bytes/1024).toFixed(0) + " KB"; + } else if (bytes < 1073741824) { + return (bytes/1048576).toFixed(2) + " MB"; + } + return (bytes/1073741824).toFixed(2) + " GB"; +} + +function numberFilter(x) { + var parts = x.toString().split("."); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return parts.join("."); +} + +function appendHistory(name, value) { + var h = dataHist[name]; + if (! h) { + h = new Array(0); + } + // Prevent array from growing + if (h.length >= 60) { + h = h.slice(1,60); + } + h.push(parseInt(value)); + dataHist[name] = h; + el = $('#s-' + name); + if (el) { + el.sparkline(dataHist[name]); + } +} + +// Show spikes for numbers that only increase +function setHistoryOfActivity(name, value) { + var h = value.split(","); + var prev = parseInt(h[0]); + for (i=0; i 0) { + h = h.slice(1); + } + el = $('#s-' + name); + if (el) { + el.sparkline(h); + } +} + +// Show up/down for numbers that can decrease +function setHistoryOfCount(name, value) { + var h = value.split(","); + el = $('#s-' + name); + if (el) { + el.sparkline(h); + } +} + +function metric(name, value, filter, chartable) { + if (chartable) { + appendHistory(name, value); + } + if (filter) { + value = filter(value); + } + var el = $('#m-' + name) + if (el.text() != value) { + el.text(value); + el.css('background-color', flashOn); + el.animate({ backgroundColor: flashOff }, 1500); + } +} + +function displayMetrics(data, textStatus, jqXHR) { + // Non graphing + metric('uptime', data.uptime, timeFilter, false); + metric('retentionScanCompleted', data.retention.SecondsSinceScanCompleted, timeFilter, false); + metric('retentionPeriod', data.retention.Period, timeFilter, false); + + // JavaScript history + metric('memstatsSys', data.memstats.Sys, sizeFilter, true); + metric('memstatsHeapAlloc', data.memstats.HeapAlloc, sizeFilter, true); + metric('memstatsHeapSys', data.memstats.HeapSys, sizeFilter, true); + metric('memstatsHeapObjects', data.memstats.HeapObjects, numberFilter, true); + metric('smtpConnectsCurrent', data.smtp.ConnectsCurrent, numberFilter, true); + + // Server-side history + metric('smtpReceivedTotal', data.smtp.ReceivedTotal, numberFilter, false); + setHistoryOfActivity('smtpReceivedTotal', data.smtp.ReceivedHist); + metric('smtpConnectsTotal', data.smtp.ConnectsTotal, numberFilter, false); + setHistoryOfActivity('smtpConnectsTotal', data.smtp.ConnectsHist); + metric('smtpWarnsTotal', data.smtp.WarnsTotal, numberFilter, false); + setHistoryOfActivity('smtpWarnsTotal', data.smtp.WarnsHist); + metric('smtpErrorsTotal', data.smtp.ErrorsTotal, numberFilter, false); + setHistoryOfActivity('smtpErrorsTotal', data.smtp.ErrorsHist); + metric('retentionDeletesTotal', data.retention.DeletesTotal, numberFilter, false); + setHistoryOfActivity('retentionDeletesTotal', data.retention.DeletesHist); + metric('retainedCurrent', data.retention.RetainedCurrent, numberFilter, false); + setHistoryOfCount('retainedCurrent', data.retention.RetainedHist); +} + +function loadMetrics() { + // jQuery.getJSON( url [, data] [, success(data, textStatus, jqXHR)] ) + jQuery.getJSON('/debug/vars', null, displayMetrics); +} + diff --git a/themes/bootstrap/templates/mailbox/_show.html b/themes/bootstrap/templates/mailbox/_show.html index bcee080..0b59725 100644 --- a/themes/bootstrap/templates/mailbox/_show.html +++ b/themes/bootstrap/templates/mailbox/_show.html @@ -62,7 +62,7 @@ Download diff --git a/themes/bootstrap/templates/root/status.html b/themes/bootstrap/templates/root/status.html index adc0b2a..639c3a3 100644 --- a/themes/bootstrap/templates/root/status.html +++ b/themes/bootstrap/templates/root/status.html @@ -3,140 +3,14 @@ {{define "script"}} + {{end}} @@ -153,135 +27,148 @@

Metrics are polled every 10 seconds. Inbucket does not keep history for the 10 minute graphs, but your web browser will accumulate the data over time.

-
-

Configuration

- - - - - - - - - - - - - - - - - -
Version:{{.version}}, built on {{.buildDate}}
SMTP Listener:{{.smtpListener}}
POP3 Listener:{{.pop3Listener}}
HTTP Listener:{{.webListener}}
-

 

+
+
+

Configuration

+
+
+ + + + + + + + + + + + + + + + + +
Version:{{.version}}, built on {{.buildDate}}
SMTP Listener:{{.smtpListener}}
POP3 Listener:{{.pop3Listener}}
HTTP Listener:{{.webListener}}
+
-
-

General Metrics

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Uptime:.
System Memory:..(10min)
Heap Size:..(10min)
Heap In-Use:..(10min)
Heap # Objects:..(10min)
-

 

+ +
+
+

General Metrics

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Uptime:.
System Memory:..(10min)
Heap Size:..(10min)
Heap In-Use:..(10min)
Heap # Objects:..(10min)
+
-
-

SMTP Metrics

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Current Connections:..(10min)
Total Connections:..(60min)
Messages Received:..(60min)
Errors Logged:.(60min)
Warnings Logged:.(60min)
-

 

+
+
+

SMTP Metrics

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Current Connections:..(10min)
Total Connections:..(60min)
Messages Received:..(60min)
Errors Logged:.(60min)
Warnings Logged:.(60min)
+
-
-

Data Store Metrics

- - - - - - - - - - - - - - - - - - - - - -
Retention Period: - {{if .retentionMinutes}} - . - {{else}} - Disabled - {{end}} -
Retention Scan: - {{if .retentionMinutes}} - Completed . ago - {{else}} - Disabled - {{end}} -
Retention Deletes:.(60min)
Currently Retained:.(60min)
-

 

+
+
+

Data Store Metrics

+
+
+ + + + + + + + + + + + + + + + + + + + + +
Retention Period: + {{if .retentionMinutes}} + . + {{else}} + Disabled + {{end}} +
Retention Scan: + {{if .retentionMinutes}} + Completed . ago + {{else}} + Disabled + {{end}} +
Retention Deletes:.(60min)
Currently Retained:.(60min)
+
{{end}}