From a4591205166eff66b64b4ea273383231eafa6a4a Mon Sep 17 00:00:00 2001 From: Ethan Mosbaugh Date: Wed, 24 Feb 2021 23:37:56 +0000 Subject: [PATCH] diskUsage host collector traverse file tree for directory exists --- pkg/collect/host_disk_usage.go | 29 +++++++++++++++++-- .../host_filesystem_performance_linux.go | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pkg/collect/host_disk_usage.go b/pkg/collect/host_disk_usage.go index 2b751e26..30162891 100644 --- a/pkg/collect/host_disk_usage.go +++ b/pkg/collect/host_disk_usage.go @@ -3,6 +3,8 @@ package collect import ( "encoding/json" "fmt" + "os" + "path/filepath" "github.com/pkg/errors" "github.com/shirou/gopsutil/disk" @@ -20,9 +22,14 @@ func HostDiskUsage(c *HostCollector) (map[string][]byte, error) { return result, nil } - du, err := disk.Usage(c.Collect.DiskUsage.Path) + pathExists, err := traverseFiletreeDirExists(c.Collect.DiskUsage.Path) if err != nil { - return result, errors.Wrapf(err, "collect disk usage for %s", c.Collect.DiskUsage.Path) + return result, errors.Wrap(err, "traverse file tree") + } + + du, err := disk.Usage(pathExists) + if err != nil { + return result, errors.Wrapf(err, "collect disk usage for %s", pathExists) } diskSpaceInfo := DiskUsageInfo{ TotalBytes: du.Total, @@ -41,3 +48,21 @@ func HostDiskUsage(c *HostCollector) (map[string][]byte, error) { func HostDiskUsageKey(name string) string { return fmt.Sprintf("diskUsage/%s.json", name) } + +func traverseFiletreeDirExists(filename string) (string, error) { + filename = filepath.Clean(filename) + for i := 0; i < 50; i++ { + _, err := os.Stat(filename) + if err == nil { + return filename, nil + } else if os.IsNotExist(err) { + filename = filepath.Dir(filename) + if filename == "/" { + return filename, nil + } + } else { + return "", err + } + } + return "", errors.New("max recursion exceeded") +} diff --git a/pkg/collect/host_filesystem_performance_linux.go b/pkg/collect/host_filesystem_performance_linux.go index ec488a78..0303fa43 100644 --- a/pkg/collect/host_filesystem_performance_linux.go +++ b/pkg/collect/host_filesystem_performance_linux.go @@ -55,6 +55,7 @@ func HostFilesystemPerformance(c *HostCollector) (map[string][]byte, error) { if c.Collect.FilesystemPerformance.Directory == "" { return nil, errors.New("Directory is required to collect filesystem performance info") } + // TODO: clean up this directory if its created if err := os.MkdirAll(c.Collect.FilesystemPerformance.Directory, 0700); err != nil { return nil, errors.Wrapf(err, "failed to mkdir %q", c.Collect.FilesystemPerformance.Directory) }