From 0286dcf214c161d0f30cabe6dabf93b821d64c0d Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Fri, 13 Sep 2019 08:22:38 -0700 Subject: [PATCH] move tool from gogs into appstats pkg --- admin.go | 41 +++++++++-------- appstats/appstats.go | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ stats.go | 128 --------------------------------------------------- 3 files changed, 149 insertions(+), 148 deletions(-) create mode 100644 appstats/appstats.go delete mode 100644 stats.go diff --git a/admin.go b/admin.go index 0aee818..fdbb82f 100644 --- a/admin.go +++ b/admin.go @@ -22,6 +22,7 @@ import ( "github.com/writeas/impart" "github.com/writeas/web-core/auth" "github.com/writeas/web-core/log" + "github.com/writeas/writefreely/appstats" "github.com/writeas/writefreely/config" ) @@ -407,37 +408,37 @@ func handleAdminUpdateConfig(apper Apper, u *User, w http.ResponseWriter, r *htt } func updateAppStats() { - sysStatus.Uptime = timeSincePro(appStartTime) + sysStatus.Uptime = appstats.TimeSincePro(appStartTime) m := new(runtime.MemStats) runtime.ReadMemStats(m) sysStatus.NumGoroutine = runtime.NumGoroutine() - sysStatus.MemAllocated = fileSize(int64(m.Alloc)) - sysStatus.MemTotal = fileSize(int64(m.TotalAlloc)) - sysStatus.MemSys = fileSize(int64(m.Sys)) + sysStatus.MemAllocated = appstats.FileSize(int64(m.Alloc)) + sysStatus.MemTotal = appstats.FileSize(int64(m.TotalAlloc)) + sysStatus.MemSys = appstats.FileSize(int64(m.Sys)) sysStatus.Lookups = m.Lookups sysStatus.MemMallocs = m.Mallocs sysStatus.MemFrees = m.Frees - sysStatus.HeapAlloc = fileSize(int64(m.HeapAlloc)) - sysStatus.HeapSys = fileSize(int64(m.HeapSys)) - sysStatus.HeapIdle = fileSize(int64(m.HeapIdle)) - sysStatus.HeapInuse = fileSize(int64(m.HeapInuse)) - sysStatus.HeapReleased = fileSize(int64(m.HeapReleased)) + sysStatus.HeapAlloc = appstats.FileSize(int64(m.HeapAlloc)) + sysStatus.HeapSys = appstats.FileSize(int64(m.HeapSys)) + sysStatus.HeapIdle = appstats.FileSize(int64(m.HeapIdle)) + sysStatus.HeapInuse = appstats.FileSize(int64(m.HeapInuse)) + sysStatus.HeapReleased = appstats.FileSize(int64(m.HeapReleased)) sysStatus.HeapObjects = m.HeapObjects - sysStatus.StackInuse = fileSize(int64(m.StackInuse)) - sysStatus.StackSys = fileSize(int64(m.StackSys)) - sysStatus.MSpanInuse = fileSize(int64(m.MSpanInuse)) - sysStatus.MSpanSys = fileSize(int64(m.MSpanSys)) - sysStatus.MCacheInuse = fileSize(int64(m.MCacheInuse)) - sysStatus.MCacheSys = fileSize(int64(m.MCacheSys)) - sysStatus.BuckHashSys = fileSize(int64(m.BuckHashSys)) - sysStatus.GCSys = fileSize(int64(m.GCSys)) - sysStatus.OtherSys = fileSize(int64(m.OtherSys)) - - sysStatus.NextGC = fileSize(int64(m.NextGC)) + sysStatus.StackInuse = appstats.FileSize(int64(m.StackInuse)) + sysStatus.StackSys = appstats.FileSize(int64(m.StackSys)) + sysStatus.MSpanInuse = appstats.FileSize(int64(m.MSpanInuse)) + sysStatus.MSpanSys = appstats.FileSize(int64(m.MSpanSys)) + sysStatus.MCacheInuse = appstats.FileSize(int64(m.MCacheInuse)) + sysStatus.MCacheSys = appstats.FileSize(int64(m.MCacheSys)) + sysStatus.BuckHashSys = appstats.FileSize(int64(m.BuckHashSys)) + sysStatus.GCSys = appstats.FileSize(int64(m.GCSys)) + sysStatus.OtherSys = appstats.FileSize(int64(m.OtherSys)) + + sysStatus.NextGC = appstats.FileSize(int64(m.NextGC)) sysStatus.LastGC = fmt.Sprintf("%.1fs", float64(time.Now().UnixNano()-int64(m.LastGC))/1000/1000/1000) sysStatus.PauseTotalNs = fmt.Sprintf("%.1fs", float64(m.PauseTotalNs)/1000/1000/1000) sysStatus.PauseNs = fmt.Sprintf("%.3fs", float64(m.PauseNs[(m.NumGC+255)%256])/1000/1000/1000) diff --git a/appstats/appstats.go b/appstats/appstats.go new file mode 100644 index 0000000..bf27c7b --- /dev/null +++ b/appstats/appstats.go @@ -0,0 +1,128 @@ +// Copyright 2014-2018 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style license that can be +// found in the LICENSE file of the Gogs project (github.com/gogs/gogs). + +package appstats + +import ( + "fmt" + "math" + "strings" + "time" +) + +// Borrowed from github.com/gogs/gogs/pkg/tool + +// Seconds-based time units +const ( + Minute = 60 + Hour = 60 * Minute + Day = 24 * Hour + Week = 7 * Day + Month = 30 * Day + Year = 12 * Month +) + +func computeTimeDiff(diff int64) (int64, string) { + diffStr := "" + switch { + case diff <= 0: + diff = 0 + diffStr = "now" + case diff < 2: + diff = 0 + diffStr = "1 second" + case diff < 1*Minute: + diffStr = fmt.Sprintf("%d seconds", diff) + diff = 0 + + case diff < 2*Minute: + diff -= 1 * Minute + diffStr = "1 minute" + case diff < 1*Hour: + diffStr = fmt.Sprintf("%d minutes", diff/Minute) + diff -= diff / Minute * Minute + + case diff < 2*Hour: + diff -= 1 * Hour + diffStr = "1 hour" + case diff < 1*Day: + diffStr = fmt.Sprintf("%d hours", diff/Hour) + diff -= diff / Hour * Hour + + case diff < 2*Day: + diff -= 1 * Day + diffStr = "1 day" + case diff < 1*Week: + diffStr = fmt.Sprintf("%d days", diff/Day) + diff -= diff / Day * Day + + case diff < 2*Week: + diff -= 1 * Week + diffStr = "1 week" + case diff < 1*Month: + diffStr = fmt.Sprintf("%d weeks", diff/Week) + diff -= diff / Week * Week + + case diff < 2*Month: + diff -= 1 * Month + diffStr = "1 month" + case diff < 1*Year: + diffStr = fmt.Sprintf("%d months", diff/Month) + diff -= diff / Month * Month + + case diff < 2*Year: + diff -= 1 * Year + diffStr = "1 year" + default: + diffStr = fmt.Sprintf("%d years", diff/Year) + diff = 0 + } + return diff, diffStr +} + +// TimeSincePro calculates the time interval and generate full user-friendly string. +func TimeSincePro(then time.Time) string { + now := time.Now() + diff := now.Unix() - then.Unix() + + if then.After(now) { + return "future" + } + + var timeStr, diffStr string + for { + if diff == 0 { + break + } + + diff, diffStr = computeTimeDiff(diff) + timeStr += ", " + diffStr + } + return strings.TrimPrefix(timeStr, ", ") +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} + +func humanateBytes(s uint64, base float64, sizes []string) string { + if s < 10 { + return fmt.Sprintf("%d B", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := float64(s) / math.Pow(base, math.Floor(e)) + f := "%.0f" + if val < 10 { + f = "%.1f" + } + + return fmt.Sprintf(f+" %s", val, suffix) +} + +// FileSize calculates the file size and generate user-friendly string. +func FileSize(s int64) string { + sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} + return humanateBytes(uint64(s), 1024, sizes) +} diff --git a/stats.go b/stats.go deleted file mode 100644 index 36ca0f0..0000000 --- a/stats.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2014-2018 The Gogs Authors. All rights reserved. -// Use of this source code is governed by a MIT-style license that can be -// found in the LICENSE file of the Gogs project (github.com/gogs/gogs). - -package writefreely - -import ( - "fmt" - "math" - "strings" - "time" -) - -// Borrowed from github.com/gogs/gogs/pkg/tool - -// Seconds-based time units -const ( - Minute = 60 - Hour = 60 * Minute - Day = 24 * Hour - Week = 7 * Day - Month = 30 * Day - Year = 12 * Month -) - -func computeTimeDiff(diff int64) (int64, string) { - diffStr := "" - switch { - case diff <= 0: - diff = 0 - diffStr = "now" - case diff < 2: - diff = 0 - diffStr = "1 second" - case diff < 1*Minute: - diffStr = fmt.Sprintf("%d seconds", diff) - diff = 0 - - case diff < 2*Minute: - diff -= 1 * Minute - diffStr = "1 minute" - case diff < 1*Hour: - diffStr = fmt.Sprintf("%d minutes", diff/Minute) - diff -= diff / Minute * Minute - - case diff < 2*Hour: - diff -= 1 * Hour - diffStr = "1 hour" - case diff < 1*Day: - diffStr = fmt.Sprintf("%d hours", diff/Hour) - diff -= diff / Hour * Hour - - case diff < 2*Day: - diff -= 1 * Day - diffStr = "1 day" - case diff < 1*Week: - diffStr = fmt.Sprintf("%d days", diff/Day) - diff -= diff / Day * Day - - case diff < 2*Week: - diff -= 1 * Week - diffStr = "1 week" - case diff < 1*Month: - diffStr = fmt.Sprintf("%d weeks", diff/Week) - diff -= diff / Week * Week - - case diff < 2*Month: - diff -= 1 * Month - diffStr = "1 month" - case diff < 1*Year: - diffStr = fmt.Sprintf("%d months", diff/Month) - diff -= diff / Month * Month - - case diff < 2*Year: - diff -= 1 * Year - diffStr = "1 year" - default: - diffStr = fmt.Sprintf("%d years", diff/Year) - diff = 0 - } - return diff, diffStr -} - -// timeSincePro calculates the time interval and generate full user-friendly string. -func timeSincePro(then time.Time) string { - now := time.Now() - diff := now.Unix() - then.Unix() - - if then.After(now) { - return "future" - } - - var timeStr, diffStr string - for { - if diff == 0 { - break - } - - diff, diffStr = computeTimeDiff(diff) - timeStr += ", " + diffStr - } - return strings.TrimPrefix(timeStr, ", ") -} - -func logn(n, b float64) float64 { - return math.Log(n) / math.Log(b) -} - -func humanateBytes(s uint64, base float64, sizes []string) string { - if s < 10 { - return fmt.Sprintf("%d B", s) - } - e := math.Floor(logn(float64(s), base)) - suffix := sizes[int(e)] - val := float64(s) / math.Pow(base, math.Floor(e)) - f := "%.0f" - if val < 10 { - f = "%.1f" - } - - return fmt.Sprintf(f+" %s", val, suffix) -} - -// fileSize calculates the file size and generate user-friendly string. -func fileSize(s int64) string { - sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} - return humanateBytes(uint64(s), 1024, sizes) -}