Skip to content

Commit

Permalink
Allow a PerCPU configuration variable, issue #108
Browse files Browse the repository at this point in the history
  • Loading branch information
sparrc committed Aug 13, 2015
1 parent 5d4b6c4 commit 04963f1
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 31 deletions.
15 changes: 13 additions & 2 deletions plugins/system/cpu.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,27 @@ import (

type CPUStats struct {
ps PS

PerCPU bool `toml:"percpu"`
TotalCPU bool `toml:"totalcpu"`
}

func (_ *CPUStats) Description() string {
return "Read metrics about cpu usage"
}

func (_ *CPUStats) SampleConfig() string { return "" }
var sampleConfig = `
# Whether to report per-cpu stats or not
percpu = true
# Whether to report total system cpu stats or not
totalcpu = true`

func (_ *CPUStats) SampleConfig() string {
return sampleConfig
}

func (s *CPUStats) Gather(acc plugins.Accumulator) error {
times, err := s.ps.CPUTimes()
times, err := s.ps.CPUTimes(s.PerCPU, s.TotalCPU)
if err != nil {
return fmt.Errorf("error getting CPU info: %s", err)
}
Expand Down
2 changes: 1 addition & 1 deletion plugins/system/mock_PS.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (m *MockPS) LoadAvg() (*load.LoadAvgStat, error) {

return r0, r1
}
func (m *MockPS) CPUTimes() ([]cpu.CPUTimesStat, error) {
func (m *MockPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error) {
ret := m.Called()

r0 := ret.Get(0).([]cpu.CPUTimesStat)
Expand Down
21 changes: 18 additions & 3 deletions plugins/system/ps.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type DockerContainerStat struct {

type PS interface {
LoadAvg() (*load.LoadAvgStat, error)
CPUTimes() ([]cpu.CPUTimesStat, error)
CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error)
DiskUsage() ([]*disk.DiskUsageStat, error)
NetIO() ([]net.NetIOCountersStat, error)
DiskIO() (map[string]disk.DiskIOCountersStat, error)
Expand All @@ -49,8 +49,23 @@ func (s *systemPS) LoadAvg() (*load.LoadAvgStat, error) {
return load.LoadAvg()
}

func (s *systemPS) CPUTimes() ([]cpu.CPUTimesStat, error) {
return cpu.CPUTimes(true)
func (s *systemPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.CPUTimesStat, error) {
var cpuTimes []cpu.CPUTimesStat
if perCPU {
if perCPUTimes, err := cpu.CPUTimes(true); err == nil {
cpuTimes = append(cpuTimes, perCPUTimes...)
} else {
return nil, err
}
}
if totalCPU {
if totalCPUTimes, err := cpu.CPUTimes(false); err == nil {
cpuTimes = append(cpuTimes, totalCPUTimes...)
} else {
return nil, err
}
}
return cpuTimes, nil
}

func (s *systemPS) DiskUsage() ([]*disk.DiskUsageStat, error) {
Expand Down
34 changes: 10 additions & 24 deletions plugins/system/ps/cpu/cpu_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,11 @@ func perCPUTimes() ([]CPUTimesStat, error) {
}

c := CPUTimesStat{
CPU: fmt.Sprintf("cpu%d", i),
User: float64(cpu_ticks[C.CPU_STATE_USER]) / ClocksPerSec,
System: float64(cpu_ticks[C.CPU_STATE_SYSTEM]) / ClocksPerSec,
Nice: float64(cpu_ticks[C.CPU_STATE_NICE]) / ClocksPerSec,
Idle: float64(cpu_ticks[C.CPU_STATE_IDLE]) / ClocksPerSec,
Iowait: -1,
Irq: -1,
Softirq: -1,
Steal: -1,
Guest: -1,
GuestNice: -1,
Stolen: -1,
CPU: fmt.Sprintf("cpu%d", i),
User: float64(cpu_ticks[C.CPU_STATE_USER]) / ClocksPerSec,
System: float64(cpu_ticks[C.CPU_STATE_SYSTEM]) / ClocksPerSec,
Nice: float64(cpu_ticks[C.CPU_STATE_NICE]) / ClocksPerSec,
Idle: float64(cpu_ticks[C.CPU_STATE_IDLE]) / ClocksPerSec,
}

ret = append(ret, c)
Expand All @@ -119,18 +112,11 @@ func allCPUTimes() ([]CPUTimesStat, error) {
}

c := CPUTimesStat{
CPU: "cpu-total",
User: float64(cpuload.cpu_ticks[C.CPU_STATE_USER]) / ClocksPerSec,
System: float64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM]) / ClocksPerSec,
Nice: float64(cpuload.cpu_ticks[C.CPU_STATE_NICE]) / ClocksPerSec,
Idle: float64(cpuload.cpu_ticks[C.CPU_STATE_IDLE]) / ClocksPerSec,
Iowait: -1,
Irq: -1,
Softirq: -1,
Steal: -1,
Guest: -1,
GuestNice: -1,
Stolen: -1,
CPU: "cpu-total",
User: float64(cpuload.cpu_ticks[C.CPU_STATE_USER]) / ClocksPerSec,
System: float64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM]) / ClocksPerSec,
Nice: float64(cpuload.cpu_ticks[C.CPU_STATE_NICE]) / ClocksPerSec,
Idle: float64(cpuload.cpu_ticks[C.CPU_STATE_IDLE]) / ClocksPerSec,
}

return []CPUTimesStat{c}, nil
Expand Down
3 changes: 2 additions & 1 deletion testdata/telegraf-agent.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ database = "telegraf" # required.

# Read metrics about cpu usage
[cpu]
# no configuration
totalcpu = true
percpu = false

# Read metrics about disk usage by mount point
[disk]
Expand Down

0 comments on commit 04963f1

Please sign in to comment.