diff --git a/pkg/exporter/nettop/netns.go b/pkg/exporter/nettop/netns.go index 29a9aebb..c1d7e86d 100644 --- a/pkg/exporter/nettop/netns.go +++ b/pkg/exporter/nettop/netns.go @@ -14,31 +14,24 @@ func getNsInumByPid(pid int) (int, error) { } defer d.Close() - names, err := d.Readdirnames(-1) + target, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/net", pid)) if err != nil { - return 0, fmt.Errorf("failed to read contents of ns dir: %w", err) + return 0, err } - for _, name := range names { - target, err := os.Readlink(fmt.Sprintf("/proc/%d/ns/%s", pid, name)) - if err != nil { - return 0, err - } + fields := strings.SplitN(target, ":", 2) - fields := strings.SplitN(target, ":", 2) - if len(fields) != 2 { - return 0, fmt.Errorf("failed to parse namespace type and inode from %q", target) - } - - if fields[0] == "net" { - inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) - if err != nil { - return 0, fmt.Errorf("failed to parse inode from %q: %w", fields[1], err) - } + if len(fields) != 2 { + return 0, fmt.Errorf("failed to parse namespace type and inode from %q", target) + } - return int(inode), nil + if fields[0] == "net" { + inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) + if err != nil { + return 0, fmt.Errorf("failed to parse inode from %q: %w", fields[1], err) } + return int(inode), nil } return 0, fmt.Errorf("net namespace of %d not found", pid)