mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-18 01:57:02 +00:00
- HTML popup now specifies UTF8 encoding - Version and build date are captured from goxc - Version is displayed on status page, and initial log entry
286 lines
8.3 KiB
HTML
286 lines
8.3 KiB
HTML
{{define "title"}}Inbucket Status{{end}}
|
|
|
|
{{define "script"}}
|
|
<script src="/public/jquery.sparkline.min.js" type="text/javascript" charset="utf-8"></script>
|
|
<script>
|
|
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<h.length; i++) {
|
|
var t = parseInt(h[i])
|
|
h[i] = t-prev
|
|
prev = t
|
|
}
|
|
// First value will always be zero
|
|
if (h.length > 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)
|
|
}
|
|
|
|
function aboutInit() {
|
|
loadMetrics()
|
|
setInterval(loadMetrics, 10000)
|
|
}
|
|
|
|
$(document).ready(aboutInit)
|
|
</script>
|
|
{{end}}
|
|
|
|
{{define "menu"}}
|
|
<div id="logo">
|
|
<h1><a href="/">inbucket</a></h1>
|
|
<h2>email testing service</h2>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{define "content"}}
|
|
<h2>Inbucket Status</h2>
|
|
|
|
<p>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.</p>
|
|
|
|
<div class="box">
|
|
<h3>Configuration</h3>
|
|
<table class="metrics">
|
|
<tr>
|
|
<th>Version:</th>
|
|
<td><span>{{.version}}, built on {{.buildDate}}</span></td>
|
|
</tr>
|
|
<tr>
|
|
<th>SMTP Listener:</th>
|
|
<td><span>{{.smtpListener}}</span></td>
|
|
</tr>
|
|
<tr>
|
|
<th>POP3 Listener:</th>
|
|
<td><span>{{.pop3Listener}}</span></td>
|
|
</tr>
|
|
<tr>
|
|
<th>HTTP Listener:</th>
|
|
<td><span>{{.webListener}}</span></td>
|
|
</tr>
|
|
</table>
|
|
<p class="last"> </p>
|
|
</div>
|
|
<div class="box">
|
|
<h3>General Metrics</h3>
|
|
<table class="metrics">
|
|
<tr>
|
|
<th>Uptime:</th>
|
|
<td class="number"><span id="m-uptime">.</span></td>
|
|
</tr>
|
|
<tr>
|
|
<th>System Memory:</th>
|
|
<td class="number"><span id="m-memstatsSys">.</span></td>
|
|
<td class="sparkline"><span id="s-memstatsSys">.</span></td>
|
|
<td>(10min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Heap Size:</th>
|
|
<td class="number"><span id="m-memstatsHeapSys">.</span></td>
|
|
<td class="sparkline"><span id="s-memstatsHeapSys">.</span></td>
|
|
<td>(10min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Heap In-Use:</th>
|
|
<td class="number"><span id="m-memstatsHeapAlloc">.</span></td>
|
|
<td class="sparkline"><span id="s-memstatsHeapAlloc">.</span></td>
|
|
<td>(10min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Heap # Objects:</th>
|
|
<td class="number"><span id="m-memstatsHeapObjects">.</span></td>
|
|
<td class="sparkline"><span id="s-memstatsHeapObjects">.</span></td>
|
|
<td>(10min)</td>
|
|
</tr>
|
|
</table>
|
|
<p class="last"> </p>
|
|
</div>
|
|
<div class="box">
|
|
<h3>SMTP Metrics</h3>
|
|
<table class="metrics">
|
|
<tr>
|
|
<th>Current Connections:</th>
|
|
<td class="number"><span id="m-smtpConnectsCurrent">.</span></td>
|
|
<td class="sparkline"><span id="s-smtpConnectsCurrent">.</span></td>
|
|
<td>(10min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Total Connections:</th>
|
|
<td class="number"><span id="m-smtpConnectsTotal">.</span></td>
|
|
<td class="sparkline"><span id="s-smtpConnectsTotal">.</span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Messages Received:</th>
|
|
<td class="number"><span id="m-smtpReceivedTotal">.</span></td>
|
|
<td class="sparkline"><span id="s-smtpReceivedTotal">.</span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Errors Logged:</th>
|
|
<td class="number"><span id="m-smtpErrorsTotal">.</span></td>
|
|
<td class="sparkline"><span id="s-smtpErrorsTotal"></span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Warnings Logged:</th>
|
|
<td class="number"><span id="m-smtpWarnsTotal">.</span></td>
|
|
<td class="sparkline"><span id="s-smtpWarnsTotal"></span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
</table>
|
|
<p class="last"> </p>
|
|
</div>
|
|
<div class="box">
|
|
<h3>Data Store Metrics</h3>
|
|
<table class="metrics">
|
|
<tr>
|
|
<th>Retention Period:</th>
|
|
<td colspan="3">
|
|
{{if .retentionMinutes}}
|
|
<span id="m-retentionPeriod">.</span>
|
|
{{else}}
|
|
Disabled
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Retention Scan:</th>
|
|
<td colspan="3">
|
|
{{if .retentionMinutes}}
|
|
Completed <span id="m-retentionScanCompleted">.</span> ago
|
|
{{else}}
|
|
Disabled
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Retention Deletes:</th>
|
|
<td class="number"><span id="m-retentionDeletesTotal">.</span></td>
|
|
<td class="sparkline"><span id="s-retentionDeletesTotal"></span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Currently Retained:</th>
|
|
<td class="number"><span id="m-retainedCurrent">.</span></td>
|
|
<td class="sparkline"><span id="s-retainedCurrent"></span></td>
|
|
<td>(60min)</td>
|
|
</tr>
|
|
</table>
|
|
<p class="last"> </p>
|
|
</div>
|
|
{{end}}
|
|
|