From c095876442dadc640d20fab8a1cce2357eed5543 Mon Sep 17 00:00:00 2001 From: Daniel Nelson Date: Fri, 1 Dec 2017 11:21:39 -0800 Subject: [PATCH] Fix HOST_MOUNT_PREFIX in docker with disk input (#3529) (cherry picked from commit 7f66863b8731f08c963726455d53ab18e4427b44) --- plugins/inputs/system/DISK_README.md | 6 ++++-- plugins/inputs/system/disk_test.go | 2 -- plugins/inputs/system/ps.go | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/plugins/inputs/system/DISK_README.md b/plugins/inputs/system/DISK_README.md index 30e54f29c..2cacdd196 100644 --- a/plugins/inputs/system/DISK_README.md +++ b/plugins/inputs/system/DISK_README.md @@ -20,9 +20,11 @@ Additionally, the behavior of resolving the `mount_points` can be configured by When present, this variable is prepended to the mountpoints discovered by the plugin before retrieving stats. The prefix is stripped from the reported `path` in the measurement. This settings is useful when running `telegraf` inside a docker container to report host machine metrics. -In this case, the host's root volume should be mounted into the container and the `HOST_MOUNT_PREFIX` and `HOST_ETC` environment variables set. +In this case, the host's root volume should be mounted into the container and the `HOST_MOUNT_PREFIX` and `HOST_PROC` environment variables set. -`docker run -v /:/hostfs:ro -e HOST_MOUNT_PREFIX=/hostfs -e HOST_ETC=/hostfs/etc telegraf-docker` +``` +docker run -v /:/hostfs:ro -e HOST_MOUNT_PREFIX=/hostfs -e HOST_PROC=/hostfs/proc telegraf +``` ### Measurements & Fields: diff --git a/plugins/inputs/system/disk_test.go b/plugins/inputs/system/disk_test.go index 5ba4d041f..3d44137cd 100644 --- a/plugins/inputs/system/disk_test.go +++ b/plugins/inputs/system/disk_test.go @@ -62,8 +62,6 @@ func TestDiskUsage(t *testing.T) { mps.On("Partitions", true).Return(psAll, nil) mps.On("OSGetenv", "HOST_MOUNT_PREFIX").Return("") - mps.On("OSStat", "/").Return(MockFileInfo{}, nil) - mps.On("OSStat", "/home").Return(MockFileInfo{}, nil) mps.On("PSDiskUsage", "/").Return(&duAll[0], nil) mps.On("PSDiskUsage", "/home").Return(&duAll[1], nil) diff --git a/plugins/inputs/system/ps.go b/plugins/inputs/system/ps.go index 979a3b164..93309d6ba 100644 --- a/plugins/inputs/system/ps.go +++ b/plugins/inputs/system/ps.go @@ -2,6 +2,7 @@ package system import ( "os" + "strings" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/internal" @@ -84,9 +85,14 @@ func (s *systemPS) DiskUsage( for _, filter := range fstypeExclude { fstypeExcludeSet[filter] = true } + paths := make(map[string]bool) + for _, part := range parts { + paths[part.Mountpoint] = true + } var usage []*disk.UsageStat var partitions []*disk.PartitionStat + hostMountPrefix := s.OSGetenv("HOST_MOUNT_PREFIX") for i := range parts { p := parts[i] @@ -105,15 +111,20 @@ func (s *systemPS) DiskUsage( continue } - mountpoint := s.OSGetenv("HOST_MOUNT_PREFIX") + p.Mountpoint - if _, err := s.OSStat(mountpoint); err != nil { + // If there's a host mount prefix, exclude any paths which conflict + // with the prefix. + if len(hostMountPrefix) > 0 && + !strings.HasPrefix(p.Mountpoint, hostMountPrefix) && + paths[hostMountPrefix+p.Mountpoint] { continue } - du, err := s.PSDiskUsage(mountpoint) + + du, err := s.PSDiskUsage(p.Mountpoint) if err != nil { continue } - du.Path = p.Mountpoint + + du.Path = strings.TrimPrefix(p.Mountpoint, hostMountPrefix) du.Fstype = p.Fstype usage = append(usage, du) partitions = append(partitions, &p)