1
0
Fork 0
mnemonics/route/metric.go

136 lines
4.3 KiB
Go
Raw Normal View History

2016-03-07 04:31:13 +09:00
package route
import (
"github.com/gin-gonic/gin"
"runtime"
"time"
"amuz.es/go/wiki/util"
"fmt"
)
func Metric(c *gin.Context) {
updateSystemStatus()
metricInfo:=sysStatus
content := gin.H{
"uptime":metricInfo.Uptime,
"numGoroutine":metricInfo.NumGoroutine,
"memAllocated":metricInfo.MemAllocated,
"memTotal":metricInfo.MemTotal,
"memSys":metricInfo.MemSys,
"lookups":metricInfo.Lookups,
"memMallocs":metricInfo.MemMallocs,
"memFrees":metricInfo.MemFrees,
"heapAlloc":metricInfo.HeapAlloc,
"heapSys":metricInfo.HeapSys,
"heapIdle":metricInfo.HeapIdle,
"heapInuse":metricInfo.HeapInuse,
"heapReleased":metricInfo.HeapReleased,
"heapObjects":metricInfo.HeapObjects,
"stackInuse":metricInfo.StackInuse,
"stackSys":metricInfo.StackSys,
"mSpanInuse":metricInfo.MSpanInuse,
"mSpanSys":metricInfo.MSpanSys,
"mCacheInuse":metricInfo.MCacheInuse,
"mCacheSys":metricInfo.MCacheSys,
"buckHashSys":metricInfo.BuckHashSys,
"gCSys":metricInfo.GCSys,
"otherSys":metricInfo.OtherSys,
"nextGC":metricInfo.NextGC,
"lastGC":metricInfo.LastGC,
"pauseTotalNs":metricInfo.PauseTotalNs,
"pauseNs":metricInfo.PauseNs,
"numGC":metricInfo.NumGC}
c.JSON(200, content)
}
var (
startTime = time.Now()
)
var sysStatus struct {
Uptime string
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() {
sysStatus.Uptime = util.TimeSincePro(startTime)
m := new(runtime.MemStats)
runtime.ReadMemStats(m)
sysStatus.NumGoroutine = runtime.NumGoroutine()
sysStatus.MemAllocated = util.FileSize(int64(m.Alloc))
sysStatus.MemTotal = util.FileSize(int64(m.TotalAlloc))
sysStatus.MemSys = util.FileSize(int64(m.Sys))
sysStatus.Lookups = m.Lookups
sysStatus.MemMallocs = m.Mallocs
sysStatus.MemFrees = m.Frees
sysStatus.HeapAlloc = util.FileSize(int64(m.HeapAlloc))
sysStatus.HeapSys = util.FileSize(int64(m.HeapSys))
sysStatus.HeapIdle = util.FileSize(int64(m.HeapIdle))
sysStatus.HeapInuse = util.FileSize(int64(m.HeapInuse))
sysStatus.HeapReleased = util.FileSize(int64(m.HeapReleased))
sysStatus.HeapObjects = m.HeapObjects
sysStatus.StackInuse = util.FileSize(int64(m.StackInuse))
sysStatus.StackSys = util.FileSize(int64(m.StackSys))
sysStatus.MSpanInuse = util.FileSize(int64(m.MSpanInuse))
sysStatus.MSpanSys = util.FileSize(int64(m.MSpanSys))
sysStatus.MCacheInuse = util.FileSize(int64(m.MCacheInuse))
sysStatus.MCacheSys = util.FileSize(int64(m.MCacheSys))
sysStatus.BuckHashSys = util.FileSize(int64(m.BuckHashSys))
sysStatus.GCSys = util.FileSize(int64(m.GCSys))
sysStatus.OtherSys = util.FileSize(int64(m.OtherSys))
sysStatus.NextGC = util.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
}