init.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package ebpftracer
  2. import (
  3. "strings"
  4. "github.com/coroot/coroot-node-agent/proc"
  5. klog "github.com/sirupsen/logrus"
  6. )
  7. type file struct {
  8. pid uint32
  9. fd uint64
  10. }
  11. type sock struct {
  12. pid uint32
  13. fd uint64
  14. proc.Sock
  15. }
  16. func readFds(pids []uint32) (files []file, socks []sock) {
  17. nss := map[string]map[string]sock{}
  18. for _, pid := range pids {
  19. ns, err := proc.GetNetNs(pid)
  20. if err != nil {
  21. klog.Warningf("failed to get net ns for %d: %s", pid, err)
  22. continue
  23. }
  24. nsId := ns.UniqueId()
  25. sockets, ok := nss[nsId]
  26. _ = ns.Close()
  27. if !ok {
  28. if ss, err := proc.GetSockets(pid); err != nil {
  29. klog.Warningf("failed to get sockets for %d: %s", pid, err)
  30. } else {
  31. sockets = map[string]sock{}
  32. nss[nsId] = sockets
  33. for _, s := range ss {
  34. sockets[s.Inode] = sock{Sock: s}
  35. }
  36. }
  37. }
  38. fds, err := proc.ReadFds(pid)
  39. if err != nil {
  40. klog.Warningf("failed to read fds for %d: %s", pid, err)
  41. continue
  42. }
  43. for _, fd := range fds {
  44. switch {
  45. case fd.SocketInode != "":
  46. if s, ok := sockets[fd.SocketInode]; ok {
  47. s.fd = fd.Fd
  48. s.pid = pid
  49. socks = append(socks, s)
  50. }
  51. case strings.HasPrefix(fd.Dest, "/"):
  52. files = append(files, file{pid: pid, fd: fd.Fd})
  53. }
  54. }
  55. }
  56. return
  57. }