Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

statsd_test.go 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package stats_test
  2. import (
  3. "bytes"
  4. "net"
  5. "strings"
  6. "sync"
  7. "testing"
  8. "time"
  9. "github.com/9seconds/mtg/v2/events"
  10. "github.com/9seconds/mtg/v2/logger"
  11. "github.com/9seconds/mtg/v2/mtglib"
  12. "github.com/9seconds/mtg/v2/stats"
  13. statsd "github.com/smira/go-statsd"
  14. "github.com/stretchr/testify/suite"
  15. )
  16. const statsdSleepTime = 3 * statsd.DefaultFlushInterval
  17. type statsdFakeServer struct {
  18. conn *net.UDPConn
  19. buf *bytes.Buffer
  20. mutex sync.Mutex
  21. }
  22. func (s *statsdFakeServer) Addr() string {
  23. return s.conn.LocalAddr().String()
  24. }
  25. func (s *statsdFakeServer) Close() error {
  26. if s.conn != nil {
  27. return s.conn.Close()
  28. }
  29. return nil
  30. }
  31. func (s *statsdFakeServer) String() string {
  32. s.mutex.Lock()
  33. defer s.mutex.Unlock()
  34. return strings.TrimSpace(s.buf.String())
  35. }
  36. func statsdNewFakeServer() *statsdFakeServer {
  37. conn, err := net.ListenUDP("udp", &net.UDPAddr{
  38. IP: net.ParseIP("127.0.0.1"),
  39. Port: 0,
  40. })
  41. if err != nil {
  42. panic(err)
  43. }
  44. rv := &statsdFakeServer{
  45. conn: conn,
  46. buf: &bytes.Buffer{},
  47. }
  48. go func() {
  49. currentBuffer := make([]byte, 4096)
  50. for {
  51. n, _, err := conn.ReadFromUDP(currentBuffer)
  52. if n > 0 {
  53. rv.mutex.Lock()
  54. rv.buf.Write(currentBuffer[:n])
  55. rv.mutex.Unlock()
  56. }
  57. if err != nil {
  58. return
  59. }
  60. }
  61. }()
  62. return rv
  63. }
  64. type StatsdTestSuite struct {
  65. suite.Suite
  66. statsdServer *statsdFakeServer
  67. factory stats.StatsdFactory
  68. statsd events.Observer
  69. }
  70. func (suite *StatsdTestSuite) SetupTest() {
  71. suite.statsdServer = statsdNewFakeServer()
  72. factory, err := stats.NewStatsd(suite.statsdServer.Addr(),
  73. logger.NewNoopLogger(), "mtg.", "datadog")
  74. if err != nil {
  75. panic(err)
  76. }
  77. suite.factory = factory
  78. suite.statsd = suite.factory.Make()
  79. }
  80. func (suite *StatsdTestSuite) TearDownTest() {
  81. suite.statsd.Shutdown()
  82. suite.factory.Close()
  83. suite.statsdServer.Close()
  84. }
  85. func (suite *StatsdTestSuite) TestEventStartFinish() {
  86. suite.statsd.EventStart(mtglib.EventStart{
  87. CreatedAt: time.Now(),
  88. ConnID: "connID",
  89. RemoteIP: net.ParseIP("10.0.0.10"),
  90. })
  91. time.Sleep(statsdSleepTime)
  92. suite.Equal("mtg.client_connections:+1|g|#ip_type:ipv4", suite.statsdServer.String())
  93. suite.statsd.EventConnectedToDC(mtglib.EventConnectedToDC{
  94. CreatedAt: time.Now(),
  95. ConnID: "connID",
  96. RemoteIP: net.ParseIP("10.1.0.10"),
  97. DC: 2,
  98. })
  99. time.Sleep(statsdSleepTime)
  100. suite.Contains(suite.statsdServer.String(),
  101. "mtg.telegram_connections:+1|g|#ip_type:ipv4,ip:10.1.0.10,dc:2")
  102. suite.statsd.EventTraffic(mtglib.EventTraffic{
  103. CreatedAt: time.Now(),
  104. ConnID: "connID",
  105. Traffic: 30,
  106. IsRead: true,
  107. })
  108. time.Sleep(statsdSleepTime)
  109. suite.Contains(suite.statsdServer.String(),
  110. "mtg.traffic:30|c|#ip_type:ipv4,ip:10.1.0.10,dc:2,direction:client")
  111. suite.statsd.EventTraffic(mtglib.EventTraffic{
  112. CreatedAt: time.Now(),
  113. ConnID: "connID",
  114. Traffic: 90,
  115. IsRead: false,
  116. })
  117. time.Sleep(statsdSleepTime)
  118. suite.Contains(suite.statsdServer.String(),
  119. "mtg.traffic:90|c|#ip_type:ipv4,ip:10.1.0.10,dc:2,direction:telegram")
  120. suite.statsd.EventFinish(mtglib.EventFinish{
  121. CreatedAt: time.Now(),
  122. ConnID: "connID",
  123. })
  124. time.Sleep(statsdSleepTime)
  125. suite.Contains(suite.statsdServer.String(), "mtg.session_duration")
  126. suite.Contains(suite.statsdServer.String(),
  127. "mtg.telegram_connections:-1|g|#ip_type:ipv4,ip:10.1.0.10,dc:2")
  128. suite.Contains(suite.statsdServer.String(),
  129. "mtg.client_connections:-1|g|#ip_type:ipv4")
  130. }
  131. func (suite *StatsdTestSuite) TestEventConcurrencyLimited() {
  132. suite.statsd.EventConcurrencyLimited(mtglib.EventConcurrencyLimited{
  133. CreatedAt: time.Now(),
  134. })
  135. time.Sleep(statsdSleepTime)
  136. suite.Equal("mtg.concurrency_limited:1|c", suite.statsdServer.String())
  137. }
  138. func (suite *StatsdTestSuite) TestEventIPBlocklisted() {
  139. suite.statsd.EventIPBlocklisted(mtglib.EventIPBlocklisted{
  140. CreatedAt: time.Now(),
  141. RemoteIP: net.ParseIP("10.0.0.10"),
  142. })
  143. time.Sleep(statsdSleepTime)
  144. suite.Equal("mtg.ip_blocklisted:1|c|#ip_type:ipv4", suite.statsdServer.String())
  145. }
  146. func TestStatsd(t *testing.T) {
  147. t.Parallel()
  148. suite.Run(t, &StatsdTestSuite{})
  149. }