diff options
author | Unknown <joe2010xtmf@163.com> | 2014-03-22 07:42:24 -0400 |
---|---|---|
committer | Unknown <joe2010xtmf@163.com> | 2014-03-22 07:42:24 -0400 |
commit | 0d1872ebe3f11c14f31f454ed8d719a22c0884d0 (patch) | |
tree | 2c79a0f4ff91dc064297f4d5bc959cbd27ed8a0a | |
parent | 7a1ff8636c01844a501dd9cdca2c436d1b7826b7 (diff) | |
download | gitea-0d1872ebe3f11c14f31f454ed8d719a22c0884d0.tar.gz gitea-0d1872ebe3f11c14f31f454ed8d719a22c0884d0.zip |
Add admin memStatus panel
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | routers/admin/admin.go | 81 | ||||
-rw-r--r-- | templates/admin/dashboard.tmpl | 33 |
3 files changed, 115 insertions, 2 deletions
@@ -42,8 +42,9 @@ There are two ways to install Gogs: ## Acknowledgments -- Mail service is based on [WeTalk](https://github.com/beego/wetalk). - Logo is inspired by [martini](https://github.com/martini-contrib). +- Mail service is based on [WeTalk](https://github.com/beego/wetalk). +- System Monitor Status is based on [GoBlog](https://github.com/fuxiaohei/goblog). ## Contributors diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 25ed8981e0..57a46d1dfe 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -5,7 +5,10 @@ package admin import ( + "fmt" + "runtime" "strings" + "time" "github.com/codegangsta/martini" @@ -14,10 +17,88 @@ import ( "github.com/gogits/gogs/modules/middleware" ) +var sysStatus struct { + NumGoroutine int + + // General statistics. + MemAllocated string // bytes allocated and still in use + MemTotal string // bytes allocated (even if freed) + MemSys string // bytes obtained from system (sum of XxxSys below) + Lookups uint64 // number of pointer lookups + MemMallocs uint64 // number of mallocs + MemFrees uint64 // number of frees + + // Main allocation heap statistics. + HeapAlloc string // bytes allocated and still in use + HeapSys string // bytes obtained from system + HeapIdle string // bytes in idle spans + HeapInuse string // bytes in non-idle span + HeapReleased string // bytes released to the OS + HeapObjects uint64 // total number of allocated objects + + // Low-level fixed-size structure allocator statistics. + // Inuse is bytes used now. + // Sys is bytes obtained from system. + StackInuse string // bootstrap stacks + StackSys string + MSpanInuse string // mspan structures + MSpanSys string + MCacheInuse string // mcache structures + MCacheSys string + BuckHashSys string // profiling bucket hash table + GCSys string // GC metadata + OtherSys string // other system allocations + + // Garbage collector statistics. + NextGC string // next run in HeapAlloc time (bytes) + LastGC string // last run in absolute time (ns) + PauseTotalNs string + PauseNs string // circular buffer of recent GC pause times, most recent at [(NumGC+255)%256] + NumGC uint32 +} + +func updateSystemStatus() { + m := new(runtime.MemStats) + runtime.ReadMemStats(m) + sysStatus.NumGoroutine = runtime.NumGoroutine() + + sysStatus.MemAllocated = base.FileSize(int64(m.Alloc)) + sysStatus.MemTotal = base.FileSize(int64(m.TotalAlloc)) + sysStatus.MemSys = base.FileSize(int64(m.Sys)) + sysStatus.Lookups = m.Lookups + sysStatus.MemMallocs = m.Mallocs + sysStatus.MemFrees = m.Frees + + sysStatus.HeapAlloc = base.FileSize(int64(m.HeapAlloc)) + sysStatus.HeapSys = base.FileSize(int64(m.HeapSys)) + sysStatus.HeapIdle = base.FileSize(int64(m.HeapIdle)) + sysStatus.HeapInuse = base.FileSize(int64(m.HeapInuse)) + sysStatus.HeapReleased = base.FileSize(int64(m.HeapReleased)) + sysStatus.HeapObjects = m.HeapObjects + + sysStatus.StackInuse = base.FileSize(int64(m.StackInuse)) + sysStatus.StackSys = base.FileSize(int64(m.StackSys)) + sysStatus.MSpanInuse = base.FileSize(int64(m.MSpanInuse)) + sysStatus.MSpanSys = base.FileSize(int64(m.MSpanSys)) + sysStatus.MCacheInuse = base.FileSize(int64(m.MCacheInuse)) + sysStatus.MCacheSys = base.FileSize(int64(m.MCacheSys)) + sysStatus.BuckHashSys = base.FileSize(int64(m.BuckHashSys)) + sysStatus.GCSys = base.FileSize(int64(m.GCSys)) + sysStatus.OtherSys = base.FileSize(int64(m.OtherSys)) + + sysStatus.NextGC = base.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)) + sysStatus.NumGC = m.NumGC +} + func Dashboard(ctx *middleware.Context) { ctx.Data["Title"] = "Admin Dashboard" ctx.Data["PageIsDashboard"] = true ctx.Data["Stats"] = models.GetStatistic() + updateSystemStatus() + ctx.Data["SysStatus"] = sysStatus ctx.HTML(200, "admin/dashboard") } diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index 6088487d62..0bebf8318f 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -15,10 +15,41 @@ <div class="panel panel-default"> <div class="panel-heading"> - System Status + System Monitor Status </div> <div class="panel-body"> + <div>Current Goroutines: <b>{{.SysStatus.NumGoroutine}}</b></div> + <hr/> + <div>Current Memory Usage: <b>{{.SysStatus.MemAllocated}}</b></div> + <div>Total Memory Allocated: <b>{{.SysStatus.MemTotal}}</b></div> + <div>Memory Obtained: <b>{{.SysStatus.MemSys}}</b></div> + <div>Pointer Lookup Times: <b>{{.SysStatus.Lookups}}</b></div> + <div>Memory Allocate Times: <b>{{.SysStatus.MemMallocs}}</b></div> + <div>Memory Free Times: <b>{{.SysStatus.MemFrees}}</b></div> + <hr/> + <div>Current Heap Usage: <b>{{.SysStatus.HeapAlloc}}</b></div> + <div>Heap Memory Obtained: <b>{{.SysStatus.HeapSys}}</b></div> + <div>Heap Memory Idle: <b>{{.SysStatus.HeapIdle}}</b></div> + <div>Heap Memory In Use: <b>{{.SysStatus.HeapInuse}}</b></div> + <div>Heap Memory Released: <b>{{.SysStatus.HeapReleased}}</b></div> + <div>Heap Objects: <b>{{.SysStatus.HeapObjects}}</b></div> + <hr/> + <div>Bootstrap Stack Usage: <b>{{.SysStatus.StackInuse}}</b></div> + <div>Stack Memory Obtained: <b>{{.SysStatus.StackSys}}</b></div> + <div>MSpan Structures Usage: <b>{{.SysStatus.MSpanInuse}}</b></div> + <div>MSpan Structures Obtained: <b>{{.SysStatus.HeapSys}}</b></div> + <div>MCache Structures Usage: <b>{{.SysStatus.MCacheInuse}}</b></div> + <div>MCache Structures Obtained: <b>{{.SysStatus.MCacheSys}}</b></div> + <div>Profiling Bucket Hash Table Obtained: <b>{{.SysStatus.BuckHashSys}}</b></div> + <div>GC Metadada Obtained: <b>{{.SysStatus.GCSys}}</b></div> + <div>Other System Allocation Obtained: <b>{{.SysStatus.OtherSys}}</b></div> + <hr/> + <div>Next GC Recycle: <b>{{.SysStatus.NextGC}}</b></div> + <div>Last GC Time: <b>{{.SysStatus.LastGC}} ago</b></div> + <div>Total GC Pause: <b>{{.SysStatus.PauseTotalNs}}</b></div> + <div>Last GC Pause: <b>{{.SysStatus.PauseNs}}</b></div> + <div>GC Times: <b>{{.SysStatus.NumGC}}</b></div> </div> </div> </div> |