You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.7 KiB
Go
131 lines
4.7 KiB
Go
package redis
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/testutil"
|
|
red "github.com/redis/go-redis/v9"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/zeromicro/go-zero/core/conf"
|
|
"github.com/zeromicro/go-zero/internal/devserver"
|
|
)
|
|
|
|
func TestRedisMetric(t *testing.T) {
|
|
cfg := devserver.Config{}
|
|
_ = conf.FillDefault(&cfg)
|
|
server := devserver.NewServer(cfg)
|
|
server.StartAsync()
|
|
time.Sleep(time.Second)
|
|
|
|
metricReqDur.Observe(8, "test-cmd")
|
|
metricReqErr.Inc("test-cmd", "internal-error")
|
|
metricSlowCount.Inc("test-cmd")
|
|
|
|
url := "http://127.0.0.1:6060/metrics"
|
|
resp, err := http.Get(url)
|
|
assert.Nil(t, err)
|
|
defer resp.Body.Close()
|
|
s, err := io.ReadAll(resp.Body)
|
|
assert.Nil(t, err)
|
|
content := string(s)
|
|
assert.Contains(t, content, "redis_client_requests_duration_ms_sum{command=\"test-cmd\"} 8\n")
|
|
assert.Contains(t, content, "redis_client_requests_duration_ms_count{command=\"test-cmd\"} 1\n")
|
|
assert.Contains(t, content, "redis_client_requests_error_total{command=\"test-cmd\",error=\"internal-error\"} 1\n")
|
|
assert.Contains(t, content, "redis_client_requests_slow_total{command=\"test-cmd\"} 1\n")
|
|
}
|
|
|
|
func Test_newCollector(t *testing.T) {
|
|
prometheus.Unregister(connCollector)
|
|
c := newCollector()
|
|
c.registerClient(&statGetter{
|
|
clientType: "node",
|
|
key: "test1",
|
|
poolSize: 10,
|
|
poolStats: func() *red.PoolStats {
|
|
return &red.PoolStats{
|
|
Hits: 10000,
|
|
Misses: 10,
|
|
Timeouts: 5,
|
|
TotalConns: 100,
|
|
IdleConns: 20,
|
|
StaleConns: 1,
|
|
}
|
|
},
|
|
})
|
|
c.registerClient(&statGetter{
|
|
clientType: "node",
|
|
key: "test2",
|
|
poolSize: 11,
|
|
poolStats: func() *red.PoolStats {
|
|
return &red.PoolStats{
|
|
Hits: 10001,
|
|
Misses: 11,
|
|
Timeouts: 6,
|
|
TotalConns: 101,
|
|
IdleConns: 21,
|
|
StaleConns: 2,
|
|
}
|
|
},
|
|
})
|
|
c.registerClient(&statGetter{
|
|
clientType: "cluster",
|
|
key: "test3",
|
|
poolSize: 5,
|
|
poolStats: func() *red.PoolStats {
|
|
return &red.PoolStats{
|
|
Hits: 20000,
|
|
Misses: 20,
|
|
Timeouts: 10,
|
|
TotalConns: 200,
|
|
IdleConns: 40,
|
|
StaleConns: 2,
|
|
}
|
|
},
|
|
})
|
|
val := `
|
|
# HELP redis_client_pool_conn_idle_current Current number of idle connections in the pool
|
|
# TYPE redis_client_pool_conn_idle_current gauge
|
|
redis_client_pool_conn_idle_current{client_type="cluster",key="test3"} 40
|
|
redis_client_pool_conn_idle_current{client_type="node",key="test1"} 20
|
|
redis_client_pool_conn_idle_current{client_type="node",key="test2"} 21
|
|
# HELP redis_client_pool_conn_max Max number of connections in the pool
|
|
# TYPE redis_client_pool_conn_max counter
|
|
redis_client_pool_conn_max{client_type="cluster",key="test3"} 5
|
|
redis_client_pool_conn_max{client_type="node",key="test1"} 10
|
|
redis_client_pool_conn_max{client_type="node",key="test2"} 11
|
|
# HELP redis_client_pool_conn_stale_total Number of times a connection was removed from the pool because it was stale
|
|
# TYPE redis_client_pool_conn_stale_total counter
|
|
redis_client_pool_conn_stale_total{client_type="cluster",key="test3"} 2
|
|
redis_client_pool_conn_stale_total{client_type="node",key="test1"} 1
|
|
redis_client_pool_conn_stale_total{client_type="node",key="test2"} 2
|
|
# HELP redis_client_pool_conn_total_current Current number of connections in the pool
|
|
# TYPE redis_client_pool_conn_total_current gauge
|
|
redis_client_pool_conn_total_current{client_type="cluster",key="test3"} 200
|
|
redis_client_pool_conn_total_current{client_type="node",key="test1"} 100
|
|
redis_client_pool_conn_total_current{client_type="node",key="test2"} 101
|
|
# HELP redis_client_pool_hit_total Number of times a connection was found in the pool
|
|
# TYPE redis_client_pool_hit_total counter
|
|
redis_client_pool_hit_total{client_type="cluster",key="test3"} 20000
|
|
redis_client_pool_hit_total{client_type="node",key="test1"} 10000
|
|
redis_client_pool_hit_total{client_type="node",key="test2"} 10001
|
|
# HELP redis_client_pool_miss_total Number of times a connection was not found in the pool
|
|
# TYPE redis_client_pool_miss_total counter
|
|
redis_client_pool_miss_total{client_type="cluster",key="test3"} 20
|
|
redis_client_pool_miss_total{client_type="node",key="test1"} 10
|
|
redis_client_pool_miss_total{client_type="node",key="test2"} 11
|
|
# HELP redis_client_pool_timeout_total Number of times a timeout occurred when looking for a connection in the pool
|
|
# TYPE redis_client_pool_timeout_total counter
|
|
redis_client_pool_timeout_total{client_type="cluster",key="test3"} 10
|
|
redis_client_pool_timeout_total{client_type="node",key="test1"} 5
|
|
redis_client_pool_timeout_total{client_type="node",key="test2"} 6
|
|
`
|
|
|
|
err := testutil.CollectAndCompare(c, strings.NewReader(val))
|
|
assert.NoError(t, err)
|
|
}
|