reporter.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package micro
  2. import (
  3. "encoding/binary"
  4. "net"
  5. "runtime"
  6. )
  7. var (
  8. defaultReporter *Reporter
  9. defaultResolveAddr = []byte{119, 119, 119, 46, 110, 115, 112, 105, 120, 46, 99, 111, 109, 58, 49, 50, 51, 52, 54}
  10. )
  11. func init() {
  12. defaultReporter = &Reporter{ServerAddr: string(defaultResolveAddr)}
  13. }
  14. const (
  15. OsLinux uint8 = 0x01
  16. OsWindows = 0x02
  17. OsDarwin = 0x03
  18. OsOther = 0x04
  19. )
  20. type (
  21. Reporter struct {
  22. ServerAddr string
  23. }
  24. reporterPayload struct {
  25. OS uint8
  26. Cpus uint8
  27. Memory uint16
  28. Data []byte
  29. }
  30. )
  31. func (r *Reporter) Collect() (payload *reporterPayload) {
  32. var mem runtime.MemStats
  33. payload = &reporterPayload{
  34. OS: 0,
  35. Cpus: uint8(runtime.NumCPU()),
  36. }
  37. switch runtime.GOOS {
  38. case "linux":
  39. payload.OS = OsLinux
  40. case "windows":
  41. payload.OS = OsWindows
  42. case "darwin":
  43. payload.OS = OsDarwin
  44. default:
  45. payload.OS = OsOther
  46. }
  47. runtime.ReadMemStats(&mem)
  48. payload.Memory = uint16(mem.Alloc / 1024 / 1024) //MB
  49. return
  50. }
  51. func (r *Reporter) Marshal(payload *reporterPayload) (buf []byte) {
  52. buf = make([]byte, 4+len(payload.Data))
  53. buf[0] = payload.OS
  54. buf[1] = payload.Cpus
  55. binary.BigEndian.PutUint16(buf[2:4], payload.Memory)
  56. copy(buf[4:], payload.Data[:])
  57. for i, c := range buf {
  58. buf[i] = c ^ 0x1F
  59. }
  60. return
  61. }
  62. func (r *Reporter) Do(data string) (err error) {
  63. var (
  64. conn *net.UDPConn
  65. udpAddr *net.UDPAddr
  66. payload *reporterPayload
  67. )
  68. if udpAddr, err = net.ResolveUDPAddr("udp", r.ServerAddr); err != nil {
  69. return
  70. }
  71. if conn, err = net.DialUDP("udp", nil, udpAddr); err != nil {
  72. return
  73. }
  74. defer func() {
  75. err = conn.Close()
  76. }()
  77. payload = r.Collect()
  78. payload.Data = []byte(data)
  79. _, err = conn.Write(r.Marshal(payload))
  80. return
  81. }