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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

prometheus_test.go 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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) TestEventStartFinish() {
  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_type="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",ip="10.0.0.1",ip_type="ipv4"} 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_traffic{dc="4",direction="client",ip="10.0.0.1",ip_type="ipv4"} 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_traffic{dc="4",direction="telegram",ip="10.0.0.1",ip_type="ipv4"} 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_type="ipv4"} 0`)
  92. suite.Contains(data, `mtg_telegram_connections{dc="4",ip="10.0.0.1",ip_type="ipv4"} 0`)
  93. suite.Contains(data, `mtg_traffic{dc="4",direction="client",ip="10.0.0.1",ip_type="ipv4"} 200`)
  94. suite.Contains(data, `mtg_traffic{dc="4",direction="telegram",ip="10.0.0.1",ip_type="ipv4"} 100`)
  95. }
  96. func (suite *PrometheusTestSuite) TestEventConcurrencyLimited() {
  97. suite.prometheus.EventConcurrencyLimited(mtglib.EventConcurrencyLimited{
  98. CreatedAt: time.Now(),
  99. })
  100. time.Sleep(100 * time.Millisecond)
  101. data, err := suite.Get()
  102. suite.NoError(err)
  103. suite.Contains(data, `mtg_concurrency_limited 1`)
  104. }
  105. func (suite *PrometheusTestSuite) TestEventIPBlocklisted() {
  106. suite.prometheus.EventIPBlocklisted(mtglib.EventIPBlocklisted{
  107. CreatedAt: time.Now(),
  108. RemoteIP: net.ParseIP("2001:db8::68"),
  109. })
  110. time.Sleep(100 * time.Millisecond)
  111. data, err := suite.Get()
  112. suite.NoError(err)
  113. suite.Contains(data, `mtg_ip_blocklisted{ip_type="ipv6"} 1`)
  114. }
  115. func TestPrometheus(t *testing.T) {
  116. t.Parallel()
  117. suite.Run(t, &PrometheusTestSuite{})
  118. }