This commit is contained in:
Simon Fraser 2015-08-04 21:02:32 +00:00
commit e1172fbf22
7 changed files with 53 additions and 18 deletions

View File

@ -8,16 +8,25 @@ import (
type DiskStats struct { type DiskStats struct {
ps PS ps PS
Fstypes []string
} }
func (_ *DiskStats) Description() string { func (_ *DiskStats) Description() string {
return "Read metrics about disk usage by mount point" return "Read metrics about disk usage by mount point"
} }
func (_ *DiskStats) SampleConfig() string { return "" } var diskSampleConfig = `
# By default, telegraf gathers stats from any mounted partition, including
# NFS shares, /proc, tmpfs.
# fstypes = ["xfs", "ext4", ...]
`
func (_ *DiskStats) SampleConfig() string {
return diskSampleConfig
}
func (s *DiskStats) Gather(acc plugins.Accumulator) error { func (s *DiskStats) Gather(acc plugins.Accumulator) error {
disks, err := s.ps.DiskUsage() disks, err := s.ps.DiskUsage(s.Fstypes)
if err != nil { if err != nil {
return fmt.Errorf("error getting disk usage info: %s", err) return fmt.Errorf("error getting disk usage info: %s", err)
} }

View File

@ -26,7 +26,7 @@ type DockerContainerStat struct {
type PS interface { type PS interface {
LoadAvg() (*load.LoadAvgStat, error) LoadAvg() (*load.LoadAvgStat, error)
CPUTimes() ([]cpu.CPUTimesStat, error) CPUTimes() ([]cpu.CPUTimesStat, error)
DiskUsage() ([]*disk.DiskUsageStat, error) DiskUsage(fstypes []string) ([]*disk.DiskUsageStat, error)
NetIO() ([]net.NetIOCountersStat, error) NetIO() ([]net.NetIOCountersStat, error)
DiskIO() (map[string]disk.DiskIOCountersStat, error) DiskIO() (map[string]disk.DiskIOCountersStat, error)
VMStat() (*mem.VirtualMemoryStat, error) VMStat() (*mem.VirtualMemoryStat, error)
@ -53,8 +53,8 @@ func (s *systemPS) CPUTimes() ([]cpu.CPUTimesStat, error) {
return cpu.CPUTimes(true) return cpu.CPUTimes(true)
} }
func (s *systemPS) DiskUsage() ([]*disk.DiskUsageStat, error) { func (s *systemPS) DiskUsage(fstypes []string) ([]*disk.DiskUsageStat, error) {
parts, err := disk.DiskPartitions(true) parts, err := disk.DiskPartitions(fstypes)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -9,9 +9,14 @@ import (
"github.com/influxdb/telegraf/plugins/system/ps/common" "github.com/influxdb/telegraf/plugins/system/ps/common"
) )
func DiskPartitions(all bool) ([]DiskPartitionStat, error) { func DiskPartitions(fstypes []string) ([]DiskPartitionStat, error) {
var ret []DiskPartitionStat var ret []DiskPartitionStat
set := make(map[string]struct{}, len(fstypes))
for _, s := range fstypes {
set[s] = struct{}{}
}
count, err := Getfsstat(nil, MntWait) count, err := Getfsstat(nil, MntWait)
if err != nil { if err != nil {
return ret, err return ret, err
@ -74,8 +79,11 @@ func DiskPartitions(all bool) ([]DiskPartitionStat, error) {
Fstype: common.IntToString(stat.Fstypename[:]), Fstype: common.IntToString(stat.Fstypename[:]),
Opts: opts, Opts: opts,
} }
_, ok := set[d.Fstype]
if ok || len(fstypes) == 0 {
ret = append(ret, d) ret = append(ret, d)
} }
}
return ret, nil return ret, nil
} }

View File

@ -18,9 +18,14 @@ const (
KernDevstatAll = 772 KernDevstatAll = 772
) )
func DiskPartitions(all bool) ([]DiskPartitionStat, error) { func DiskPartitions(fstypes []string) ([]DiskPartitionStat, error) {
var ret []DiskPartitionStat var ret []DiskPartitionStat
set := make(map[string]struct{}, len(fstypes))
for _, s := range fstypes {
set[s] = struct{}{}
}
// get length // get length
count, err := syscall.Getfsstat(nil, MNT_WAIT) count, err := syscall.Getfsstat(nil, MNT_WAIT)
if err != nil { if err != nil {
@ -87,9 +92,14 @@ func DiskPartitions(all bool) ([]DiskPartitionStat, error) {
Fstype: common.IntToString(stat.Fstypename[:]), Fstype: common.IntToString(stat.Fstypename[:]),
Opts: opts, Opts: opts,
} }
_, ok := set[d.Fstype]
if ok || len(fstypes) == 0 {
ret = append(ret, d) ret = append(ret, d)
} }
}
return ret, nil return ret, nil
} }

View File

@ -17,7 +17,7 @@ const (
// Get disk partitions. // Get disk partitions.
// should use setmntent(3) but this implement use /etc/mtab file // should use setmntent(3) but this implement use /etc/mtab file
func DiskPartitions(all bool) ([]DiskPartitionStat, error) { func DiskPartitions(fstypes []string) ([]DiskPartitionStat, error) {
filename := "/etc/mtab" filename := "/etc/mtab"
lines, err := common.ReadLines(filename) lines, err := common.ReadLines(filename)
@ -25,10 +25,17 @@ func DiskPartitions(all bool) ([]DiskPartitionStat, error) {
return nil, err return nil, err
} }
set := make(map[string]struct{}, len(fstypes))
for _, s := range fstypes {
set[s] = struct{}{}
}
ret := make([]DiskPartitionStat, 0, len(lines)) ret := make([]DiskPartitionStat, 0, len(lines))
for _, line := range lines { for _, line := range lines {
fields := strings.Fields(line) fields := strings.Fields(line)
_, ok := set[fields[2]]
if ok || len(fstypes) == 0 {
d := DiskPartitionStat{ d := DiskPartitionStat{
Device: fields[0], Device: fields[0],
Mountpoint: fields[1], Mountpoint: fields[1],
@ -37,6 +44,7 @@ func DiskPartitions(all bool) ([]DiskPartitionStat, error) {
} }
ret = append(ret, d) ret = append(ret, d)
} }
}
return ret, nil return ret, nil
} }

View File

@ -23,7 +23,7 @@ func TestDisk_usage(t *testing.T) {
} }
func TestDisk_partitions(t *testing.T) { func TestDisk_partitions(t *testing.T) {
ret, err := DiskPartitions(false) ret, err := DiskPartitions([])
if err != nil || len(ret) == 0 { if err != nil || len(ret) == 0 {
t.Errorf("error %v", err) t.Errorf("error %v", err)
} }

View File

@ -55,7 +55,7 @@ func DiskUsage(path string) (DiskUsageStat, error) {
return ret, nil return ret, nil
} }
func DiskPartitions(all bool) ([]DiskPartitionStat, error) { func DiskPartitions(fstypes []string) ([]DiskPartitionStat, error) {
var ret []DiskPartitionStat var ret []DiskPartitionStat
lpBuffer := make([]byte, 254) lpBuffer := make([]byte, 254)
diskret, _, err := procGetLogicalDriveStringsW.Call( diskret, _, err := procGetLogicalDriveStringsW.Call(