From 7f66863b8731f08c963726455d53ab18e4427b44 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) --- docs/FAQ.md | 19 +++++++++++++++++++ plugins/inputs/system/DISK_README.md | 6 ++++-- plugins/inputs/system/disk_test.go | 2 -- plugins/inputs/system/ps.go | 19 +++++++++++++++---- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 58396cbcd..1d1c490aa 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -1,5 +1,24 @@ # Frequently Asked Questions +### Q: How can I monitor the Docker Engine Host from within a container? + +You will need to setup several volume mounts as well as some environment +variables: +``` +docker run --name telegraf + -v /:/hostfs:ro + -v /etc:/hostfs/etc:ro + -v /proc:/hostfs/proc:ro + -v /sys:/hostfs/sys:ro + -v /var/run/utmp:/var/run/utmp:ro + -e HOST_ETC=/hostfs/etc + -e HOST_PROC=/hostfs/proc + -e HOST_SYS=/hostfs/sys + -e HOST_MOUNT_PREFIX=/hostfs + telegraf +``` + + ### Q: Why do I get a "no such host" error resolving hostnames that other programs can resolve? diff --git a/plugins/inputs/system/DISK_README.md b/plugins/inputs/system/DISK_README.md index 31eff937d..a09e818ed 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 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 28a433fe9..67494d712 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 d41e6bddf..02239e6e6 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,6 +85,10 @@ func (s *systemPS) DiskUsage( for _, filter := range fstypeExclude { fstypeExcludeSet[filter] = true } + paths := make(map[string]bool) + for _, part := range parts { + paths[part.Mountpoint] = true + } // Autofs mounts indicate a potential mount, the partition will also be // listed with the actual filesystem when mounted. Ignore the autofs @@ -92,6 +97,7 @@ func (s *systemPS) DiskUsage( var usage []*disk.UsageStat var partitions []*disk.PartitionStat + hostMountPrefix := s.OSGetenv("HOST_MOUNT_PREFIX") for i := range parts { p := parts[i] @@ -110,15 +116,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)