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 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 = 4 * 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() //nolint: wrapcheck
  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() //nolint: errcheck
  83. suite.statsdServer.Close() //nolint: errcheck
  84. }
  85. func (suite *StatsdTestSuite) TestTelegramPath() {
  86. suite.statsd.EventStart(
  87. mtglib.NewEventStart("connID", net.ParseIP("10.0.0.10")))
  88. time.Sleep(statsdSleepTime)
  89. suite.Equal("mtg.client_connections:+1|g|#ip_family:ipv4", suite.statsdServer.String())
  90. suite.statsd.EventConnectedToDC(
  91. mtglib.NewEventConnectedToDC("connID", net.ParseIP("10.1.0.10"), 2))
  92. time.Sleep(statsdSleepTime)
  93. suite.Contains(suite.statsdServer.String(),
  94. "mtg.telegram_connections:+1|g|#telegram_ip:10.1.0.10,dc:2")
  95. suite.statsd.EventTraffic(
  96. mtglib.NewEventTraffic("connID", 30, true))
  97. time.Sleep(statsdSleepTime)
  98. suite.Contains(suite.statsdServer.String(),
  99. "mtg.telegram_traffic:30|c|#telegram_ip:10.1.0.10,dc:2,direction:to_client")
  100. suite.statsd.EventTraffic(
  101. mtglib.NewEventTraffic("connID", 90, false))
  102. time.Sleep(statsdSleepTime)
  103. suite.Contains(suite.statsdServer.String(),
  104. "mtg.telegram_traffic:90|c|#telegram_ip:10.1.0.10,dc:2,direction:from_client")
  105. suite.statsd.EventFinish(mtglib.NewEventFinish("connID"))
  106. time.Sleep(statsdSleepTime)
  107. suite.Contains(suite.statsdServer.String(),
  108. "mtg.telegram_connections:-1|g|#telegram_ip:10.1.0.10,dc:2")
  109. suite.Contains(suite.statsdServer.String(),
  110. "mtg.client_connections:-1|g|#ip_family:ipv4")
  111. suite.NotContains(suite.statsdServer.String(), "domain_fronting_traffic")
  112. suite.NotContains(suite.statsdServer.String(), "domain_fronting_connections")
  113. }
  114. func (suite *StatsdTestSuite) TestDomainFrontingPath() {
  115. suite.statsd.EventStart(
  116. mtglib.NewEventStart("connID", net.ParseIP("10.0.0.10")))
  117. time.Sleep(statsdSleepTime)
  118. suite.Equal("mtg.client_connections:+1|g|#ip_family:ipv4", suite.statsdServer.String())
  119. suite.statsd.EventDomainFronting(mtglib.NewEventDomainFronting("connID"))
  120. time.Sleep(statsdSleepTime)
  121. suite.Contains(suite.statsdServer.String(), "mtg.domain_fronting:1|c")
  122. suite.Contains(suite.statsdServer.String(),
  123. `mtg.domain_fronting_connections:+1|g|#ip_family:ipv4`)
  124. suite.statsd.EventTraffic(
  125. mtglib.NewEventTraffic("connID", 30, true))
  126. time.Sleep(statsdSleepTime)
  127. suite.Contains(suite.statsdServer.String(),
  128. `mtg.domain_fronting_traffic:30|c|#direction:to_client`)
  129. suite.statsd.EventTraffic(
  130. mtglib.NewEventTraffic("connID", 90, false))
  131. time.Sleep(statsdSleepTime)
  132. suite.Contains(suite.statsdServer.String(),
  133. `mtg.domain_fronting_traffic:90|c|#direction:from_client`)
  134. suite.statsd.EventFinish(mtglib.NewEventFinish("connID"))
  135. time.Sleep(statsdSleepTime)
  136. suite.Contains(suite.statsdServer.String(),
  137. "mtg.domain_fronting_connections:-1|g|#ip_family:ipv4")
  138. suite.Contains(suite.statsdServer.String(),
  139. "mtg.client_connections:-1|g|#ip_family:ipv4")
  140. suite.NotContains(suite.statsdServer.String(), "telegram_traffic")
  141. suite.NotContains(suite.statsdServer.String(), "telegram_connections")
  142. }
  143. func (suite *StatsdTestSuite) TestEventConcurrencyLimited() {
  144. suite.statsd.EventConcurrencyLimited(mtglib.NewEventConcurrencyLimited())
  145. time.Sleep(statsdSleepTime)
  146. suite.Equal("mtg.concurrency_limited:1|c", suite.statsdServer.String())
  147. }
  148. func (suite *StatsdTestSuite) TestEventIPBlocklisted() {
  149. suite.statsd.EventIPBlocklisted(
  150. mtglib.NewEventIPBlocklisted(net.ParseIP("10.0.0.10")))
  151. time.Sleep(statsdSleepTime)
  152. suite.Equal("mtg.ip_blocklisted:1|c|#ip_list:blocklist", suite.statsdServer.String())
  153. }
  154. func (suite *StatsdTestSuite) TestEventIPAllowlisted() {
  155. suite.statsd.EventIPBlocklisted(
  156. mtglib.NewEventIPAllowlisted(net.ParseIP("10.0.0.10")))
  157. time.Sleep(statsdSleepTime)
  158. suite.Equal("mtg.ip_blocklisted:1|c|#ip_list:allowlist", suite.statsdServer.String())
  159. }
  160. func (suite *StatsdTestSuite) TestEventReplayAttack() {
  161. suite.statsd.EventReplayAttack(mtglib.NewEventReplayAttack("connID"))
  162. time.Sleep(statsdSleepTime)
  163. suite.Equal("mtg.replay_attacks:1|c", suite.statsdServer.String())
  164. }
  165. func (suite *StatsdTestSuite) TestEventIPListSizeAllowlist() {
  166. suite.statsd.EventIPListSize(mtglib.NewEventIPListSize(10, false))
  167. time.Sleep(statsdSleepTime)
  168. suite.Contains(suite.statsdServer.String(), "mtg.iplist_size:10|g")
  169. suite.Contains(suite.statsdServer.String(), "allowlist")
  170. }
  171. func (suite *StatsdTestSuite) TestEventIPListSizeBlocklist() {
  172. suite.statsd.EventIPListSize(mtglib.NewEventIPListSize(10, true))
  173. time.Sleep(statsdSleepTime)
  174. suite.Contains(suite.statsdServer.String(), "mtg.iplist_size:10|g")
  175. suite.Contains(suite.statsdServer.String(), "blocklist")
  176. }
  177. func TestStatsd(t *testing.T) {
  178. t.Parallel()
  179. suite.Run(t, &StatsdTestSuite{})
  180. }