metrics_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package redis
  2. import (
  3. "io"
  4. "net/http"
  5. "strings"
  6. "testing"
  7. "time"
  8. red "github.com/go-redis/redis/v8"
  9. "github.com/prometheus/client_golang/prometheus"
  10. "github.com/prometheus/client_golang/prometheus/testutil"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/zeromicro/go-zero/core/conf"
  13. "github.com/zeromicro/go-zero/internal/devserver"
  14. )
  15. func TestRedisMetric(t *testing.T) {
  16. cfg := devserver.Config{}
  17. _ = conf.FillDefault(&cfg)
  18. server := devserver.NewServer(cfg)
  19. server.StartAsync()
  20. time.Sleep(time.Second)
  21. metricReqDur.Observe(8, "test-cmd")
  22. metricReqErr.Inc("test-cmd", "internal-error")
  23. metricSlowCount.Inc("test-cmd")
  24. url := "http://127.0.0.1:6060/metrics"
  25. resp, err := http.Get(url)
  26. assert.Nil(t, err)
  27. defer resp.Body.Close()
  28. s, err := io.ReadAll(resp.Body)
  29. assert.Nil(t, err)
  30. content := string(s)
  31. assert.Contains(t, content, "redis_client_requests_duration_ms_sum{command=\"test-cmd\"} 8\n")
  32. assert.Contains(t, content, "redis_client_requests_duration_ms_count{command=\"test-cmd\"} 1\n")
  33. assert.Contains(t, content, "redis_client_requests_error_total{command=\"test-cmd\",error=\"internal-error\"} 1\n")
  34. assert.Contains(t, content, "redis_client_requests_slow_total{command=\"test-cmd\"} 1\n")
  35. }
  36. func Test_newCollector(t *testing.T) {
  37. prometheus.Unregister(connCollector)
  38. c := newCollector()
  39. c.registerClient(&statGetter{
  40. clientType: "node",
  41. key: "test1",
  42. poolSize: 10,
  43. poolStats: func() *red.PoolStats {
  44. return &red.PoolStats{
  45. Hits: 10000,
  46. Misses: 10,
  47. Timeouts: 5,
  48. TotalConns: 100,
  49. IdleConns: 20,
  50. StaleConns: 1,
  51. }
  52. },
  53. })
  54. c.registerClient(&statGetter{
  55. clientType: "node",
  56. key: "test2",
  57. poolSize: 11,
  58. poolStats: func() *red.PoolStats {
  59. return &red.PoolStats{
  60. Hits: 10001,
  61. Misses: 11,
  62. Timeouts: 6,
  63. TotalConns: 101,
  64. IdleConns: 21,
  65. StaleConns: 2,
  66. }
  67. },
  68. })
  69. c.registerClient(&statGetter{
  70. clientType: "cluster",
  71. key: "test3",
  72. poolSize: 5,
  73. poolStats: func() *red.PoolStats {
  74. return &red.PoolStats{
  75. Hits: 20000,
  76. Misses: 20,
  77. Timeouts: 10,
  78. TotalConns: 200,
  79. IdleConns: 40,
  80. StaleConns: 2,
  81. }
  82. },
  83. })
  84. val := `
  85. # HELP redis_client_pool_conn_idle_current Current number of idle connections in the pool
  86. # TYPE redis_client_pool_conn_idle_current gauge
  87. redis_client_pool_conn_idle_current{client_type="cluster",key="test3"} 40
  88. redis_client_pool_conn_idle_current{client_type="node",key="test1"} 20
  89. redis_client_pool_conn_idle_current{client_type="node",key="test2"} 21
  90. # HELP redis_client_pool_conn_max Max number of connections in the pool
  91. # TYPE redis_client_pool_conn_max counter
  92. redis_client_pool_conn_max{client_type="cluster",key="test3"} 5
  93. redis_client_pool_conn_max{client_type="node",key="test1"} 10
  94. redis_client_pool_conn_max{client_type="node",key="test2"} 11
  95. # HELP redis_client_pool_conn_stale_total Number of times a connection was removed from the pool because it was stale
  96. # TYPE redis_client_pool_conn_stale_total counter
  97. redis_client_pool_conn_stale_total{client_type="cluster",key="test3"} 2
  98. redis_client_pool_conn_stale_total{client_type="node",key="test1"} 1
  99. redis_client_pool_conn_stale_total{client_type="node",key="test2"} 2
  100. # HELP redis_client_pool_conn_total_current Current number of connections in the pool
  101. # TYPE redis_client_pool_conn_total_current gauge
  102. redis_client_pool_conn_total_current{client_type="cluster",key="test3"} 200
  103. redis_client_pool_conn_total_current{client_type="node",key="test1"} 100
  104. redis_client_pool_conn_total_current{client_type="node",key="test2"} 101
  105. # HELP redis_client_pool_hit_total Number of times a connection was found in the pool
  106. # TYPE redis_client_pool_hit_total counter
  107. redis_client_pool_hit_total{client_type="cluster",key="test3"} 20000
  108. redis_client_pool_hit_total{client_type="node",key="test1"} 10000
  109. redis_client_pool_hit_total{client_type="node",key="test2"} 10001
  110. # HELP redis_client_pool_miss_total Number of times a connection was not found in the pool
  111. # TYPE redis_client_pool_miss_total counter
  112. redis_client_pool_miss_total{client_type="cluster",key="test3"} 20
  113. redis_client_pool_miss_total{client_type="node",key="test1"} 10
  114. redis_client_pool_miss_total{client_type="node",key="test2"} 11
  115. # HELP redis_client_pool_timeout_total Number of times a timeout occurred when looking for a connection in the pool
  116. # TYPE redis_client_pool_timeout_total counter
  117. redis_client_pool_timeout_total{client_type="cluster",key="test3"} 10
  118. redis_client_pool_timeout_total{client_type="node",key="test1"} 5
  119. redis_client_pool_timeout_total{client_type="node",key="test2"} 6
  120. `
  121. err := testutil.CollectAndCompare(c, strings.NewReader(val))
  122. assert.NoError(t, err)
  123. }