From 3c7c24b6980170f96110329f6c1b2dd8d661401e Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Thu, 22 Mar 2018 20:30:23 -0700 Subject: [PATCH] storage: Calculate size of store for status page --- CHANGELOG.md | 6 +++++- pkg/storage/retention.go | 9 +++++++++ themes/bootstrap/public/metrics.js | 2 ++ themes/bootstrap/templates/root/status.html | 6 ++++++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e674d8d..5fb1ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,18 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Added +- Store size is now calculated during retention scan and displayed on the Status + page. + ### Changed - Massive refactor of back-end code. Inbucket should now be both easier and more enjoyable to work on. + ## [v1.3.1] - 2018-03-10 ### Fixed - - Adding additional locking during message delivery to prevent race condition that could lose messages. diff --git a/pkg/storage/retention.go b/pkg/storage/retention.go index d083152..c17e725 100644 --- a/pkg/storage/retention.go +++ b/pkg/storage/retention.go @@ -18,14 +18,17 @@ var ( expRetentionDeletesTotal = new(expvar.Int) expRetentionPeriod = new(expvar.Int) expRetainedCurrent = new(expvar.Int) + expRetainedSize = new(expvar.Int) // History of certain stats retentionDeletesHist = list.New() retainedHist = list.New() + sizeHist = list.New() // History rendered as comma delimited string expRetentionDeletesHist = new(expvar.String) expRetainedHist = new(expvar.String) + expSizeHist = new(expvar.String) ) func init() { @@ -36,10 +39,13 @@ func init() { rm.Set("Period", expRetentionPeriod) rm.Set("RetainedHist", expRetainedHist) rm.Set("RetainedCurrent", expRetainedCurrent) + rm.Set("RetainedSize", expRetainedSize) + rm.Set("SizeHist", expSizeHist) log.AddTickerFunc(func() { expRetentionDeletesHist.Set(log.PushMetric(retentionDeletesHist, expRetentionDeletesTotal)) expRetainedHist.Set(log.PushMetric(retainedHist, expRetainedCurrent)) + expSizeHist.Set(log.PushMetric(sizeHist, expRetainedSize)) }) } @@ -118,6 +124,7 @@ func (rs *RetentionScanner) DoScan() error { log.Tracef("Starting retention scan") cutoff := time.Now().Add(-1 * rs.retentionPeriod) retained := 0 + storeSize := int64(0) // Loop over all mailboxes. err := rs.ds.VisitMailboxes(func(messages []Message) bool { for _, msg := range messages { @@ -130,6 +137,7 @@ func (rs *RetentionScanner) DoScan() error { } } else { retained++ + storeSize += msg.Size() } } select { @@ -147,6 +155,7 @@ func (rs *RetentionScanner) DoScan() error { // Update metrics setRetentionScanCompleted(time.Now()) expRetainedCurrent.Set(int64(retained)) + expRetainedSize.Set(storeSize) return nil } diff --git a/themes/bootstrap/public/metrics.js b/themes/bootstrap/public/metrics.js index f3fc0f1..ec8a5eb 100644 --- a/themes/bootstrap/public/metrics.js +++ b/themes/bootstrap/public/metrics.js @@ -120,6 +120,8 @@ function displayMetrics(data, textStatus, jqXHR) { setHistoryOfActivity('retentionDeletesTotal', data.retention.DeletesHist); metric('retainedCurrent', data.retention.RetainedCurrent, numberFilter, false); setHistoryOfCount('retainedCurrent', data.retention.RetainedHist); + metric('retainedSize', data.retention.RetainedSize, sizeFilter, false); + setHistoryOfCount('retainedSize', data.retention.SizeHist); } function loadMetrics() { diff --git a/themes/bootstrap/templates/root/status.html b/themes/bootstrap/templates/root/status.html index 31fbc35..3c708b1 100644 --- a/themes/bootstrap/templates/root/status.html +++ b/themes/bootstrap/templates/root/status.html @@ -203,6 +203,12 @@ $(document).ready(
+
+
Store Size:
+
.
+
+ +