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ů.

prometheus_test.go 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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(
  46. mtglib.NewEventStart("connID", net.ParseIP("10.0.0.10")))
  47. time.Sleep(100 * time.Millisecond)
  48. data, err := suite.Get()
  49. suite.NoError(err)
  50. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 1`)
  51. suite.prometheus.EventConnectedToDC(
  52. mtglib.NewEventConnectedToDC("connID", net.ParseIP("10.0.0.1"), 4))
  53. time.Sleep(100 * time.Millisecond)
  54. data, err = suite.Get()
  55. suite.NoError(err)
  56. suite.Contains(data, `mtg_telegram_connections{dc="4",telegram_ip="10.0.0.1"} 1`)
  57. suite.prometheus.EventTraffic(
  58. mtglib.NewEventTraffic("connID", 200, true))
  59. time.Sleep(100 * time.Millisecond)
  60. data, err = suite.Get()
  61. suite.NoError(err)
  62. suite.Contains(data, `mtg_telegram_traffic{dc="4",direction="to_client",telegram_ip="10.0.0.1"} 200`)
  63. suite.prometheus.EventTraffic(
  64. mtglib.NewEventTraffic("connID", 100, false))
  65. time.Sleep(100 * time.Millisecond)
  66. data, err = suite.Get()
  67. suite.NoError(err)
  68. suite.Contains(data, `mtg_telegram_traffic{dc="4",direction="from_client",telegram_ip="10.0.0.1"} 100`)
  69. suite.prometheus.EventFinish(mtglib.NewEventFinish("connID"))
  70. time.Sleep(100 * time.Millisecond)
  71. data, err = suite.Get()
  72. suite.NoError(err)
  73. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 0`)
  74. suite.Contains(data, `mtg_telegram_connections{dc="4",telegram_ip="10.0.0.1"} 0`)
  75. }
  76. func (suite *PrometheusTestSuite) TestDomainFrontingPath() {
  77. suite.prometheus.EventStart(
  78. mtglib.NewEventStart("connID", net.ParseIP("10.0.0.10")))
  79. time.Sleep(100 * time.Millisecond)
  80. data, err := suite.Get()
  81. suite.NoError(err)
  82. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 1`)
  83. suite.prometheus.EventDomainFronting(mtglib.NewEventDomainFronting("connID"))
  84. time.Sleep(100 * time.Millisecond)
  85. data, err = suite.Get()
  86. suite.NoError(err)
  87. suite.Contains(data, `mtg_domain_fronting 1`)
  88. suite.Contains(data, `mtg_domain_fronting_connections{ip_family="ipv4"} 1`)
  89. suite.prometheus.EventTraffic(
  90. mtglib.NewEventTraffic("connID", 200, true))
  91. time.Sleep(100 * time.Millisecond)
  92. data, err = suite.Get()
  93. suite.NoError(err)
  94. suite.Contains(data, `mtg_domain_fronting_traffic{direction="to_client"} 200`)
  95. suite.prometheus.EventTraffic(
  96. mtglib.NewEventTraffic("connID", 100, false))
  97. time.Sleep(100 * time.Millisecond)
  98. data, err = suite.Get()
  99. suite.NoError(err)
  100. suite.Contains(data, `mtg_domain_fronting_traffic{direction="from_client"} 100`)
  101. suite.prometheus.EventFinish(mtglib.NewEventFinish("connID"))
  102. time.Sleep(100 * time.Millisecond)
  103. data, err = suite.Get()
  104. suite.NoError(err)
  105. suite.Contains(data, `mtg_client_connections{ip_family="ipv4"} 0`)
  106. suite.Contains(data, `mtg_domain_fronting_connections{ip_family="ipv4"} 0`)
  107. }
  108. func (suite *PrometheusTestSuite) TestEventConcurrencyLimited() {
  109. suite.prometheus.EventConcurrencyLimited(mtglib.NewEventConcurrencyLimited())
  110. time.Sleep(100 * time.Millisecond)
  111. data, err := suite.Get()
  112. suite.NoError(err)
  113. suite.Contains(data, `mtg_concurrency_limited 1`)
  114. }
  115. func (suite *PrometheusTestSuite) TestEventIPBlocklisted() {
  116. suite.prometheus.EventIPBlocklisted(
  117. mtglib.NewEventIPBlocklisted(net.ParseIP("2001:db8::68")))
  118. time.Sleep(100 * time.Millisecond)
  119. data, err := suite.Get()
  120. suite.NoError(err)
  121. suite.Contains(data, `mtg_ip_blocklisted 1`)
  122. }
  123. func (suite *PrometheusTestSuite) TestEventReplayAttack() {
  124. suite.prometheus.EventReplayAttack(mtglib.NewEventReplayAttack("connID"))
  125. time.Sleep(100 * time.Millisecond)
  126. data, err := suite.Get()
  127. suite.NoError(err)
  128. suite.Contains(data, `mtg_replay_attacks 1`)
  129. }
  130. func TestPrometheus(t *testing.T) {
  131. t.Parallel()
  132. suite.Run(t, &PrometheusTestSuite{})
  133. }