stats.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package stats
  2. import (
  3. "bufio"
  4. "context"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. )
  9. type InterfaceStats struct {
  10. PacketsReceived int64 // in packets
  11. Link int // link status
  12. PacketsSent int64 // out packets
  13. NumCRCErr int // input CRC errors
  14. NumOverflows int // packet overflows
  15. NumSoftOverflows int // software overflow
  16. NumFramingErr int // framing errors
  17. NumBufferingErr int // buffering errors
  18. NumOutputErr int // output errors
  19. Promiscuous int // number of promiscuous opens
  20. Mbps int // megabits per sec
  21. Addr string
  22. }
  23. func ReadInterfaceStats(ctx context.Context, opts ...Option) (*InterfaceStats, error) {
  24. cfg := newConfig(opts...)
  25. file := filepath.Join(cfg.rootdir, "stats")
  26. f, err := os.Open(file)
  27. if err != nil {
  28. return nil, err
  29. }
  30. defer f.Close()
  31. var stats InterfaceStats
  32. scanner := bufio.NewScanner(f)
  33. for scanner.Scan() {
  34. s := strings.TrimSpace(scanner.Text())
  35. a := strings.SplitN(s, ":", 2)
  36. if len(a) != 2 {
  37. continue
  38. }
  39. var p intParser
  40. v := strings.TrimSpace(a[1])
  41. switch a[0] {
  42. case "in":
  43. stats.PacketsReceived = p.ParseInt64(v, 10)
  44. case "link":
  45. stats.Link = p.ParseInt(v, 10)
  46. case "out":
  47. stats.PacketsSent = p.ParseInt64(v, 10)
  48. case "crc":
  49. stats.NumCRCErr = p.ParseInt(v, 10)
  50. case "overflows":
  51. stats.NumOverflows = p.ParseInt(v, 10)
  52. case "soft overflows":
  53. stats.NumSoftOverflows = p.ParseInt(v, 10)
  54. case "framing errs":
  55. stats.NumFramingErr = p.ParseInt(v, 10)
  56. case "buffer errs":
  57. stats.NumBufferingErr = p.ParseInt(v, 10)
  58. case "output errs":
  59. stats.NumOutputErr = p.ParseInt(v, 10)
  60. case "prom":
  61. stats.Promiscuous = p.ParseInt(v, 10)
  62. case "mbps":
  63. stats.Mbps = p.ParseInt(v, 10)
  64. case "addr":
  65. stats.Addr = v
  66. }
  67. if err := p.Err(); err != nil {
  68. return nil, err
  69. }
  70. }
  71. if err := scanner.Err(); err != nil {
  72. return nil, err
  73. }
  74. return &stats, nil
  75. }
  76. type TCPStats struct {
  77. MaxConn int
  78. MaxSegment int
  79. ActiveOpens int
  80. PassiveOpens int
  81. EstablishedResets int
  82. CurrentEstablished int
  83. }