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
}