|
@@ -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
|
|
|
}
|