| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package ebpftracer
- import (
- "github.com/coroot/coroot-node-agent/proc"
- "k8s.io/klog/v2"
- "os"
- "path"
- "strconv"
- "strings"
- )
- type fd struct {
- pid uint32
- fd uint32
- }
- type sock struct {
- pid uint32
- proc.Sock
- }
- func readFds(pids []uint32) (fds []fd, socks []sock) {
- nss := map[string]map[string]sock{}
- for _, pid := range pids {
- ns, err := proc.GetNetNs(pid)
- if err != nil {
- continue
- }
- nsId := ns.UniqueId()
- sockets, ok := nss[nsId]
- _ = ns.Close()
- if !ok {
- sockets = map[string]sock{}
- nss[nsId] = sockets
- if ss, err := proc.GetSockets(pid); err != nil {
- klog.Warningln(err)
- } else {
- for _, s := range ss {
- sockets[s.Inode] = sock{Sock: s}
- }
- }
- }
- fdDir := proc.Path(pid, "fd")
- entries, err := os.ReadDir(fdDir)
- if err != nil {
- continue
- }
- for _, entry := range entries {
- dest, err := os.Readlink(path.Join(fdDir, entry.Name()))
- if err != nil {
- continue
- }
- switch {
- case strings.HasPrefix(dest, "socket:[") && strings.HasSuffix(dest, "]"):
- inode := dest[len("socket:[") : len(dest)-1]
- if s, ok := sockets[inode]; ok {
- s.pid = pid
- socks = append(socks, s)
- }
- default:
- i, err := strconv.Atoi(entry.Name())
- if err == nil {
- fds = append(fds, fd{pid: pid, fd: uint32(i)})
- }
- }
- }
- }
- return
- }
|