func getNamespaces()

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
}