|  | @@ -31,96 +31,45 @@ func (g *GuptaReport) GetCPULoad() string {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // collect all CPU stat from /proc/cpustat
 | 
	
		
			
				|  |  |  type CPUStat struct {
 | 
	
		
			
				|  |  | -	user         uint64
 | 
	
		
			
				|  |  | -	nice         uint64
 | 
	
		
			
				|  |  | -	system       uint64
 | 
	
		
			
				|  |  | -	idle         uint64
 | 
	
		
			
				|  |  | -	iowait       uint64
 | 
	
		
			
				|  |  | -	idleNew      uint64
 | 
	
		
			
				|  |  | -	iowaitNew    uint64
 | 
	
		
			
				|  |  | -	irq          uint64
 | 
	
		
			
				|  |  | -	softirq      uint64
 | 
	
		
			
				|  |  | -	steal        uint64
 | 
	
		
			
				|  |  | -	guest        uint64
 | 
	
		
			
				|  |  | -	guest_nice   uint64
 | 
	
		
			
				|  |  | -	totalTimeNew uint64
 | 
	
		
			
				|  |  | +	totalTime    float64
 | 
	
		
			
				|  |  | +	idleTime     float64
 | 
	
		
			
				|  |  | +	totalTimeNew float64
 | 
	
		
			
				|  |  | +	idleTimeNew  float64
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// parse the first line of /proc/cpustat without the word cpu
 | 
	
		
			
				|  |  | -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) ReadInfoNew(rawInfo []string) {
 | 
	
		
			
				|  |  | -	idleNew, _ := strconv.ParseUint(rawInfo[3], 10, 64)
 | 
	
		
			
				|  |  | -	iowaitNew, _ := strconv.ParseUint(rawInfo[4], 10, 64)
 | 
	
		
			
				|  |  | -	c.idleNew = idleNew
 | 
	
		
			
				|  |  | -	c.iowaitNew = iowaitNew
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +func (c *CPUStat) ReadInfoNew(statline string) {
 | 
	
		
			
				|  |  | +	rawInfo := strings.Fields(statline)
 | 
	
		
			
				|  |  | +	idleNew, _ := strconv.ParseFloat(rawInfo[4], 10)
 | 
	
		
			
				|  |  | +	iowaitNew, _ := strconv.ParseFloat(rawInfo[5], 10)
 | 
	
		
			
				|  |  | +	c.idleTimeNew = idleNew + iowaitNew
 | 
	
		
			
				|  |  |  	for _, s := range rawInfo {
 | 
	
		
			
				|  |  | -		u, _ := strconv.ParseUint(s, 10, 64)
 | 
	
		
			
				|  |  | +		u, _ := strconv.ParseFloat(s, 10)
 | 
	
		
			
				|  |  |  		c.totalTimeNew += u
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -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) TotalTimeNew() uint64 {
 | 
	
		
			
				|  |  | -	return c.totalTimeNew
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (c *CPUStat) IdleTime() uint64 {
 | 
	
		
			
				|  |  | -	return c.idle + c.iowait
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (c *CPUStat) IdleTimeNew() uint64 {
 | 
	
		
			
				|  |  | -	return c.idleNew + c.iowaitNew
 | 
	
		
			
				|  |  | +func (c *CPUStat) ReadInfo(statline string) {
 | 
	
		
			
				|  |  | +	rawInfo := strings.Fields(statline)
 | 
	
		
			
				|  |  | +	for _, s := range rawInfo[1:] {
 | 
	
		
			
				|  |  | +		u, _ := strconv.ParseFloat(s, 10)
 | 
	
		
			
				|  |  | +		c.totalTime += u
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	idle, _ := strconv.ParseFloat(rawInfo[4], 10)
 | 
	
		
			
				|  |  | +	iowait, _ := strconv.ParseFloat(rawInfo[5], 10)
 | 
	
		
			
				|  |  | +	c.idleTime = idle + iowait
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (c *CPUStat) CPUUsage() float64 {
 | 
	
		
			
				|  |  | -	deltaIdleTime := c.IdleTimeNew() - c.IdleTime()
 | 
	
		
			
				|  |  | -	deltaTotalTime := c.TotalTimeNew() - c.TotalTime()
 | 
	
		
			
				|  |  | +	deltaIdleTime := c.idleTimeNew - c.idleTime
 | 
	
		
			
				|  |  | +	deltaTotalTime := c.totalTimeNew - c.totalTime
 | 
	
		
			
				|  |  |  	cpuUsage := (1.0 - float64(deltaIdleTime)/float64(deltaTotalTime)) * 100
 | 
	
		
			
				|  |  |  	return cpuUsage
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func NewCPUStat(procstatline, procstatlineNew string) CPUStat {
 | 
	
		
			
				|  |  |  	cpustat := CPUStat{}
 | 
	
		
			
				|  |  | -	statline := strings.Fields(procstatline)
 | 
	
		
			
				|  |  | -	statlineNew := strings.Fields(procstatlineNew)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	cpustat.ReadInfo(statline[1:])
 | 
	
		
			
				|  |  | -	cpustat.ReadInfoNew(statlineNew[1:])
 | 
	
		
			
				|  |  | +	cpustat.ReadInfo(procstatline)
 | 
	
		
			
				|  |  | +	cpustat.ReadInfoNew(procstatlineNew)
 | 
	
		
			
				|  |  |  	return cpustat
 | 
	
		
			
				|  |  |  }
 |