telegraf/plugins/inputs/system/ps.go

136 lines
3.2 KiB
Go
Raw Permalink Normal View History

2015-05-18 23:01:42 +00:00
package system
import (
"os"
2015-05-18 23:01:42 +00:00
"github.com/influxdata/telegraf"
2016-01-20 18:57:35 +00:00
"github.com/influxdata/telegraf/internal"
2015-09-17 19:07:15 +00:00
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"
"github.com/shirou/gopsutil/net"
2015-05-18 23:01:42 +00:00
)
type PS interface {
CPUTimes(perCPU, totalCPU bool) ([]cpu.TimesStat, error)
DiskUsage(mountPointFilter []string, fstypeExclude []string) ([]*disk.UsageStat, []*disk.PartitionStat, error)
NetIO() ([]net.IOCountersStat, error)
NetProto() ([]net.ProtoCountersStat, error)
DiskIO() (map[string]disk.IOCountersStat, error)
2015-05-18 23:01:42 +00:00
VMStat() (*mem.VirtualMemoryStat, error)
SwapStat() (*mem.SwapMemoryStat, error)
NetConnections() ([]net.ConnectionStat, error)
2015-05-18 23:01:42 +00:00
}
func add(acc telegraf.Accumulator,
2015-05-18 23:01:42 +00:00
name string, val float64, tags map[string]string) {
if val >= 0 {
2016-08-31 11:15:14 +00:00
acc.AddFields(name, map[string]interface{}{"value": val}, tags)
2015-05-18 23:01:42 +00:00
}
}
type systemPS struct{}
2015-05-18 23:01:42 +00:00
func (s *systemPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.TimesStat, error) {
var cpuTimes []cpu.TimesStat
if perCPU {
if perCPUTimes, err := cpu.Times(true); err == nil {
cpuTimes = append(cpuTimes, perCPUTimes...)
} else {
return nil, err
}
}
if totalCPU {
if totalCPUTimes, err := cpu.Times(false); err == nil {
cpuTimes = append(cpuTimes, totalCPUTimes...)
} else {
return nil, err
}
}
return cpuTimes, nil
2015-05-18 23:01:42 +00:00
}
func (s *systemPS) DiskUsage(
mountPointFilter []string,
fstypeExclude []string,
) ([]*disk.UsageStat, []*disk.PartitionStat, error) {
parts, err := disk.Partitions(true)
2015-05-18 23:01:42 +00:00
if err != nil {
return nil, nil, err
2015-05-18 23:01:42 +00:00
}
// Make a "set" out of the filter slice
mountPointFilterSet := make(map[string]bool)
for _, filter := range mountPointFilter {
mountPointFilterSet[filter] = true
}
fstypeExcludeSet := make(map[string]bool)
for _, filter := range fstypeExclude {
fstypeExcludeSet[filter] = true
}
var usage []*disk.UsageStat
var partitions []*disk.PartitionStat
2015-05-18 23:01:42 +00:00
for _, p := range parts {
if len(mountPointFilter) > 0 {
// If the mount point is not a member of the filter set,
// don't gather info on it.
_, ok := mountPointFilterSet[p.Mountpoint]
if !ok {
continue
}
}
mountpoint := os.Getenv("HOST_MOUNT_PREFIX") + p.Mountpoint
if _, err := os.Stat(mountpoint); err == nil {
du, err := disk.Usage(mountpoint)
if err != nil {
return nil, nil, err
}
du.Path = p.Mountpoint
// If the mount point is a member of the exclude set,
// don't gather info on it.
_, ok := fstypeExcludeSet[p.Fstype]
if ok {
continue
}
du.Fstype = p.Fstype
usage = append(usage, du)
partitions = append(partitions, &p)
2015-05-18 23:01:42 +00:00
}
}
return usage, partitions, nil
2015-05-18 23:01:42 +00:00
}
func (s *systemPS) NetProto() ([]net.ProtoCountersStat, error) {
return net.ProtoCounters(nil)
}
func (s *systemPS) NetIO() ([]net.IOCountersStat, error) {
return net.IOCounters(true)
2015-05-18 23:01:42 +00:00
}
func (s *systemPS) NetConnections() ([]net.ConnectionStat, error) {
return net.Connections("all")
2015-10-05 13:49:01 +00:00
}
func (s *systemPS) DiskIO() (map[string]disk.IOCountersStat, error) {
m, err := disk.IOCounters()
if err == internal.NotImplementedError {
2015-05-18 23:01:42 +00:00
return nil, nil
}
return m, err
}
func (s *systemPS) VMStat() (*mem.VirtualMemoryStat, error) {
return mem.VirtualMemory()
}
func (s *systemPS) SwapStat() (*mem.SwapMemoryStat, error) {
return mem.SwapMemory()
}