diff --git a/CHANGELOG.md b/CHANGELOG.md index 002e25974eb..e573ec4e5a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ * `-server.grpc.keepalive.timeout` * [ENHANCEMENT] PostgreSQL: Bump up `github.com/lib/pq` from `v1.0.0` to `v1.3.0` to support PostgreSQL SCRAM-SHA-256 authentication. #2097 * [ENHANCEMENT] Casandra: User no longer need `CREATE` privilege on `` if given keyspace exists. #2032 +* [BUGFIX] Alertmanager: fixed panic upon applying a new config, caused by duplicate metrics registration in the `NewPipelineBuilder` function. #211 * [BUGFIX] Experimental TSDB: fixed `/all_user_stats` and `/api/prom/user_stats` endpoints when using the experimental TSDB blocks storage. #2042 * [BUGFIX] Experimental TSDB: fixed ruler to correctly work with the experimental TSDB blocks storage. #2101 * [BUGFIX] Azure Blob ChunkStore: Fixed issue causing `invalid chunk checksum` errors. #2074 diff --git a/pkg/alertmanager/alertmanager.go b/pkg/alertmanager/alertmanager.go index 8deae314722..6371de0b3bb 100644 --- a/pkg/alertmanager/alertmanager.go +++ b/pkg/alertmanager/alertmanager.go @@ -52,19 +52,20 @@ type Config struct { // An Alertmanager manages the alerts for one user. type Alertmanager struct { - cfg *Config - api *api.API - logger log.Logger - nflog *nflog.Log - silences *silence.Silences - marker types.Marker - alerts *mem.Alerts - dispatcher *dispatch.Dispatcher - inhibitor *inhibit.Inhibitor - stop chan struct{} - wg sync.WaitGroup - mux *http.ServeMux - registry *prometheus.Registry + cfg *Config + api *api.API + logger log.Logger + nflog *nflog.Log + silences *silence.Silences + marker types.Marker + alerts *mem.Alerts + dispatcher *dispatch.Dispatcher + inhibitor *inhibit.Inhibitor + pipelineBuilder *notify.PipelineBuilder + stop chan struct{} + wg sync.WaitGroup + mux *http.ServeMux + registry *prometheus.Registry } var webReload = make(chan chan error) @@ -130,6 +131,8 @@ func New(cfg *Config) (*Alertmanager, error) { am.silences.SetBroadcast(c.Broadcast) } + am.pipelineBuilder = notify.NewPipelineBuilder(am.registry) + am.wg.Add(1) go func() { am.silences.Maintenance(15*time.Minute, filepath.Join(cfg.DataDir, silencesID), am.stop) @@ -205,8 +208,8 @@ func (am *Alertmanager) ApplyConfig(userID string, conf *config.Config) error { if err != nil { return nil } - pipelineBuilder := notify.NewPipelineBuilder(am.registry) - pipeline := pipelineBuilder.New( + + pipeline := am.pipelineBuilder.New( integrationsMap, waitFunc, am.inhibitor,