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 }