diff --git a/core/stores/redis/hook.go b/core/stores/redis/hook.go index 46dfad1e..09c41b16 100644 --- a/core/stores/redis/hook.go +++ b/core/stores/redis/hook.go @@ -7,9 +7,8 @@ import ( "strings" "time" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/breaker" - "github.com/zeromicro/go-zero/core/errorx" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/mapping" "github.com/zeromicro/go-zero/core/timex" @@ -23,93 +22,65 @@ import ( const spanName = "redis" var ( - startTimeKey = contextKey("startTime") durationHook = hook{} redisCmdsAttributeKey = attribute.Key("redis.cmds") ) -type ( - contextKey string - hook struct{} -) +type hook struct{} -func (h hook) BeforeProcess(ctx context.Context, cmd red.Cmder) (context.Context, error) { - return h.startSpan(context.WithValue(ctx, startTimeKey, timex.Now()), cmd), nil +func (h hook) DialHook(next red.DialHook) red.DialHook { + // no need to implement + return next } -func (h hook) AfterProcess(ctx context.Context, cmd red.Cmder) error { - err := cmd.Err() - h.endSpan(ctx, err) - - val := ctx.Value(startTimeKey) - if val == nil { - return nil - } +func (h hook) ProcessHook(next red.ProcessHook) red.ProcessHook { + return func(ctx context.Context, cmd red.Cmder) error { + start := timex.Now() + ctx, endSpan := h.startSpan(ctx, cmd) - start, ok := val.(time.Duration) - if !ok { - return nil - } + err := next(ctx, cmd) - duration := timex.Since(start) - if duration > slowThreshold.Load() { - logDuration(ctx, []red.Cmder{cmd}, duration) - metricSlowCount.Inc(cmd.Name()) - } + endSpan(err) + duration := timex.Since(start) - metricReqDur.ObserveFloat(float64(duration)/float64(time.Millisecond), cmd.Name()) - if msg := formatError(err); len(msg) > 0 { - metricReqErr.Inc(cmd.Name(), msg) - } + if duration > slowThreshold.Load() { + logDuration(ctx, []red.Cmder{cmd}, duration) + metricSlowCount.Inc(cmd.Name()) + } - return nil -} + metricReqDur.Observe(duration.Milliseconds(), cmd.Name()) + if msg := formatError(err); len(msg) > 0 { + metricReqErr.Inc(cmd.Name(), msg) + } -func (h hook) BeforeProcessPipeline(ctx context.Context, cmds []red.Cmder) (context.Context, error) { - if len(cmds) == 0 { - return ctx, nil + return err } - - return h.startSpan(context.WithValue(ctx, startTimeKey, timex.Now()), cmds...), nil } -func (h hook) AfterProcessPipeline(ctx context.Context, cmds []red.Cmder) error { - if len(cmds) == 0 { - return nil - } - - batchError := errorx.BatchError{} - for _, cmd := range cmds { - err := cmd.Err() - if err == nil { - continue +func (h hook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipelineHook { + return func(ctx context.Context, cmds []red.Cmder) error { + if len(cmds) == 0 { + return next(ctx, cmds) } - batchError.Add(err) - } - h.endSpan(ctx, batchError.Err()) + start := timex.Now() + ctx, endSpan := h.startSpan(ctx, cmds...) - val := ctx.Value(startTimeKey) - if val == nil { - return nil - } + err := next(ctx, cmds) - start, ok := val.(time.Duration) - if !ok { - return nil - } + endSpan(err) + duration := timex.Since(start) + if duration > slowThreshold.Load()*time.Duration(len(cmds)) { + logDuration(ctx, cmds, duration) + } - duration := timex.Since(start) - if duration > slowThreshold.Load()*time.Duration(len(cmds)) { - logDuration(ctx, cmds, duration) - } + metricReqDur.Observe(duration.Milliseconds(), "Pipeline") + if msg := formatError(err); len(msg) > 0 { + metricReqErr.Inc("Pipeline", msg) + } - metricReqDur.Observe(duration.Milliseconds(), "Pipeline") - if msg := formatError(batchError.Err()); len(msg) > 0 { - metricReqErr.Inc("Pipeline", msg) + return err } - - return nil } func formatError(err error) string { @@ -152,7 +123,7 @@ func logDuration(ctx context.Context, cmds []red.Cmder, duration time.Duration) logx.WithContext(ctx).WithDuration(duration).Slowf("[REDIS] slowcall on executing: %s", buf.String()) } -func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) context.Context { +func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) (context.Context, func(err error)) { tracer := trace.TracerFromContext(ctx) ctx, span := tracer.Start(ctx, @@ -166,18 +137,15 @@ func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) context.Context } span.SetAttributes(redisCmdsAttributeKey.StringSlice(cmdStrs)) - return ctx -} + return ctx, func(err error) { + defer span.End() -func (h hook) endSpan(ctx context.Context, err error) { - span := oteltrace.SpanFromContext(ctx) - defer span.End() + if err == nil || err == red.Nil { + span.SetStatus(codes.Ok, "") + return + } - if err == nil || err == red.Nil { - span.SetStatus(codes.Ok, "") - return + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) } - - span.SetStatus(codes.Error, err.Error()) - span.RecordError(err) } diff --git a/core/stores/redis/hook_test.go b/core/stores/redis/hook_test.go index 78556ef9..cf7146f6 100644 --- a/core/stores/redis/hook_test.go +++ b/core/stores/redis/hook_test.go @@ -4,167 +4,103 @@ import ( "context" "errors" "io" - "log" "net" "strings" "testing" "time" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/stretchr/testify/assert" "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx/logtest" - ztrace "github.com/zeromicro/go-zero/core/trace" + "github.com/zeromicro/go-zero/core/trace/tracetest" tracesdk "go.opentelemetry.io/otel/trace" ) func TestHookProcessCase1(t *testing.T) { - ztrace.StartAgent(ztrace.Config{ - Name: "go-zero-test", - Endpoint: "http://localhost:14268/api/traces", - Batcher: "jaeger", - Sampler: 1.0, - }) - defer ztrace.StopAgent() - - writer := log.Writer() - var buf strings.Builder - log.SetOutput(&buf) - defer log.SetOutput(writer) + tracetest.NewInMemoryExporter(t) + w := logtest.NewCollector(t) - ctx, err := durationHook.BeforeProcess(context.Background(), red.NewCmd(context.Background())) + err := durationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { + assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + return nil + })(context.Background(), red.NewCmd(context.Background())) if err != nil { t.Fatal(err) } - assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background()))) - assert.False(t, strings.Contains(buf.String(), "slow")) - assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + assert.False(t, strings.Contains(w.String(), "slow")) } func TestHookProcessCase2(t *testing.T) { - ztrace.StartAgent(ztrace.Config{ - Name: "go-zero-test", - Endpoint: "http://localhost:14268/api/traces", - Batcher: "jaeger", - Sampler: 1.0, - }) - defer ztrace.StopAgent() - + tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - ctx, err := durationHook.BeforeProcess(context.Background(), red.NewCmd(context.Background())) + + err := durationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { + assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + time.Sleep(slowThreshold.Load() + time.Millisecond) + return nil + })(context.Background(), red.NewCmd(context.Background())) if err != nil { t.Fatal(err) } - time.Sleep(slowThreshold.Load() + time.Millisecond) - - assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background(), "foo", "bar"))) assert.True(t, strings.Contains(w.String(), "slow")) -} - -func TestHookProcessCase3(t *testing.T) { - writer := log.Writer() - var buf strings.Builder - log.SetOutput(&buf) - defer log.SetOutput(writer) - - assert.Nil(t, durationHook.AfterProcess(context.Background(), red.NewCmd(context.Background()))) - assert.True(t, buf.Len() == 0) -} - -func TestHookProcessCase4(t *testing.T) { - writer := log.Writer() - var buf strings.Builder - log.SetOutput(&buf) - defer log.SetOutput(writer) - - ctx := context.WithValue(context.Background(), startTimeKey, "foo") - assert.Nil(t, durationHook.AfterProcess(ctx, red.NewCmd(context.Background()))) - assert.True(t, buf.Len() == 0) + assert.True(t, strings.Contains(w.String(), "trace")) + assert.True(t, strings.Contains(w.String(), "span")) } func TestHookProcessPipelineCase1(t *testing.T) { - ztrace.StartAgent(ztrace.Config{ - Name: "go-zero-test", - Endpoint: "http://localhost:14268/api/traces", - Batcher: "jaeger", - Sampler: 1.0, - }) - defer ztrace.StopAgent() - - writer := log.Writer() - var buf strings.Builder - log.SetOutput(&buf) - defer log.SetOutput(writer) + tracetest.NewInMemoryExporter(t) + w := logtest.NewCollector(t) - _, err := durationHook.BeforeProcessPipeline(context.Background(), []red.Cmder{}) + err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + return nil + })(context.Background(), nil) assert.NoError(t, err) - ctx, err := durationHook.BeforeProcessPipeline(context.Background(), []red.Cmder{ + + err = durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + return nil + })(context.Background(), []red.Cmder{ red.NewCmd(context.Background()), }) assert.NoError(t, err) - assert.NoError(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{})) - assert.NoError(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{ - red.NewCmd(context.Background()), - })) - assert.False(t, strings.Contains(buf.String(), "slow")) + assert.False(t, strings.Contains(w.String(), "slow")) } func TestHookProcessPipelineCase2(t *testing.T) { - ztrace.StartAgent(ztrace.Config{ - Name: "go-zero-test", - Endpoint: "http://localhost:14268/api/traces", - Batcher: "jaeger", - Sampler: 1.0, - }) - defer ztrace.StopAgent() - + tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - ctx, err := durationHook.BeforeProcessPipeline(context.Background(), []red.Cmder{ + + err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + time.Sleep(slowThreshold.Load() + time.Millisecond) + return nil + })(context.Background(), []red.Cmder{ red.NewCmd(context.Background()), }) assert.NoError(t, err) - time.Sleep(slowThreshold.Load() + time.Millisecond) - - assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{ - red.NewCmd(context.Background(), "foo", "bar"), - })) assert.True(t, strings.Contains(w.String(), "slow")) + assert.True(t, strings.Contains(w.String(), "trace")) + assert.True(t, strings.Contains(w.String(), "span")) } func TestHookProcessPipelineCase3(t *testing.T) { - w := logtest.NewCollector(t) - - assert.Nil(t, durationHook.AfterProcessPipeline(context.Background(), []red.Cmder{ - red.NewCmd(context.Background()), - })) - assert.True(t, len(w.String()) == 0) -} - -func TestHookProcessPipelineCase4(t *testing.T) { - w := logtest.NewCollector(t) - - ctx := context.WithValue(context.Background(), startTimeKey, "foo") - assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{ - red.NewCmd(context.Background()), - })) - assert.True(t, len(w.String()) == 0) -} + te := tracetest.NewInMemoryExporter(t) -func TestHookProcessPipelineCase5(t *testing.T) { - writer := log.Writer() - var buf strings.Builder - log.SetOutput(&buf) - defer log.SetOutput(writer) - - ctx := context.WithValue(context.Background(), startTimeKey, "foo") - assert.Nil(t, durationHook.AfterProcessPipeline(ctx, []red.Cmder{ + err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) + return assert.AnError + })(context.Background(), []red.Cmder{ red.NewCmd(context.Background()), - })) - assert.True(t, buf.Len() == 0) + }) + assert.ErrorIs(t, err, assert.AnError) + traceLogs := te.GetSpans().Snapshots()[0] + assert.Equal(t, "redis", traceLogs.Name()) + assert.Equal(t, assert.AnError.Error(), traceLogs.Events()[0].Attributes[1].Value.AsString(), "trace should record error") } func TestLogDuration(t *testing.T) { diff --git a/core/stores/redis/metrics.go b/core/stores/redis/metrics.go index fe3ce9cc..260a0fae 100644 --- a/core/stores/redis/metrics.go +++ b/core/stores/redis/metrics.go @@ -3,8 +3,8 @@ package redis import ( "sync" - red "github.com/go-redis/redis/v8" "github.com/prometheus/client_golang/prometheus" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/metric" ) diff --git a/core/stores/redis/metrics_test.go b/core/stores/redis/metrics_test.go index 29c5f771..45549bde 100644 --- a/core/stores/redis/metrics_test.go +++ b/core/stores/redis/metrics_test.go @@ -7,9 +7,9 @@ import ( "testing" "time" - red "github.com/go-redis/redis/v8" "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" diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index bf42bcde..40fb008c 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -7,7 +7,7 @@ import ( "strconv" "time" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/errorx" "github.com/zeromicro/go-zero/core/logx" @@ -64,6 +64,7 @@ type ( // RedisNode interface represents a redis node. RedisNode interface { red.Cmdable + red.BitMapCmdable } // GeoLocation is used with GeoAdd to add geospatial location. @@ -2058,7 +2059,7 @@ func (s *Redis) ZaddFloatCtx(ctx context.Context, key string, score float64, val return err } - v, err := conn.ZAdd(ctx, key, &red.Z{ + v, err := conn.ZAdd(ctx, key, red.Z{ Score: score, Member: value, }).Result() @@ -2086,9 +2087,9 @@ func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (val int64 return err } - var zs []*red.Z + var zs []red.Z for _, p := range ps { - z := &red.Z{Score: float64(p.Score), Member: p.Key} + z := red.Z{Score: float64(p.Score), Member: p.Key} zs = append(zs, z) } diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 626c89f6..b455523c 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -10,29 +10,34 @@ import ( "time" "github.com/alicebob/miniredis/v2" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/stretchr/testify/assert" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stringx" ) type myHook struct { - red.Hook includePing bool } var _ red.Hook = myHook{} -func (m myHook) BeforeProcess(ctx context.Context, cmd red.Cmder) (context.Context, error) { - return ctx, nil +func (m myHook) DialHook(next red.DialHook) red.DialHook { + return next } -func (m myHook) AfterProcess(ctx context.Context, cmd red.Cmder) error { - // skip ping cmd - if cmd.Name() == "ping" && !m.includePing { - return nil +func (m myHook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipelineHook { + return next +} + +func (m myHook) ProcessHook(next red.ProcessHook) red.ProcessHook { + return func(ctx context.Context, cmd red.Cmder) error { + // skip ping cmd + if cmd.Name() == "ping" && !m.includePing { + return next(ctx, cmd) + } + return errors.New("hook error") } - return errors.New("hook error") } func TestNewRedis(t *testing.T) { @@ -1609,7 +1614,7 @@ func TestRedis_Pipelined(t *testing.T) { func(pipe Pipeliner) error { pipe.Incr(context.Background(), "pipelined_counter") pipe.Expire(context.Background(), "pipelined_counter", time.Hour) - pipe.ZAdd(context.Background(), "zadd", &Z{Score: 12, Member: "zadd"}) + pipe.ZAdd(context.Background(), "zadd", Z{Score: 12, Member: "zadd"}) return nil }, ) diff --git a/core/stores/redis/redisblockingnode.go b/core/stores/redis/redisblockingnode.go index 106df626..6e60fa21 100644 --- a/core/stores/redis/redisblockingnode.go +++ b/core/stores/redis/redisblockingnode.go @@ -3,7 +3,7 @@ package redis import ( "fmt" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/core/stores/redis/redisclientmanager.go b/core/stores/redis/redisclientmanager.go index 8b1b8ed5..e2e1ad5f 100644 --- a/core/stores/redis/redisclientmanager.go +++ b/core/stores/redis/redisclientmanager.go @@ -5,7 +5,7 @@ import ( "io" "runtime" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/syncx" ) diff --git a/core/stores/redis/redisclustermanager.go b/core/stores/redis/redisclustermanager.go index 105498e8..e361a577 100644 --- a/core/stores/redis/redisclustermanager.go +++ b/core/stores/redis/redisclustermanager.go @@ -6,7 +6,7 @@ import ( "runtime" "strings" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/syncx" ) diff --git a/core/stores/redis/redisclustermanager_test.go b/core/stores/redis/redisclustermanager_test.go index 4d53a632..ac31517e 100644 --- a/core/stores/redis/redisclustermanager_test.go +++ b/core/stores/redis/redisclustermanager_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/alicebob/miniredis/v2" - red "github.com/go-redis/redis/v8" + red "github.com/redis/go-redis/v9" "github.com/stretchr/testify/assert" ) diff --git a/core/stores/redis/redislock.go b/core/stores/redis/redislock.go index c740ef36..2979ee50 100644 --- a/core/stores/redis/redislock.go +++ b/core/stores/redis/redislock.go @@ -7,8 +7,7 @@ import ( "sync/atomic" "time" - red "github.com/go-redis/redis/v8" - + red "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stringx" ) diff --git a/go.mod b/go.mod index 7ee63ad7..d5979489 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,6 @@ require ( github.com/alicebob/miniredis/v2 v2.31.1 github.com/fatih/color v1.16.0 github.com/fullstorydev/grpcurl v1.8.9 - github.com/go-redis/redis/v8 v8.11.5 github.com/go-sql-driver/mysql v1.7.1 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang/mock v1.6.0 @@ -18,6 +17,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/pelletier/go-toml/v2 v2.1.1 github.com/prometheus/client_golang v1.18.0 + github.com/redis/go-redis/v9 v9.4.0 github.com/spaolacci/murmur3 v1.1.0 github.com/stretchr/testify v1.8.4 go.etcd.io/etcd/api/v3 v3.5.11 diff --git a/go.sum b/go.sum index c244c248..15e8c668 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/alicebob/miniredis/v2 v2.31.1/go.mod h1:UB/T2Uztp7MlFSDakaX1sTXUv5CAS github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bufbuild/protocompile v0.7.1 h1:Kd8fb6EshOHXNNRtYAmLAwy/PotlyFoN0iMbuwGNh0M= github.com/bufbuild/protocompile v0.7.1/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= @@ -32,7 +34,6 @@ github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxER github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fullstorydev/grpcurl v1.8.9 h1:JMvZXK8lHDGyLmTQ0ZdGDnVVGuwjbpaumf8p42z0d+c= github.com/fullstorydev/grpcurl v1.8.9/go.mod h1:PNNKevV5VNAV2loscyLISrEnWQI61eqR0F8l3bVadAA= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -47,8 +48,6 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -134,10 +133,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA= @@ -156,6 +153,8 @@ github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lne github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk= +github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -322,7 +321,6 @@ gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=