net.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package node
  2. import (
  3. "github.com/coroot/coroot-node-agent/proc"
  4. "github.com/vishvananda/netlink"
  5. "golang.org/x/sys/unix"
  6. "regexp"
  7. )
  8. var includeNetDev = regexp.MustCompile(`^(enp\d+s\d+(f\d+)?|eth\d+|eno\d+|ens\d+)`)
  9. type NetDeviceInfo struct {
  10. Name string
  11. Up float64
  12. Addresses []string
  13. RxBytes float64
  14. TxBytes float64
  15. RxPackets float64
  16. TxPackets float64
  17. }
  18. func netDevices() ([]NetDeviceInfo, error) {
  19. hostNs, err := proc.GetHostNetNs()
  20. if err != nil {
  21. return nil, err
  22. }
  23. defer hostNs.Close()
  24. h, err := netlink.NewHandleAt(hostNs)
  25. if err != nil {
  26. return nil, err
  27. }
  28. defer h.Delete()
  29. links, err := h.LinkList()
  30. if err != nil {
  31. return nil, err
  32. }
  33. var res []NetDeviceInfo
  34. for _, link := range links {
  35. attrs := link.Attrs()
  36. if !includeNetDev.MatchString(attrs.Name) {
  37. continue
  38. }
  39. info := NetDeviceInfo{
  40. Name: attrs.Name,
  41. RxBytes: float64(attrs.Statistics.RxBytes),
  42. TxBytes: float64(attrs.Statistics.TxBytes),
  43. RxPackets: float64(attrs.Statistics.RxPackets),
  44. TxPackets: float64(attrs.Statistics.TxPackets),
  45. }
  46. if attrs.OperState == netlink.OperUp {
  47. info.Up = 1
  48. }
  49. addrs, err := h.AddrList(link, unix.AF_UNSPEC)
  50. if err != nil {
  51. return nil, err
  52. }
  53. for _, addr := range addrs {
  54. ip := addr.IP
  55. if ip.IsLinkLocalUnicast() || ip.IsMulticast() || ip.IsLinkLocalMulticast() {
  56. continue
  57. }
  58. info.Addresses = append(info.Addresses, addr.IP.String())
  59. }
  60. res = append(res, info)
  61. }
  62. return res, nil
  63. }