|
|
@ -22,7 +22,7 @@ import ( |
|
|
|
amsilence "github.com/prometheus/alertmanager/api/v2/client/silence" |
|
|
|
amsilence "github.com/prometheus/alertmanager/api/v2/client/silence" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
type ExternalAlertmanager struct { |
|
|
|
type Alertmanager struct { |
|
|
|
log log.Logger |
|
|
|
log log.Logger |
|
|
|
url string |
|
|
|
url string |
|
|
|
tenantID string |
|
|
|
tenantID string |
|
|
@ -32,14 +32,14 @@ type ExternalAlertmanager struct { |
|
|
|
defaultConfig string |
|
|
|
defaultConfig string |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
type ExternalAlertmanagerConfig struct { |
|
|
|
type AlertmanagerConfig struct { |
|
|
|
URL string |
|
|
|
URL string |
|
|
|
TenantID string |
|
|
|
TenantID string |
|
|
|
BasicAuthPassword string |
|
|
|
BasicAuthPassword string |
|
|
|
DefaultConfig string |
|
|
|
DefaultConfig string |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func NewExternalAlertmanager(cfg ExternalAlertmanagerConfig, orgID int64) (*ExternalAlertmanager, error) { |
|
|
|
func NewAlertmanager(cfg AlertmanagerConfig, orgID int64) (*Alertmanager, error) { |
|
|
|
client := http.Client{ |
|
|
|
client := http.Client{ |
|
|
|
Transport: &roundTripper{ |
|
|
|
Transport: &roundTripper{ |
|
|
|
tenantID: cfg.TenantID, |
|
|
|
tenantID: cfg.TenantID, |
|
|
@ -65,7 +65,7 @@ func NewExternalAlertmanager(cfg ExternalAlertmanagerConfig, orgID int64) (*Exte |
|
|
|
return nil, err |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return &ExternalAlertmanager{ |
|
|
|
return &Alertmanager{ |
|
|
|
amClient: amclient.New(transport, nil), |
|
|
|
amClient: amclient.New(transport, nil), |
|
|
|
httpClient: &client, |
|
|
|
httpClient: &client, |
|
|
|
log: log.New("ngalert.notifier.external-alertmanager"), |
|
|
|
log: log.New("ngalert.notifier.external-alertmanager"), |
|
|
@ -76,19 +76,19 @@ func NewExternalAlertmanager(cfg ExternalAlertmanagerConfig, orgID int64) (*Exte |
|
|
|
}, nil |
|
|
|
}, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) ApplyConfig(ctx context.Context, config *models.AlertConfiguration) error { |
|
|
|
func (am *Alertmanager) ApplyConfig(ctx context.Context, config *models.AlertConfiguration) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) SaveAndApplyConfig(ctx context.Context, cfg *apimodels.PostableUserConfig) error { |
|
|
|
func (am *Alertmanager) SaveAndApplyConfig(ctx context.Context, cfg *apimodels.PostableUserConfig) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) SaveAndApplyDefaultConfig(ctx context.Context) error { |
|
|
|
func (am *Alertmanager) SaveAndApplyDefaultConfig(ctx context.Context) error { |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) CreateSilence(ctx context.Context, silence *apimodels.PostableSilence) (string, error) { |
|
|
|
func (am *Alertmanager) CreateSilence(ctx context.Context, silence *apimodels.PostableSilence) (string, error) { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while creating silence", "err", r) |
|
|
|
am.log.Error("Panic while creating silence", "err", r) |
|
|
@ -104,7 +104,7 @@ func (am *ExternalAlertmanager) CreateSilence(ctx context.Context, silence *apim |
|
|
|
return res.Payload.SilenceID, nil |
|
|
|
return res.Payload.SilenceID, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) DeleteSilence(ctx context.Context, silenceID string) error { |
|
|
|
func (am *Alertmanager) DeleteSilence(ctx context.Context, silenceID string) error { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while deleting silence", "err", r) |
|
|
|
am.log.Error("Panic while deleting silence", "err", r) |
|
|
@ -119,7 +119,7 @@ func (am *ExternalAlertmanager) DeleteSilence(ctx context.Context, silenceID str |
|
|
|
return nil |
|
|
|
return nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) GetSilence(ctx context.Context, silenceID string) (apimodels.GettableSilence, error) { |
|
|
|
func (am *Alertmanager) GetSilence(ctx context.Context, silenceID string) (apimodels.GettableSilence, error) { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while getting silence", "err", r) |
|
|
|
am.log.Error("Panic while getting silence", "err", r) |
|
|
@ -135,7 +135,7 @@ func (am *ExternalAlertmanager) GetSilence(ctx context.Context, silenceID string |
|
|
|
return *res.Payload, nil |
|
|
|
return *res.Payload, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) ListSilences(ctx context.Context, filter []string) (apimodels.GettableSilences, error) { |
|
|
|
func (am *Alertmanager) ListSilences(ctx context.Context, filter []string) (apimodels.GettableSilences, error) { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while listing silences", "err", r) |
|
|
|
am.log.Error("Panic while listing silences", "err", r) |
|
|
@ -151,7 +151,7 @@ func (am *ExternalAlertmanager) ListSilences(ctx context.Context, filter []strin |
|
|
|
return res.Payload, nil |
|
|
|
return res.Payload, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) GetAlerts(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.GettableAlerts, error) { |
|
|
|
func (am *Alertmanager) GetAlerts(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.GettableAlerts, error) { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while getting alerts", "err", r) |
|
|
|
am.log.Error("Panic while getting alerts", "err", r) |
|
|
@ -173,7 +173,7 @@ func (am *ExternalAlertmanager) GetAlerts(ctx context.Context, active, silenced, |
|
|
|
return res.Payload, nil |
|
|
|
return res.Payload, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) GetAlertGroups(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.AlertGroups, error) { |
|
|
|
func (am *Alertmanager) GetAlertGroups(ctx context.Context, active, silenced, inhibited bool, filter []string, receiver string) (apimodels.AlertGroups, error) { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while getting alert groups", "err", r) |
|
|
|
am.log.Error("Panic while getting alert groups", "err", r) |
|
|
@ -198,7 +198,7 @@ func (am *ExternalAlertmanager) GetAlertGroups(ctx context.Context, active, sile |
|
|
|
// TODO: implement PutAlerts in a way that is similar to what Prometheus does.
|
|
|
|
// TODO: implement PutAlerts in a way that is similar to what Prometheus does.
|
|
|
|
// This current implementation is only good for testing methods that retrieve alerts from the remote Alertmanager.
|
|
|
|
// This current implementation is only good for testing methods that retrieve alerts from the remote Alertmanager.
|
|
|
|
// More details in issue https://github.com/grafana/grafana/issues/76692
|
|
|
|
// More details in issue https://github.com/grafana/grafana/issues/76692
|
|
|
|
func (am *ExternalAlertmanager) PutAlerts(ctx context.Context, postableAlerts apimodels.PostableAlerts) error { |
|
|
|
func (am *Alertmanager) PutAlerts(ctx context.Context, postableAlerts apimodels.PostableAlerts) error { |
|
|
|
defer func() { |
|
|
|
defer func() { |
|
|
|
if r := recover(); r != nil { |
|
|
|
if r := recover(); r != nil { |
|
|
|
am.log.Error("Panic while putting alerts", "err", r) |
|
|
|
am.log.Error("Panic while putting alerts", "err", r) |
|
|
@ -220,11 +220,11 @@ func (am *ExternalAlertmanager) PutAlerts(ctx context.Context, postableAlerts ap |
|
|
|
return err |
|
|
|
return err |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) GetStatus() apimodels.GettableStatus { |
|
|
|
func (am *Alertmanager) GetStatus() apimodels.GettableStatus { |
|
|
|
return apimodels.GettableStatus{} |
|
|
|
return apimodels.GettableStatus{} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) GetReceivers(ctx context.Context) ([]apimodels.Receiver, error) { |
|
|
|
func (am *Alertmanager) GetReceivers(ctx context.Context) ([]apimodels.Receiver, error) { |
|
|
|
params := amreceiver.NewGetReceiversParamsWithContext(ctx) |
|
|
|
params := amreceiver.NewGetReceiversParamsWithContext(ctx) |
|
|
|
res, err := am.amClient.Receiver.GetReceivers(params) |
|
|
|
res, err := am.amClient.Receiver.GetReceivers(params) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
@ -238,30 +238,30 @@ func (am *ExternalAlertmanager) GetReceivers(ctx context.Context) ([]apimodels.R |
|
|
|
return rcvs, nil |
|
|
|
return rcvs, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) TestReceivers(ctx context.Context, c apimodels.TestReceiversConfigBodyParams) (*notifier.TestReceiversResult, error) { |
|
|
|
func (am *Alertmanager) TestReceivers(ctx context.Context, c apimodels.TestReceiversConfigBodyParams) (*notifier.TestReceiversResult, error) { |
|
|
|
return ¬ifier.TestReceiversResult{}, nil |
|
|
|
return ¬ifier.TestReceiversResult{}, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) TestTemplate(ctx context.Context, c apimodels.TestTemplatesConfigBodyParams) (*notifier.TestTemplatesResults, error) { |
|
|
|
func (am *Alertmanager) TestTemplate(ctx context.Context, c apimodels.TestTemplatesConfigBodyParams) (*notifier.TestTemplatesResults, error) { |
|
|
|
return ¬ifier.TestTemplatesResults{}, nil |
|
|
|
return ¬ifier.TestTemplatesResults{}, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) StopAndWait() { |
|
|
|
func (am *Alertmanager) StopAndWait() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) Ready() bool { |
|
|
|
func (am *Alertmanager) Ready() bool { |
|
|
|
return false |
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) FileStore() *notifier.FileStore { |
|
|
|
func (am *Alertmanager) FileStore() *notifier.FileStore { |
|
|
|
return ¬ifier.FileStore{} |
|
|
|
return ¬ifier.FileStore{} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) OrgID() int64 { |
|
|
|
func (am *Alertmanager) OrgID() int64 { |
|
|
|
return am.orgID |
|
|
|
return am.orgID |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (am *ExternalAlertmanager) ConfigHash() [16]byte { |
|
|
|
func (am *Alertmanager) ConfigHash() [16]byte { |
|
|
|
return [16]byte{} |
|
|
|
return [16]byte{} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -283,7 +283,7 @@ func (r *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: change implementation, this is only useful for testing other methods.
|
|
|
|
// TODO: change implementation, this is only useful for testing other methods.
|
|
|
|
func (am *ExternalAlertmanager) postConfig(ctx context.Context, rawConfig string) error { |
|
|
|
func (am *Alertmanager) postConfig(ctx context.Context, rawConfig string) error { |
|
|
|
alertsURL := strings.TrimSuffix(am.url, "/alertmanager") + "/api/v1/alerts" |
|
|
|
alertsURL := strings.TrimSuffix(am.url, "/alertmanager") + "/api/v1/alerts" |
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, alertsURL, strings.NewReader(rawConfig)) |
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, alertsURL, strings.NewReader(rawConfig)) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |