open-nomad/client/stats/cpu.go

63 lines
1.4 KiB
Go
Raw Normal View History

2016-05-19 20:32:03 +00:00
package stats
import (
"runtime"
"time"
shelpers "github.com/hashicorp/nomad/helper/stats"
2016-05-19 20:32:03 +00:00
)
2016-05-20 18:38:15 +00:00
// CpuStats calculates cpu usage percentage
2016-05-19 20:32:03 +00:00
type CpuStats struct {
prevCpuTime float64
prevTime time.Time
clkSpeed float64
2016-05-19 20:32:03 +00:00
totalCpus int
}
2016-05-20 18:38:15 +00:00
// NewCpuStats returns a cpu stats calculator
2016-05-21 06:16:24 +00:00
func NewCpuStats() *CpuStats {
numCpus := runtime.NumCPU()
cpuStats := &CpuStats{
totalCpus: numCpus,
}
return cpuStats
2016-05-19 20:32:03 +00:00
}
2016-05-20 18:38:15 +00:00
// Percent calculates the cpu usage percentage based on the current cpu usage
// and the previous cpu usage where usage is given as time in nanoseconds spend
// in the cpu
func (c *CpuStats) Percent(cpuTime float64) float64 {
2016-05-20 09:10:50 +00:00
now := time.Now()
if c.prevCpuTime == 0.0 {
2016-05-20 09:10:50 +00:00
// invoked first time
c.prevCpuTime = cpuTime
2016-05-20 09:10:50 +00:00
c.prevTime = now
return 0.0
}
timeDelta := now.Sub(c.prevTime).Nanoseconds()
ret := c.calculatePercent(c.prevCpuTime, cpuTime, timeDelta)
c.prevCpuTime = cpuTime
2016-05-20 09:10:50 +00:00
c.prevTime = now
return ret
}
2016-05-20 09:10:50 +00:00
// TicksConsumed calculates the total ticks consumes by the process across all
// cpu cores
func (c *CpuStats) TicksConsumed(percent float64) float64 {
return (percent / 100) * shelpers.TotalTicksAvailable() / float64(c.totalCpus)
2016-05-20 09:10:50 +00:00
}
func (c *CpuStats) calculatePercent(t1, t2 float64, timeDelta int64) float64 {
vDelta := t2 - t1
if timeDelta <= 0 || vDelta <= 0.0 {
return 0.0
2016-05-20 09:10:50 +00:00
}
overall_percent := (vDelta / float64(timeDelta)) * 100.0
2016-05-20 09:10:50 +00:00
return overall_percent
2016-05-19 20:32:03 +00:00
}