func getSnapshots()

in pkg/metrics/collector/netlink_metrics.go [274:330]


func getSnapshots(req *nl.NetlinkRequest) ([]*parser.Snapshot, error) {
	var snps []*parser.Snapshot
	sockType := syscall.NETLINK_INET_DIAG
	namespaces, err := getNamespaces()
	if err != nil {
		return nil, err
	}
	basens, err := netns.Get()
	if err != nil {
		return nil, err
	}
	for _, curNs := range namespaces {
		defer curNs.Close()
		s, err := nl.SubscribeAt(curNs, basens, sockType)
		if err != nil {
			glog.Infof("Could not subscribe to netlink namespaces %q", curNs)
			continue
		}
		defer s.Close()
		if err := s.Send(req); err != nil { //nolint:govet
			return nil, err
		}
		pid, err := s.GetPid()
		if err != nil {
			return nil, err
		}
		// Adapted this from req.Execute in nl_linux.go
	snapshotLoop:
		for {
			msgs, _, err := s.Receive()
			if err != nil {
				return nil, err
			}
			// TODO avoid the copy.
			for i := range msgs {
				m, shouldContinue, err := inetdiag.ProcessMessage(&msgs[i], req.Seq, pid)
				if err != nil {
					return nil, err
				}
				if m != nil {
					cur, err := parser.MakeSnapShot(m, true)

					if cur == nil || err != nil {
						continue
					}
					snps = append(snps, cur)
				}
				if !shouldContinue {
					break snapshotLoop
				}
			}

		}
	}

	return snps, nil
}