Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add redis sentinel support #161

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ This section does not describe permanent API contracts; it just describes limita

## Backend Configuration

Prebid Cache requires a backend data store which enforces TTL expiration. The following storage options are supported: Aerospike, Cassandra, Memcache, and Redis. You're welcomed to contribute a new backend adapter if needed.
Prebid Cache requires a backend data store which enforces TTL expiration. The following storage options are supported: Aerospike, Cassandra, Memcache, and Redis/Redis sentinel. You're welcome to contribute a new backend adapter if needed.

There is also an option (enabled by default) for a basic in-memory data store intended only for development. This backend does not support TTL expiration and is not built for production use.

Expand Down Expand Up @@ -245,8 +245,10 @@ Prebid Cache makes use of a Cassandra client that supports latest 3 major releas
Prebid Cache makes use of a Redis Go client compatible with Redis 6. Full documentation of the Redis Go client Prebid Cache uses can be found [here](https://github.com/go-redis/redis).
| Configuration field | Type | Description |
| --- | --- | --- |
| host | string | Redis server URI |
| port | integer | Redis server port |
| host | string | Redis server URI (redis standalone mode) |
| port | integer | Redis server port (redis standalone mode) |
| sentinel_hosts_ports |string array | Redis server sentinel host:port list (redis sentinel mode)|
| sentinel_mastername | string | Redis master sentinel name (redis sentinel mode)|
| password | string | Redis password |
| db | integer | Database to be selected after connecting to the server |
| expiration | integer | Availability in the Redis system in Minutes |
Expand Down Expand Up @@ -281,7 +283,7 @@ backend:
hosts: "127.0.0.1"
keyspace: "prebid"
memcache:
hosts: ["10.0.0.1:11211","127.0.0.1"]
hosts: ["10.0.0.1:11211", "127.0.0.1"]
redis:
host: "127.0.0.1"
port: 6379
Expand Down Expand Up @@ -381,4 +383,4 @@ docker run -p 8000:8000 -t prebid-cache

### Profiling

[pprof stats](http://artem.krylysov.com/blog/2017/03/13/profiling-and-optimizing-go-web-applications/) can be accessed from a running app on the admin port `localhost:2525`.
[pprof stats](http://artem.krylysov.com/blog/2017/03/13/profiling-and-optimizing-go-web-applications/) can be accessed from a running app on the admin port `localhost:2525`.
2 changes: 2 additions & 0 deletions backends/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ func TestNewBaseBackend(t *testing.T) {
desc: "Redis",
inConfig: config.Backend{Type: config.BackendRedis},
expectedLogEntries: []logEntry{
{msg: "Error creating Redis backend: At least one Host[s] is required.", lvl: logrus.FatalLevel},
{msg: "Error creating Redis backend: ", lvl: logrus.FatalLevel},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In practice, logrus.FatalLevel stops execution. Under this scenario, we would only see the first entry in the logs:

148         {
149             desc:     "Redis",
150             inConfig: config.Backend{Type: config.BackendRedis},
151             expectedLogEntries: []logEntry{
152                 {msg: "Error creating Redis backend: At least one Host[s] is required.", lvl: logrus.FatalLevel},
153 -               {msg: "Creating Redis backend", lvl: logrus.InfoLevel},
154 -               {msg: "Error creating Redis backend: ", lvl: logrus.FatalLevel},
155             },
156         },
backends/config/config_test.go

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought the same but without those three items the test fail.

Copy link
Contributor

@sebmil-daily sebmil-daily Dec 13, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's because the test function disables the logrus exit functions, so we can have as many log.Fatalf calls without interrupting the test:

func TestNewBaseBackend(t *testing.T) {
	// logrus entries will be recorded to this `hook` object so we can compare and assert them
	hook := logrusTest.NewGlobal()
	defer func() { logrus.StandardLogger().ExitFunc = nil }()
	logrus.StandardLogger().ExitFunc = func(int) {}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, thanks @sebmil-daily

{msg: "Creating Redis backend", lvl: logrus.InfoLevel},
},
},
{
Expand Down
56 changes: 42 additions & 14 deletions backends/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import (
"context"
"crypto/tls"
"strconv"
"strings"
"time"

"github.com/go-redis/redis/v8"
"github.com/prebid/prebid-cache/config"
"github.com/prebid/prebid-cache/utils"
"github.com/redis/go-redis/v9"
log "github.com/sirupsen/logrus"
)

Expand Down Expand Up @@ -47,26 +48,49 @@ type RedisBackend struct {

// NewRedisBackend initializes the redis client and pings to make sure connection was successful
func NewRedisBackend(cfg config.Redis, ctx context.Context) *RedisBackend {
constr := cfg.Host + ":" + strconv.Itoa(cfg.Port)

options := &redis.Options{
Addr: constr,
Password: cfg.Password,
DB: cfg.Db,
if len(cfg.SentinelHostsPorts) < 1 || cfg.Host == "" {
log.Fatalf("Error creating Redis backend: At least one Host[s] is required.")
}

if cfg.TLS.Enabled {
options = &redis.Options{
var redisClient RedisDBClient

sentinel := false

if cfg.SentinelMasterName != "" {
sentinel = true
// Mode failover (sentinel)
log.Info("Creating Redis sentinel backend")
options := &redis.FailoverOptions{
MasterName: cfg.SentinelMasterName,
SentinelAddrs: cfg.SentinelHostsPorts,
DB: cfg.Db,
Password: cfg.Password,
SentinelPassword: cfg.Password,
}

if cfg.TLS.Enabled {
options.TLSConfig = &tls.Config{InsecureSkipVerify: cfg.TLS.InsecureSkipVerify}
}

redisClient = RedisDBClient{client: redis.NewFailoverClient(options)}
} else {
// Mode single
log.Info("Creating Redis backend")
constr := cfg.Host + ":" + strconv.Itoa(cfg.Port)
options := &redis.Options{
Addr: constr,
Password: cfg.Password,
DB: cfg.Db,
TLSConfig: &tls.Config{
InsecureSkipVerify: cfg.TLS.InsecureSkipVerify,
},
}
}

redisClient := RedisDBClient{client: redis.NewClient(options)}
if cfg.TLS.Enabled {
options.TLSConfig = &tls.Config{InsecureSkipVerify: cfg.TLS.InsecureSkipVerify}
}

redisClient = RedisDBClient{client: redis.NewClient(options)}

}

_, err := redisClient.client.Ping(ctx).Result()

Expand All @@ -75,7 +99,11 @@ func NewRedisBackend(cfg config.Redis, ctx context.Context) *RedisBackend {
panic("RedisBackend failure. This shouldn't happen.")
}

log.Infof("Connected to Redis at %s:%d", cfg.Host, cfg.Port)
if sentinel {
log.Infof("Connected to Redis: %s", strings.Join(cfg.SentinelHostsPorts, ","))
} else {
log.Infof("Connected to Redis: %s:%v", cfg.Host, cfg.Port)
}

return &RedisBackend{
cfg: cfg,
Expand Down
2 changes: 1 addition & 1 deletion backends/redis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import (
"errors"
"testing"

"github.com/go-redis/redis/v8"
"github.com/prebid/prebid-cache/utils"
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/assert"
)

Expand Down
23 changes: 15 additions & 8 deletions config/backends.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,14 @@ func (cfg *Memcache) validateAndLog() error {
}

type Redis struct {
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Password string `mapstructure:"password"`
Db int `mapstructure:"db"`
ExpirationMinutes int `mapstructure:"expiration"`
TLS RedisTLS `mapstructure:"tls"`
Host string `mapstructure:"host"`
Port int `mapstructure:"port"`
Password string `mapstructure:"password"`
Db int `mapstructure:"db"`
ExpirationMinutes int `mapstructure:"expiration"`
TLS RedisTLS `mapstructure:"tls"`
SentinelHostsPorts []string `mapstructure:"sentinel_hosts_ports"`
SentinelMasterName string `mapstructure:"sentinel_mastername"`
}

type RedisTLS struct {
Expand All @@ -165,8 +167,13 @@ type RedisTLS struct {
}

func (cfg *Redis) validateAndLog() error {
log.Infof("config.backend.redis.host: %s", cfg.Host)
log.Infof("config.backend.redis.port: %d", cfg.Port)
if cfg.Host != "" && len(cfg.SentinelHostsPorts) > 0 {
log.Infof("config.backend.redis.sentinel_hosts_ports: %s. Note that redis 'host' will be ignore if 'sentinel_hosts_ports' is define", cfg.SentinelHostsPorts)
log.Infof("config.backend.redis.sentinel_mastername: %s.", cfg.SentinelMasterName)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cyrinux thank you for your addresing our feedback. When we want to configure Redis in Sentinel mode, is SentinelMasterName a required field? In other words, if len(cfg.SentinelHostsPorts) > 0 is true, do we also need cfg.SentinelMasterName to not be empty?

If we do, then I believe an extra cfg.SentinelMasterName != "" check should be added in case len(cfg.SentinelHostsPorts) > 0 is found to be true and log.Infof() or error out accordingly.

Thoughts?

} else {
log.Infof("config.backend.redis.host: %s", cfg.Host)
log.Infof("config.backend.redis.port: %d", cfg.Port)
}
log.Infof("config.backend.redis.db: %d", cfg.Db)
if cfg.ExpirationMinutes > 0 {
log.Infof("config.backend.redis.expiration: %d. Note that this configuration option is being deprecated in favor of config.request_limits.max_ttl_seconds", cfg.ExpirationMinutes)
Expand Down
2 changes: 2 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ func setConfigDefaults(v *viper.Viper) {
v.SetDefault("backend.cassandra.default_ttl_seconds", utils.CASSANDRA_DEFAULT_TTL_SECONDS)
v.SetDefault("backend.memcache.hosts", []string{})
v.SetDefault("backend.redis.host", "")
v.SetDefault("backend.redis.sentinel_hosts_ports", []string{})
v.SetDefault("backend.redis.sentinel_mastername", "")
v.SetDefault("backend.redis.port", 0)
v.SetDefault("backend.redis.password", "")
v.SetDefault("backend.redis.db", 0)
Expand Down
17 changes: 11 additions & 6 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1202,7 +1202,8 @@ func getExpectedDefaultConfig() Configuration {
DefaultTTL: utils.CASSANDRA_DEFAULT_TTL_SECONDS,
},
Redis: Redis{
ExpirationMinutes: utils.REDIS_DEFAULT_EXPIRATION_MINUTES,
SentinelHostsPorts: []string{},
ExpirationMinutes: utils.REDIS_DEFAULT_EXPIRATION_MINUTES,
},
Ignite: Ignite{
Headers: map[string]string{},
Expand Down Expand Up @@ -1267,11 +1268,15 @@ func getExpectedFullConfigForTestFile() Configuration {
Hosts: []string{"10.0.0.1:11211", "127.0.0.1"},
},
Redis: Redis{
Host: "127.0.0.1",
Port: 6379,
Password: "redis-password",
Db: 1,
ExpirationMinutes: 1,
Host: "127.0.0.1",
Port: 6379,
SentinelHostsPorts: []string{
"10.0.0.1:26379", "127.0.0.1",
},
SentinelMasterName: "mymaster",
Password: "redis-password",
Db: 1,
ExpirationMinutes: 1,
TLS: RedisTLS{
Enabled: false,
InsecureSkipVerify: false,
Expand Down
6 changes: 5 additions & 1 deletion config/configtest/sample_full_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ backend:
keyspace: "prebid"
default_ttl_seconds: 60
memcache:
hosts: ["10.0.0.1:11211","127.0.0.1"]
hosts: ["10.0.0.1:11211", "127.0.0.1"]
redis:
sentinel_hosts_ports:
- "10.0.0.1:26379"
- "127.0.0.1"
sentinel_mastername: "mymaster"
host: "127.0.0.1"
port: 6379
password: "redis-password"
Expand Down
2 changes: 1 addition & 1 deletion endpoints/put_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"testing"
"time"

"github.com/go-redis/redis/v8"
"github.com/gofrs/uuid"
"github.com/julienschmidt/httprouter"
"github.com/prebid/prebid-cache/backends"
Expand All @@ -26,6 +25,7 @@ import (
"github.com/prebid/prebid-cache/metrics"
"github.com/prebid/prebid-cache/metrics/metricstest"
"github.com/prebid/prebid-cache/utils"
"github.com/redis/go-redis/v9"
"github.com/sirupsen/logrus"
testLogrus "github.com/sirupsen/logrus/hooks/test"
"github.com/spf13/viper"
Expand Down
6 changes: 4 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ go 1.19
require (
github.com/aerospike/aerospike-client-go/v6 v6.7.0
github.com/didip/tollbooth/v6 v6.1.2
github.com/go-redis/redis/v8 v8.11.5
github.com/gocql/gocql v1.0.0
github.com/gofrs/uuid v4.2.0+incompatible
github.com/golang/snappy v0.0.4
Expand All @@ -14,6 +13,7 @@ require (
github.com/prometheus/client_golang v1.12.2
github.com/prometheus/client_model v0.2.0
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
github.com/redis/go-redis/v9 v9.3.0
github.com/rs/cors v1.8.2
github.com/sirupsen/logrus v1.6.0
github.com/spf13/viper v1.11.0
Expand All @@ -24,7 +24,7 @@ require (
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/bitly/go-hostpool v0.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
Expand All @@ -37,6 +37,8 @@ require (
github.com/magiconair/properties v1.8.6 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
github.com/onsi/gomega v1.18.1 // indirect
github.com/pelletier/go-toml v1.9.4 // indirect
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect
github.com/pkg/errors v0.9.1 // indirect
Expand Down
15 changes: 12 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,13 @@ github.com/bitly/go-hostpool v0.1.0 h1:XKmsF6k5el6xHG3WPJ8U0Ku/ye7njX7W81Ng7O2io
github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
Expand Down Expand Up @@ -93,8 +96,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-pkgz/expirable-cache v0.0.3 h1:rTh6qNPp78z0bQE6HDhXBHUwqnV9i09Vm6dksJLXQDc=
github.com/go-pkgz/expirable-cache v0.0.3/go.mod h1:+IauqN00R2FqNRLCLA+X5YljQJrwB179PfiAoMPlTlQ=
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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/gocql/gocql v1.0.0 h1:UnbTERpP72VZ/viKE1Q1gPtmLvyTZTvuAstvSRydw/c=
Expand Down Expand Up @@ -162,6 +163,7 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
Expand Down Expand Up @@ -223,10 +225,14 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0=
Expand Down Expand Up @@ -263,6 +269,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0=
github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U=
github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
Expand Down Expand Up @@ -466,6 +474,7 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
Loading