package gupta import ( "fmt" "strconv" "strings" ) const version = "0.0.1" func Hello() string { return fmt.Sprintf("Welcome to gupta version %s", version) } func Run(load, cpu, memory bool, partition, networkInterface string) (cpuLoad, cpuUsage, memoryUsage float64) { cpuLoad = 0.2 cpuUsage = 0.2 memoryUsage = 70.0 return cpuLoad, cpuUsage, memoryUsage } type GuptaReport struct { cpuLoad float64 cpuUsage float64 memoryUsage float64 } func (g *GuptaReport) GetCPULoad() string { return fmt.Sprintf("%.2f", g.cpuLoad) } // collect all CPU stat from /proc/cpustat type CPUStat struct { user uint64 nice uint64 system uint64 idle uint64 iowait uint64 irq uint64 softirq uint64 steal uint64 guest uint64 guest_nice uint64 } // parse the first line of /proc/cpustat func (c *CPUStat) ReadInfo(rawInfo []string) { if s, err := strconv.ParseUint(rawInfo[0], 10, 64); err == nil { c.user = s } if s, err := strconv.ParseUint(rawInfo[1], 10, 64); err == nil { c.nice = s } if s, err := strconv.ParseUint(rawInfo[2], 10, 64); err == nil { c.system = s } if s, err := strconv.ParseUint(rawInfo[3], 10, 64); err == nil { c.idle = s } if s, err := strconv.ParseUint(rawInfo[4], 10, 64); err == nil { c.iowait = s } if s, err := strconv.ParseUint(rawInfo[5], 10, 64); err == nil { c.irq = s } if s, err := strconv.ParseUint(rawInfo[6], 10, 64); err == nil { c.softirq = s } if s, err := strconv.ParseUint(rawInfo[7], 10, 64); err == nil { c.steal = s } if s, err := strconv.ParseUint(rawInfo[8], 10, 64); err == nil { c.guest = s } if s, err := strconv.ParseUint(rawInfo[9], 10, 64); err == nil { c.guest_nice = s } } func (c *CPUStat) TotalTime() uint64 { return c.user + c.nice + c.system + c.idle + c.iowait + c.irq + c.softirq + c.steal } func (c *CPUStat) IdleTime() uint64 { return c.idle + c.iowait } func NewCPUStat(procstatline string) CPUStat { cpustat := CPUStat{} statline := strings.Fields(procstatline) cpustat.ReadInfo(statline[1:]) return cpustat }