support redis sentinel config

This commit is contained in:
linhbkhn95
2022-05-03 11:46:44 +07:00
parent 9796da746b
commit 4e46a15e1c
2 changed files with 31 additions and 21 deletions

View File

@@ -96,16 +96,18 @@ docker run hibiken/asynqmon --help
Here's the available flags: Here's the available flags:
_Note_: Use `--redis-url` to specify address, db-number, and password with one flag value; Alternatively, use `--redis-addr`, `--redis-db`, and `--redis-password` to specify each value. _Note_: Use `--redis-url` to specify address, db-number, and password with one flag value; Alternatively, use `--redis-addrs`, `--redis-db`, and `--redis-password` to specify each value.
| Flag | Env | Description | Default | | Flag | Env | Description | Default |
| --------------------------------- | ------------------------- | ------------------------------------------------------------------- | ---------------- | | --------------------------------- | ------------------------- | ------------------------------------------------------------------- | ---------------- |
| `--port`(int) | `PORT` | port number to use for web ui server | 8080 | | `--port`(int) | `PORT` | port number to use for web ui server | 8080 |
| `---redis-url`(string) | `REDIS_URL` | URL to redis server | "" | | `--redis-url`(string) m | `REDIS_URL` | URL to redis server | "" |
| `--redis-addr`(string) | `REDIS_ADDR` | address of redis server to connect to | "127.0.0.1:6379" | | `--redis-addr`(string)(Deprecated)| `REDIS_ADDR` | address of redis server to connect to | "127.0.0.1:6379" |
| `--redis-addrs`(string) | `REDIS_ADDRS` | comma separated list of host:port addresses | "127.0.0.1:6379" |
| `--redis-master-name`(string) | `REDIS_MASTER_NAME` | redis master name for redis sentinel | "" |
| `--redis-db`(int) | `REDIS_DB` | redis database number | 0 | | `--redis-db`(int) | `REDIS_DB` | redis database number | 0 |
| `--redis-password`(string) | `REDIS_PASSWORD` | password to use when connecting to redis server | "" | | `--redis-password`(string) | `REDIS_PASSWORD` | password to use when connecting to redis server | "" |
| `--redis-cluster-nodes`(string) | `REDIS_CLUSTER_NODES` | comma separated list of host:port addresses of cluster nodes | "" | | `--redis-cluster-nodes`(string)(Deprecated) | `REDIS_CLUSTER_NODES` | comma separated list of host:port addresses of cluster nodes | "" |
| `--redis-tls`(string) | `REDIS_TLS` | server name for TLS validation used when connecting to redis server | "" | | `--redis-tls`(string) | `REDIS_TLS` | server name for TLS validation used when connecting to redis server | "" |
| `--redis-insecure-tls`(bool) | `REDIS_INSECURE_TLS` | disable TLS certificate host checks | false | | `--redis-insecure-tls`(bool) | `REDIS_INSECURE_TLS` | disable TLS certificate host checks | false |
| `--enable-metrics-exporter`(bool) | `ENABLE_METRICS_EXPORTER` | enable prometheus metrics exporter to expose queue metrics | false | | `--enable-metrics-exporter`(bool) | `ENABLE_METRICS_EXPORTER` | enable prometheus metrics exporter to expose queue metrics | false |
@@ -128,7 +130,10 @@ The address can be specified via `--prometheus-addr`. This enables the metrics v
```bash ```bash
# with a local binary; custom port and connect to redis server at localhost:6380 # with a local binary; custom port and connect to redis server at localhost:6380
./asynqmon --port=3000 --redis-addr=localhost:6380 ./asynqmon --port=3000 --redis-addrs=localhost:6380
# for redis sentinel local binary
./asynqmon --port=3000 --redis-addrs=localhost:26379 --redis-master-name=mymaster
# with prometheus integration enabled # with prometheus integration enabled
./asynqmon --enable-metrics-exporter --prometheus-addr=http://localhost:9090 ./asynqmon --enable-metrics-exporter --prometheus-addr=http://localhost:9090
@@ -137,14 +142,14 @@ The address can be specified via `--prometheus-addr`. This enables the metrics v
docker run --rm \ docker run --rm \
--name asynqmon \ --name asynqmon \
-p 3000:3000 \ -p 3000:3000 \
hibiken/asynqmon --port=3000 --redis-addr=host.docker.internal:6380 hibiken/asynqmon --port=3000 --redis-addrs=host.docker.internal:6380
# with Docker (connect to a Redis server running in the Docker container) # with Docker (connect to a Redis server running in the Docker container)
docker run --rm \ docker run --rm \
--name asynqmon \ --name asynqmon \
--network dev-network \ --network dev-network \
-p 8080:8080 \ -p 8080:8080 \
hibiken/asynqmon --redis-addr=dev-redis:6379 hibiken/asynqmon --redis-addrs=dev-redis:6379
``` ```
Next, go to [localhost:8080](http://localhost:8080) and see Asynqmon dashboard: Next, go to [localhost:8080](http://localhost:8080) and see Asynqmon dashboard:

View File

@@ -23,29 +23,32 @@ import (
// Command-line flags // Command-line flags
var ( var (
flagPort int flagPort int
flagRedisAddr string flagRedisAddrs string
flagRedisDB int flagRedisDB int
flagRedisPassword string flagRedisPassword string
flagRedisTLS string flagRedisTLS string
flagRedisURL string flagRedisURL string
flagRedisInsecureTLS bool flagRedisInsecureTLS bool
flagRedisClusterNodes string flagRedisSentinels string
flagMaxPayloadLength int flagMaxPayloadLength int
flagMaxResultLength int flagMaxResultLength int
flagEnableMetricsExporter bool flagEnableMetricsExporter bool
flagPrometheusServerAddr string flagPrometheusServerAddr string
flagReadOnly bool flagReadOnly bool
flagMasterName string
) )
func init() { func init() {
flag.IntVar(&flagPort, "port", getEnvOrDefaultInt("PORT", 8080), "port number to use for web ui server") flag.IntVar(&flagPort, "port", getEnvOrDefaultInt("PORT", 8080), "port number to use for web ui server")
flag.StringVar(&flagRedisAddr, "redis-addr", getEnvDefaultString("REDIS_ADDR", "127.0.0.1:6379"), "address of redis server to connect to") flag.StringVar(&flagRedisAddrs, "redis-addrs", getEnvDefaultString("REDIS_ADDRS", "127.0.0.1:6379"), "comma separated list of host:port addresses")
flag.IntVar(&flagRedisDB, "redis-db", getEnvOrDefaultInt("REDIS_DB", 0), "redis database number") flag.IntVar(&flagRedisDB, "redis-db", getEnvOrDefaultInt("REDIS_DB", 0), "redis database number")
flag.StringVar(&flagMasterName, "redis-master-name", getEnvDefaultString("REDIS_MASTER_NAME", ""), "redis master name for redis sentinel")
flag.StringVar(&flagRedisPassword, "redis-password", getEnvDefaultString("REDIS_PASSWORD", ""), "password to use when connecting to redis server") flag.StringVar(&flagRedisPassword, "redis-password", getEnvDefaultString("REDIS_PASSWORD", ""), "password to use when connecting to redis server")
flag.StringVar(&flagRedisTLS, "redis-tls", getEnvDefaultString("REDIS_TLS", ""), "server name for TLS validation used when connecting to redis server") flag.StringVar(&flagRedisTLS, "redis-tls", getEnvDefaultString("REDIS_TLS", ""), "server name for TLS validation used when connecting to redis server")
flag.StringVar(&flagRedisURL, "redis-url", getEnvDefaultString("REDIS_URL", ""), "URL to redis server") flag.StringVar(&flagRedisURL, "redis-url", getEnvDefaultString("REDIS_URL", ""), "URL to redis server")
flag.BoolVar(&flagRedisInsecureTLS, "redis-insecure-tls", getEnvOrDefaultBool("REDIS_INSECURE_TLS", false), "disable TLS certificate host checks") flag.BoolVar(&flagRedisInsecureTLS, "redis-insecure-tls", getEnvOrDefaultBool("REDIS_INSECURE_TLS", false), "disable TLS certificate host checks")
flag.StringVar(&flagRedisClusterNodes, "redis-cluster-nodes", getEnvDefaultString("REDIS_CLUSTER_NODES", ""), "comma separated list of host:port addresses of cluster nodes") flag.StringVar(&flagRedisSentinels, "redis-sentinels", getEnvDefaultString("REDIS_SENTINELS", ""), "comma separated list of host:port addresses of cluster nodes")
flag.IntVar(&flagMaxPayloadLength, "max-payload-length", getEnvOrDefaultInt("MAX_PAYLOAD_LENGTH", 200), "maximum number of utf8 characters printed in the payload cell in the Web UI") flag.IntVar(&flagMaxPayloadLength, "max-payload-length", getEnvOrDefaultInt("MAX_PAYLOAD_LENGTH", 200), "maximum number of utf8 characters printed in the payload cell in the Web UI")
flag.IntVar(&flagMaxResultLength, "max-result-length", getEnvOrDefaultInt("MAX_RESULT_LENGTH", 200), "maximum number of utf8 characters printed in the result cell in the Web UI") flag.IntVar(&flagMaxResultLength, "max-result-length", getEnvOrDefaultInt("MAX_RESULT_LENGTH", 200), "maximum number of utf8 characters printed in the result cell in the Web UI")
flag.BoolVar(&flagEnableMetricsExporter, "enable-metrics-exporter", getEnvOrDefaultBool("ENABLE_METRICS_EXPORTER", false), "enable prometheus metrics exporter to expose queue metrics") flag.BoolVar(&flagEnableMetricsExporter, "enable-metrics-exporter", getEnvOrDefaultBool("ENABLE_METRICS_EXPORTER", false), "enable prometheus metrics exporter to expose queue metrics")
@@ -57,9 +60,8 @@ func init() {
// IDEA: https://eli.thegreenplace.net/2020/testing-flag-parsing-in-go-programs/ // IDEA: https://eli.thegreenplace.net/2020/testing-flag-parsing-in-go-programs/
func getRedisOptionsFromFlags() (asynq.RedisConnOpt, error) { func getRedisOptionsFromFlags() (asynq.RedisConnOpt, error) {
var opts redis.UniversalOptions var opts redis.UniversalOptions
if flagRedisAddrs != "" {
if flagRedisClusterNodes != "" { opts.Addrs = strings.Split(flagRedisAddrs, ",")
opts.Addrs = strings.Split(flagRedisClusterNodes, ",")
opts.Password = flagRedisPassword opts.Password = flagRedisPassword
} else { } else {
if flagRedisURL != "" { if flagRedisURL != "" {
@@ -70,11 +72,6 @@ func getRedisOptionsFromFlags() (asynq.RedisConnOpt, error) {
opts.Addrs = append(opts.Addrs, res.Addr) opts.Addrs = append(opts.Addrs, res.Addr)
opts.DB = res.DB opts.DB = res.DB
opts.Password = res.Password opts.Password = res.Password
} else {
opts.Addrs = []string{flagRedisAddr}
opts.DB = flagRedisDB
opts.Password = flagRedisPassword
} }
} }
@@ -87,14 +84,22 @@ func getRedisOptionsFromFlags() (asynq.RedisConnOpt, error) {
} }
opts.TLSConfig.InsecureSkipVerify = true opts.TLSConfig.InsecureSkipVerify = true
} }
if flagMasterName != "" {
if flagRedisClusterNodes != "" { return asynq.RedisFailoverClientOpt{
SentinelAddrs: opts.Addrs,
MasterName: flagMasterName,
Password: opts.Password,
TLSConfig: opts.TLSConfig,
}, nil
}
if len(flagRedisAddrs) > 1 {
return asynq.RedisClusterClientOpt{ return asynq.RedisClusterClientOpt{
Addrs: opts.Addrs, Addrs: opts.Addrs,
Password: opts.Password, Password: opts.Password,
TLSConfig: opts.TLSConfig, TLSConfig: opts.TLSConfig,
}, nil }, nil
} }
return asynq.RedisClientOpt{ return asynq.RedisClientOpt{
Addr: opts.Addrs[0], Addr: opts.Addrs[0],
DB: opts.DB, DB: opts.DB,