//go:build !windows package stats import ( "os" "runtime" "sync" ) type Reporter struct { mu sync.Mutex lastIdle uint64 lastTotal uint64 hasSample bool } func NewReporter() *Reporter { return &Reporter{} } func (r *Reporter) SystemInfo() (hostname string, cpuCores int, memoryGB int) { hostname, _ = os.Hostname() cpuCores = runtime.NumCPU() total, _ := r.memoryStatus() memoryGB = int(total / (1024 * 1024 * 1024)) if memoryGB < 1 { memoryGB = 1 } return hostname, cpuCores, memoryGB } func (r *Reporter) Usage() (cpuPct float64, memPct float64) { total, avail := r.memoryStatus() if total > 0 { memPct = float64(total-avail) / float64(total) * 100 } return 0, memPct } func (r *Reporter) FreeMemoryMB() uint64 { _, avail := r.memoryStatus() return avail / (1024 * 1024) } func (r *Reporter) TotalMemoryMB() uint64 { total, _ := r.memoryStatus() return total / (1024 * 1024) }