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 символов.

prometheus_test.go 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package stats_test
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. "net/http"
  7. "testing"
  8. "time"
  9. "github.com/9seconds/mtg/v2/events"
  10. "github.com/9seconds/mtg/v2/mtglib"
  11. "github.com/9seconds/mtg/v2/stats"
  12. "github.com/stretchr/testify/suite"
  13. )
  14. type PrometheusTestSuite struct {
  15. suite.Suite
  16. httpListener net.Listener
  17. factory *stats.PrometheusFactory
  18. prometheus events.Observer
  19. }
  20. func (suite *PrometheusTestSuite) Get() (string, error) {
  21. addr := fmt.Sprintf("http://%s/", suite.httpListener.Addr().String())
  22. resp, err := http.Get(addr) // nolint: noctx
  23. if err != nil {
  24. return "", err // nolint: wrapcheck
  25. }
  26. defer resp.Body.Close()
  27. data, err := io.ReadAll(resp.Body)
  28. if err != nil {
  29. return "", err // nolint: wrapcheck
  30. }
  31. return string(data), nil
  32. }
  33. func (suite *PrometheusTestSuite) SetupTest() {
  34. suite.httpListener, _ = net.Listen("tcp", "127.0.0.1:0")
  35. suite.factory = stats.NewPrometheus("mtg", "/")
  36. suite.prometheus = suite.factory.Make()
  37. go suite.factory.Serve(suite.httpListener) // nolint: errcheck
  38. }
  39. func (suite *PrometheusTestSuite) TearDownTest() {
  40. suite.prometheus.Shutdown()
  41. suite.NoError(suite.factory.Close())
  42. suite.httpListener.Close()
  43. }
  44. func (suite *PrometheusTestSuite) TestTelegramPath() {
  45. suite.prometheus.EventStart(mtglib.EventStart{
  46. CreatedAt: time.Now(),
  47. ConnID: "connID",
  48. RemoteIP: net.ParseIP("10.0.0.10"),
  49. })
  50. time.Sleep(100 * time.Millisecond)
  51. data, err := suite.Get()
  52. suite.NoError(err)
  53. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 1`)
  54. suite.prometheus.EventConnectedToDC(mtglib.EventConnectedToDC{
  55. CreatedAt: time.Now(),
  56. ConnID: "connID",
  57. RemoteIP: net.ParseIP("10.0.0.1"),
  58. DC: 4,
  59. })
  60. time.Sleep(100 * time.Millisecond)
  61. data, err = suite.Get()
  62. suite.NoError(err)
  63. suite.Contains(data, `mtg_telegram_connections{dc="4",telegram_ip="10.0.0.1"} 1`)
  64. suite.prometheus.EventTraffic(mtglib.EventTraffic{
  65. CreatedAt: time.Now(),
  66. ConnID: "connID",
  67. Traffic: 200,
  68. IsRead: true,
  69. })
  70. time.Sleep(100 * time.Millisecond)
  71. data, err = suite.Get()
  72. suite.NoError(err)
  73. suite.Contains(data, `mtg_telegram_traffic{dc="4",direction="to_client",telegram_ip="10.0.0.1"} 200`)
  74. suite.prometheus.EventTraffic(mtglib.EventTraffic{
  75. CreatedAt: time.Now(),
  76. ConnID: "connID",
  77. Traffic: 100,
  78. IsRead: false,
  79. })
  80. time.Sleep(100 * time.Millisecond)
  81. data, err = suite.Get()
  82. suite.NoError(err)
  83. suite.Contains(data, `mtg_telegram_traffic{dc="4",direction="from_client",telegram_ip="10.0.0.1"} 100`)
  84. suite.prometheus.EventFinish(mtglib.EventFinish{
  85. CreatedAt: time.Now(),
  86. ConnID: "connID",
  87. })
  88. time.Sleep(100 * time.Millisecond)
  89. data, err = suite.Get()
  90. suite.NoError(err)
  91. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 0`)
  92. suite.Contains(data, `mtg_telegram_connections{dc="4",telegram_ip="10.0.0.1"} 0`)
  93. }
  94. func (suite *PrometheusTestSuite) TestDomainFrontingPath() {
  95. suite.prometheus.EventStart(mtglib.EventStart{
  96. CreatedAt: time.Now(),
  97. ConnID: "connID",
  98. RemoteIP: net.ParseIP("10.0.0.10"),
  99. })
  100. time.Sleep(100 * time.Millisecond)
  101. data, err := suite.Get()
  102. suite.NoError(err)
  103. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 1`)
  104. suite.prometheus.EventDomainFronting(mtglib.EventDomainFronting{
  105. CreatedAt: time.Now(),
  106. ConnID: "connID",
  107. })
  108. time.Sleep(100 * time.Millisecond)
  109. data, err = suite.Get()
  110. suite.NoError(err)
  111. suite.Contains(data, `mtg_domain_fronting 1`)
  112. suite.Contains(data, `mtg_domain_fronting_connections{ip_family="ipv4"} 1`)
  113. suite.prometheus.EventTraffic(mtglib.EventTraffic{
  114. CreatedAt: time.Now(),
  115. ConnID: "connID",
  116. Traffic: 200,
  117. IsRead: true,
  118. })
  119. time.Sleep(100 * time.Millisecond)
  120. data, err = suite.Get()
  121. suite.NoError(err)
  122. suite.Contains(data, `mtg_domain_fronting_traffic{direction="to_client"} 200`)
  123. suite.prometheus.EventTraffic(mtglib.EventTraffic{
  124. CreatedAt: time.Now(),
  125. ConnID: "connID",
  126. Traffic: 100,
  127. IsRead: false,
  128. })
  129. time.Sleep(100 * time.Millisecond)
  130. data, err = suite.Get()
  131. suite.NoError(err)
  132. suite.Contains(data, `mtg_domain_fronting_traffic{direction="from_client"} 100`)
  133. suite.prometheus.EventFinish(mtglib.EventFinish{
  134. CreatedAt: time.Now(),
  135. ConnID: "connID",
  136. })
  137. time.Sleep(100 * time.Millisecond)
  138. data, err = suite.Get()
  139. suite.NoError(err)
  140. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 0`)
  141. suite.Contains(data, `mtg_domain_fronting_connections{ip_family="ipv4"} 0`)
  142. }
  143. func (suite *PrometheusTestSuite) TestEventConcurrencyLimited() {
  144. suite.prometheus.EventConcurrencyLimited(mtglib.EventConcurrencyLimited{
  145. CreatedAt: time.Now(),
  146. })
  147. time.Sleep(100 * time.Millisecond)
  148. data, err := suite.Get()
  149. suite.NoError(err)
  150. suite.Contains(data, `mtg_concurrency_limited 1`)
  151. }
  152. func (suite *PrometheusTestSuite) TestEventIPBlocklisted() {
  153. suite.prometheus.EventIPBlocklisted(mtglib.EventIPBlocklisted{
  154. CreatedAt: time.Now(),
  155. RemoteIP: net.ParseIP("2001:db8::68"),
  156. })
  157. time.Sleep(100 * time.Millisecond)
  158. data, err := suite.Get()
  159. suite.NoError(err)
  160. suite.Contains(data, `mtg_ip_blocklisted 1`)
  161. }
  162. func (suite *PrometheusTestSuite) TestEventReplayAttack() {
  163. suite.prometheus.EventReplayAttack(mtglib.EventReplayAttack{
  164. CreatedAt: time.Now(),
  165. ConnID: "connID",
  166. })
  167. time.Sleep(100 * time.Millisecond)
  168. data, err := suite.Get()
  169. suite.NoError(err)
  170. suite.Contains(data, `mtg_replay_attacks 1`)
  171. }
  172. func TestPrometheus(t *testing.T) {
  173. t.Parallel()
  174. suite.Run(t, &PrometheusTestSuite{})
  175. }