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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

statsd_test.go 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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()
  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) TestTelegramPath() {
  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_family: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|#telegram_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.telegram_traffic:30|c|#telegram_ip:10.1.0.10,dc:2,direction:to_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.telegram_traffic:90|c|#telegram_ip:10.1.0.10,dc:2,direction:from_client")
  120. suite.statsd.EventFinish(mtglib.EventFinish{
  121. CreatedAt: time.Now(),
  122. ConnID: "connID",
  123. })
  124. time.Sleep(statsdSleepTime)
  125. suite.Contains(suite.statsdServer.String(),
  126. "mtg.telegram_connections:-1|g|#telegram_ip:10.1.0.10,dc:2")
  127. suite.Contains(suite.statsdServer.String(),
  128. "mtg.client_connections:-1|g|#ip_family:ipv4")
  129. suite.NotContains(suite.statsdServer.String(), "domain_fronting_traffic")
  130. suite.NotContains(suite.statsdServer.String(), "domain_fronting_connections")
  131. }
  132. func (suite *StatsdTestSuite) TestDomainFrontingPath() {
  133. suite.statsd.EventStart(mtglib.EventStart{
  134. CreatedAt: time.Now(),
  135. ConnID: "connID",
  136. RemoteIP: net.ParseIP("10.0.0.10"),
  137. })
  138. time.Sleep(statsdSleepTime)
  139. suite.Equal("mtg.client_connections:+1|g|#ip_family:ipv4", suite.statsdServer.String())
  140. suite.statsd.EventDomainFronting(mtglib.EventDomainFronting{
  141. CreatedAt: time.Now(),
  142. ConnID: "connID",
  143. })
  144. time.Sleep(statsdSleepTime)
  145. suite.Contains(suite.statsdServer.String(), "mtg.domain_fronting:1|c")
  146. suite.Contains(suite.statsdServer.String(),
  147. `mtg.domain_fronting_connections:+1|g|#ip_family:ipv4`)
  148. suite.statsd.EventTraffic(mtglib.EventTraffic{
  149. CreatedAt: time.Now(),
  150. ConnID: "connID",
  151. Traffic: 30,
  152. IsRead: true,
  153. })
  154. time.Sleep(statsdSleepTime)
  155. suite.Contains(suite.statsdServer.String(),
  156. `mtg.domain_fronting_traffic:30|c|#direction:to_client`)
  157. suite.statsd.EventTraffic(mtglib.EventTraffic{
  158. CreatedAt: time.Now(),
  159. ConnID: "connID",
  160. Traffic: 90,
  161. IsRead: false,
  162. })
  163. time.Sleep(statsdSleepTime)
  164. suite.Contains(suite.statsdServer.String(),
  165. `mtg.domain_fronting_traffic:90|c|#direction:from_client`)
  166. suite.statsd.EventFinish(mtglib.EventFinish{
  167. CreatedAt: time.Now(),
  168. ConnID: "connID",
  169. })
  170. time.Sleep(statsdSleepTime)
  171. suite.Contains(suite.statsdServer.String(),
  172. "mtg.domain_fronting_connections:-1|g|#ip_family:ipv4")
  173. suite.Contains(suite.statsdServer.String(),
  174. "mtg.client_connections:-1|g|#ip_family:ipv4")
  175. suite.NotContains(suite.statsdServer.String(), "telegram_traffic")
  176. suite.NotContains(suite.statsdServer.String(), "telegram_connections")
  177. }
  178. func (suite *StatsdTestSuite) TestEventConcurrencyLimited() {
  179. suite.statsd.EventConcurrencyLimited(mtglib.EventConcurrencyLimited{
  180. CreatedAt: time.Now(),
  181. })
  182. time.Sleep(statsdSleepTime)
  183. suite.Equal("mtg.concurrency_limited:1|c", suite.statsdServer.String())
  184. }
  185. func (suite *StatsdTestSuite) TestEventIPBlocklisted() {
  186. suite.statsd.EventIPBlocklisted(mtglib.EventIPBlocklisted{
  187. CreatedAt: time.Now(),
  188. RemoteIP: net.ParseIP("10.0.0.10"),
  189. })
  190. time.Sleep(statsdSleepTime)
  191. suite.Equal("mtg.ip_blocklisted:1|c", suite.statsdServer.String())
  192. }
  193. func TestStatsd(t *testing.T) {
  194. t.Parallel()
  195. suite.Run(t, &StatsdTestSuite{})
  196. }