in pkg/metrics/collector/netlink_metrics.go [236:272]
func getNamespaces() ([]netns.NsHandle, error) {
files, err := os.ReadDir("/proc")
if err != nil {
return nil, err
}
pids := make([]int, 0)
for _, f := range files {
pid, err := strconv.Atoi(f.Name())
if err != nil {
continue
}
pids = append(pids, pid)
}
nsSet := make(map[uint64]netns.NsHandle)
var s unix.Stat_t
for _, pid := range pids {
ns, err := netns.GetFromPid(pid)
if err != nil {
continue
}
// Check for a new inode.
if err := unix.Fstat(int(ns), &s); err != nil {
continue
}
if _, ok := nsSet[s.Ino]; ok {
ns.Close()
continue
}
nsSet[s.Ino] = ns
}
namespaces := make([]netns.NsHandle, 0)
for _, ns := range nsSet {
namespaces = append(namespaces, ns)
}
return namespaces, nil
}