2015-05-18 23:01:42 +00:00
|
|
|
package system
|
|
|
|
|
|
|
|
import (
|
2015-09-17 20:02:15 +00:00
|
|
|
"os"
|
2015-05-18 23:01:42 +00:00
|
|
|
|
2016-01-27 21:21:36 +00:00
|
|
|
"github.com/influxdata/telegraf"
|
2016-01-20 18:57:35 +00:00
|
|
|
"github.com/influxdata/telegraf/internal"
|
2015-11-10 21:40:39 +00:00
|
|
|
|
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 {
|
2016-05-19 14:05:08 +00:00
|
|
|
CPUTimes(perCPU, totalCPU bool) ([]cpu.TimesStat, error)
|
|
|
|
DiskUsage(mountPointFilter []string, fstypeExclude []string) ([]*disk.UsageStat, 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)
|
2016-05-19 14:05:08 +00:00
|
|
|
NetConnections() ([]net.ConnectionStat, error)
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
|
2016-01-27 21:21:36 +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 {
|
|
|
|
acc.Add(name, val, tags)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-20 23:21:19 +00:00
|
|
|
type systemPS struct{}
|
2015-05-18 23:01:42 +00:00
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
func (s *systemPS) CPUTimes(perCPU, totalCPU bool) ([]cpu.TimesStat, error) {
|
|
|
|
var cpuTimes []cpu.TimesStat
|
2015-08-13 17:27:24 +00:00
|
|
|
if perCPU {
|
2016-05-19 14:05:08 +00:00
|
|
|
if perCPUTimes, err := cpu.Times(true); err == nil {
|
2015-08-13 17:27:24 +00:00
|
|
|
cpuTimes = append(cpuTimes, perCPUTimes...)
|
|
|
|
} else {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if totalCPU {
|
2016-05-19 14:05:08 +00:00
|
|
|
if totalCPUTimes, err := cpu.Times(false); err == nil {
|
2015-08-13 17:27:24 +00:00
|
|
|
cpuTimes = append(cpuTimes, totalCPUTimes...)
|
|
|
|
} else {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return cpuTimes, nil
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
|
2016-01-20 17:42:55 +00:00
|
|
|
func (s *systemPS) DiskUsage(
|
|
|
|
mountPointFilter []string,
|
2016-02-22 17:29:10 +00:00
|
|
|
fstypeExclude []string,
|
2016-05-19 14:05:08 +00:00
|
|
|
) ([]*disk.UsageStat, error) {
|
|
|
|
parts, err := disk.Partitions(true)
|
2015-05-18 23:01:42 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2016-01-20 17:42:55 +00:00
|
|
|
// Make a "set" out of the filter slice
|
2016-02-22 17:29:10 +00:00
|
|
|
mountPointFilterSet := make(map[string]bool)
|
2016-01-20 17:42:55 +00:00
|
|
|
for _, filter := range mountPointFilter {
|
2016-02-22 17:29:10 +00:00
|
|
|
mountPointFilterSet[filter] = true
|
|
|
|
}
|
|
|
|
fstypeExcludeSet := make(map[string]bool)
|
|
|
|
for _, filter := range fstypeExclude {
|
|
|
|
fstypeExcludeSet[filter] = true
|
2016-01-20 17:42:55 +00:00
|
|
|
}
|
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
var usage []*disk.UsageStat
|
2015-05-18 23:01:42 +00:00
|
|
|
|
|
|
|
for _, p := range parts {
|
2016-01-20 17:42:55 +00:00
|
|
|
if len(mountPointFilter) > 0 {
|
|
|
|
// If the mount point is not a member of the filter set,
|
|
|
|
// don't gather info on it.
|
2016-02-22 17:29:10 +00:00
|
|
|
_, ok := mountPointFilterSet[p.Mountpoint]
|
2016-01-20 17:42:55 +00:00
|
|
|
if !ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
2016-04-28 19:24:09 +00:00
|
|
|
mountpoint := os.Getenv("HOST_MOUNT_PREFIX") + p.Mountpoint
|
|
|
|
if _, err := os.Stat(mountpoint); err == nil {
|
2016-05-19 14:05:08 +00:00
|
|
|
du, err := disk.Usage(mountpoint)
|
2015-09-17 20:02:15 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2016-05-31 15:58:41 +00:00
|
|
|
du.Path = p.Mountpoint
|
2016-02-22 17:29:10 +00:00
|
|
|
// If the mount point is a member of the exclude set,
|
|
|
|
// don't gather info on it.
|
|
|
|
_, ok := fstypeExcludeSet[p.Fstype]
|
|
|
|
if ok {
|
|
|
|
continue
|
|
|
|
}
|
2015-09-17 20:02:15 +00:00
|
|
|
du.Fstype = p.Fstype
|
|
|
|
usage = append(usage, du)
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return usage, nil
|
|
|
|
}
|
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
func (s *systemPS) NetProto() ([]net.ProtoCountersStat, error) {
|
|
|
|
return net.ProtoCounters(nil)
|
2015-11-19 21:58:21 +00:00
|
|
|
}
|
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
func (s *systemPS) NetIO() ([]net.IOCountersStat, error) {
|
|
|
|
return net.IOCounters(true)
|
2015-05-18 23:01:42 +00:00
|
|
|
}
|
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
func (s *systemPS) NetConnections() ([]net.ConnectionStat, error) {
|
|
|
|
return net.Connections("all")
|
2015-10-05 13:49:01 +00:00
|
|
|
}
|
|
|
|
|
2016-05-19 14:05:08 +00:00
|
|
|
func (s *systemPS) DiskIO() (map[string]disk.IOCountersStat, error) {
|
|
|
|
m, err := disk.IOCounters()
|
2015-11-10 21:40:39 +00:00
|
|
|
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()
|
|
|
|
}
|