imaginary/health.go

60 lines
1.6 KiB
Go

package main
import (
"math"
"runtime"
"time"
)
var start = time.Now()
const MB float64 = 1.0 * 1024 * 1024
type HealthStats struct {
Uptime int64 `json:"uptime"`
AllocatedMemory float64 `json:"allocatedMemory"`
TotalAllocatedMemory float64 `json:"totalAllocatedMemory"`
Goroutines int `json:"goroutines"`
GCCycles uint32 `json:"completedGCCycles"`
NumberOfCPUs int `json:"cpus"`
HeapSys float64 `json:"maxHeapUsage"`
HeapAllocated float64 `json:"heapInUse"`
ObjectsInUse uint64 `json:"objectsInUse"`
OSMemoryObtained float64 `json:"OSMemoryObtained"`
}
func GetHealthStats() *HealthStats {
mem := &runtime.MemStats{}
runtime.ReadMemStats(mem)
return &HealthStats{
Uptime: GetUptime(),
AllocatedMemory: toMegaBytes(mem.Alloc),
TotalAllocatedMemory: toMegaBytes(mem.TotalAlloc),
Goroutines: runtime.NumGoroutine(),
NumberOfCPUs: runtime.NumCPU(),
GCCycles: mem.NumGC,
HeapSys: toMegaBytes(mem.HeapSys),
HeapAllocated: toMegaBytes(mem.HeapAlloc),
ObjectsInUse: mem.Mallocs - mem.Frees,
OSMemoryObtained: toMegaBytes(mem.Sys),
}
}
func GetUptime() int64 {
return time.Now().Unix() - start.Unix()
}
func toMegaBytes(bytes uint64) float64 {
return toFixed(float64(bytes)/MB, 2)
}
func round(num float64) int {
return int(num + math.Copysign(0.5, num))
}
func toFixed(num float64, precision int) float64 {
output := math.Pow(10, float64(precision))
return float64(round(num*output)) / output
}