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
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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