Alerting: Limit redis pool size to 5 and make configurable (#74057)

* Limit redis pool size to 5 and expose it in config ini

* Coerce negative pool sizes to the default
pull/74066/head
Alexander Weaver 2 years ago committed by GitHub
parent d8fd4c2cbe
commit dfba94e052
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      conf/defaults.ini
  2. 1
      pkg/services/ngalert/notifier/multiorg_alertmanager.go
  3. 8
      pkg/services/ngalert/notifier/redis_peer.go
  4. 3
      pkg/setting/setting_unified_alerting.go

@ -1063,6 +1063,9 @@ ha_redis_prefix =
# provided, a random one will be generated.
ha_redis_peer_name =
# The maximum number of simultaneous redis connections.
ha_redis_max_conns = 5
# Listen address/hostname and port to receive unified alerting messages for other Grafana instances. The port is used for both TCP and UDP. It is assumed other Grafana instances are also running on the same port.
ha_listen_address = "0.0.0.0:9094"

@ -93,6 +93,7 @@ func (moa *MultiOrgAlertmanager) setupClustering(cfg *setting.Cfg) error {
password: cfg.UnifiedAlerting.HARedisPassword,
username: cfg.UnifiedAlerting.HARedisUsername,
db: cfg.UnifiedAlerting.HARedisDB,
maxConns: cfg.UnifiedAlerting.HARedisMaxConns,
}, clusterLogger, moa.metrics.Registerer, cfg.UnifiedAlerting.HAPushPullInterval)
if err != nil {
return fmt.Errorf("unable to initialize redis: %w", err)

@ -27,6 +27,7 @@ type redisConfig struct {
db int
name string
prefix string
maxConns int
}
const (
@ -44,6 +45,7 @@ const (
reasonRedisIssue = "redis_issue"
heartbeatInterval = time.Second * 5
heartbeatTimeout = time.Minute
defaultPoolSize = 5
// The duration we want to return the members if the network is down.
membersValidFor = time.Minute
)
@ -84,11 +86,17 @@ func newRedisPeer(cfg redisConfig, logger log.Logger, reg prometheus.Registerer,
if cfg.name != "" {
name = cfg.name
}
// Allow zero through, since it'll fall back to go-redis's default.
poolSize := defaultPoolSize
if cfg.maxConns >= 0 {
poolSize = cfg.maxConns
}
rdb := redis.NewClient(&redis.Options{
Addr: cfg.addr,
Username: cfg.username,
Password: cfg.password,
DB: cfg.db,
PoolSize: poolSize,
})
cmd := rdb.Ping(context.Background())
if cmd.Err() != nil {

@ -20,6 +20,7 @@ const (
alertmanagerDefaultGossipInterval = cluster.DefaultGossipInterval
alertmanagerDefaultPushPullInterval = cluster.DefaultPushPullInterval
alertmanagerDefaultConfigPollInterval = time.Minute
alertmanagerRedisDefaultMaxConns = 5
// To start, the alertmanager needs at least one route defined.
// TODO: we should move this to Grafana settings and define this as the default.
alertmanagerDefaultConfiguration = `{
@ -78,6 +79,7 @@ type UnifiedAlertingSettings struct {
HARedisUsername string
HARedisPassword string
HARedisDB int
HARedisMaxConns int
MaxAttempts int64
MinInterval time.Duration
EvaluationTimeout time.Duration
@ -240,6 +242,7 @@ func (cfg *Cfg) ReadUnifiedAlertingSettings(iniFile *ini.File) error {
uaCfg.HARedisUsername = ua.Key("ha_redis_username").MustString("")
uaCfg.HARedisPassword = ua.Key("ha_redis_password").MustString("")
uaCfg.HARedisDB = ua.Key("ha_redis_db").MustInt(0)
uaCfg.HARedisMaxConns = ua.Key("ha_redis_max_conns").MustInt(alertmanagerRedisDefaultMaxConns)
peers := ua.Key("ha_peers").MustString("")
uaCfg.HAPeers = make([]string, 0)
if peers != "" {

Loading…
Cancel
Save