2015-05-18 23:01:42 +00:00
|
|
|
package system
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2015-05-22 23:45:14 +00:00
|
|
|
"github.com/influxdb/telegraf/plugins"
|
2015-09-17 19:07:15 +00:00
|
|
|
"github.com/shirou/gopsutil/cpu"
|
2015-05-18 23:01:42 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type CPUStats struct {
|
2015-08-12 18:09:20 +00:00
|
|
|
ps PS
|
|
|
|
lastStats []cpu.CPUTimesStat
|
2015-08-13 20:36:18 +00:00
|
|
|
|
|
|
|
PerCPU bool `toml:"percpu"`
|
|
|
|
TotalCPU bool `toml:"totalcpu"`
|
2015-08-12 18:09:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewCPUStats(ps PS) *CPUStats {
|
2015-08-13 20:36:18 +00:00
|
|
|
return &CPUStats{
|
|
|
|
ps: ps,
|
2015-08-12 18:09:20 +00:00
|
|
|
}
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (_ *CPUStats) Description() string {
|
|
|
|
return "Read metrics about cpu usage"
|
|
|
|
}
|
|
|
|
|
2015-08-13 17:27:24 +00:00
|
|
|
var sampleConfig = `
|
2015-08-26 15:21:39 +00:00
|
|
|
# Whether to report per-cpu stats or not
|
|
|
|
percpu = true
|
|
|
|
# Whether to report total system cpu stats or not
|
|
|
|
totalcpu = true
|
|
|
|
`
|
2015-08-13 17:27:24 +00:00
|
|
|
|
|
|
|
func (_ *CPUStats) SampleConfig() string {
|
|
|
|
return sampleConfig
|
|
|
|
}
|
2015-05-18 23:01:42 +00:00
|
|
|
|
|
|
|
func (s *CPUStats) Gather(acc plugins.Accumulator) error {
|
2015-08-13 17:27:24 +00:00
|
|
|
times, err := s.ps.CPUTimes(s.PerCPU, s.TotalCPU)
|
2015-05-18 23:01:42 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error getting CPU info: %s", err)
|
|
|
|
}
|
|
|
|
|
2015-08-12 18:09:20 +00:00
|
|
|
for i, cts := range times {
|
2015-05-18 23:01:42 +00:00
|
|
|
tags := map[string]string{
|
|
|
|
"cpu": cts.CPU,
|
|
|
|
}
|
|
|
|
|
2015-09-17 19:23:33 +00:00
|
|
|
total := totalCpuTime(cts)
|
2015-08-12 18:09:20 +00:00
|
|
|
|
|
|
|
// Add total cpu numbers
|
2015-05-18 23:01:42 +00:00
|
|
|
add(acc, "user", cts.User, tags)
|
|
|
|
add(acc, "system", cts.System, tags)
|
|
|
|
add(acc, "idle", cts.Idle, tags)
|
|
|
|
add(acc, "nice", cts.Nice, tags)
|
|
|
|
add(acc, "iowait", cts.Iowait, tags)
|
|
|
|
add(acc, "irq", cts.Irq, tags)
|
|
|
|
add(acc, "softirq", cts.Softirq, tags)
|
|
|
|
add(acc, "steal", cts.Steal, tags)
|
|
|
|
add(acc, "guest", cts.Guest, tags)
|
2015-09-17 19:23:33 +00:00
|
|
|
add(acc, "guest_nice", cts.GuestNice, tags)
|
2015-08-12 18:09:20 +00:00
|
|
|
|
|
|
|
// Add in percentage
|
2015-08-13 20:36:18 +00:00
|
|
|
if len(s.lastStats) == 0 {
|
|
|
|
// If it's the 1st gather, can't get CPU stats yet
|
|
|
|
continue
|
|
|
|
}
|
2015-08-12 18:09:20 +00:00
|
|
|
lastCts := s.lastStats[i]
|
2015-09-17 19:23:33 +00:00
|
|
|
lastTotal := totalCpuTime(lastCts)
|
2015-08-12 18:09:20 +00:00
|
|
|
totalDelta := total - lastTotal
|
|
|
|
|
|
|
|
if totalDelta < 0 {
|
|
|
|
return fmt.Errorf("Error: current total CPU time is less than previous total CPU time")
|
|
|
|
}
|
|
|
|
|
|
|
|
if totalDelta == 0 {
|
2015-08-13 20:36:18 +00:00
|
|
|
continue
|
2015-08-12 18:09:20 +00:00
|
|
|
}
|
|
|
|
|
2015-09-17 19:23:33 +00:00
|
|
|
add(acc, "usage_user", 100*(cts.User-lastCts.User)/totalDelta, tags)
|
|
|
|
add(acc, "usage_system", 100*(cts.System-lastCts.System)/totalDelta, tags)
|
2015-09-18 00:37:12 +00:00
|
|
|
add(acc, "usage_idle", 100*(cts.Idle-lastCts.Idle)/totalDelta, tags)
|
2015-09-17 19:23:33 +00:00
|
|
|
add(acc, "usage_nice", 100*(cts.Nice-lastCts.Nice)/totalDelta, tags)
|
|
|
|
add(acc, "usage_iowait", 100*(cts.Iowait-lastCts.Iowait)/totalDelta, tags)
|
|
|
|
add(acc, "usage_irq", 100*(cts.Irq-lastCts.Irq)/totalDelta, tags)
|
|
|
|
add(acc, "usage_softirq", 100*(cts.Softirq-lastCts.Softirq)/totalDelta, tags)
|
|
|
|
add(acc, "usage_steal", 100*(cts.Steal-lastCts.Steal)/totalDelta, tags)
|
|
|
|
add(acc, "usage_guest", 100*(cts.Guest-lastCts.Guest)/totalDelta, tags)
|
|
|
|
add(acc, "usage_guest_nice", 100*(cts.GuestNice-lastCts.GuestNice)/totalDelta, tags)
|
2015-08-12 18:09:20 +00:00
|
|
|
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
|
2015-08-12 18:09:20 +00:00
|
|
|
s.lastStats = times
|
|
|
|
|
2015-05-18 23:01:42 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-09-17 19:23:33 +00:00
|
|
|
func totalCpuTime(t cpu.CPUTimesStat) float64 {
|
|
|
|
total := t.User + t.System + t.Nice + t.Iowait + t.Irq + t.Softirq + t.Steal +
|
|
|
|
t.Guest + t.GuestNice + t.Idle
|
|
|
|
return total
|
2015-08-12 18:09:20 +00:00
|
|
|
}
|
|
|
|
|
2015-05-18 23:01:42 +00:00
|
|
|
func init() {
|
|
|
|
plugins.Add("cpu", func() plugins.Plugin {
|
2015-08-13 20:36:18 +00:00
|
|
|
return &CPUStats{ps: &systemPS{}}
|
2015-05-18 23:01:42 +00:00
|
|
|
})
|
|
|
|
}
|