@ -8,10 +8,13 @@ import (
httptransport "github.com/go-openapi/runtime/client"
httptransport "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/strfmt"
alertingNotify "github.com/grafana/alerting/notify"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/log"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
"github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/services/ngalert/models"
amclient "github.com/prometheus/alertmanager/api/v2/client"
amclient "github.com/prometheus/alertmanager/api/v2/client"
amalert "github.com/prometheus/alertmanager/api/v2/client/alert"
amalertgroup "github.com/prometheus/alertmanager/api/v2/client/alertgroup"
amsilence "github.com/prometheus/alertmanager/api/v2/client/silence"
amsilence "github.com/prometheus/alertmanager/api/v2/client/silence"
)
)
@ -69,6 +72,10 @@ func newExternalAlertmanager(cfg externalAlertmanagerConfig, orgID int64) (*exte
} , nil
} , nil
}
}
func ( am * externalAlertmanager ) ApplyConfig ( ctx context . Context , config * models . AlertConfiguration ) error {
return nil
}
func ( am * externalAlertmanager ) SaveAndApplyConfig ( ctx context . Context , cfg * apimodels . PostableUserConfig ) error {
func ( am * externalAlertmanager ) SaveAndApplyConfig ( ctx context . Context , cfg * apimodels . PostableUserConfig ) error {
return nil
return nil
}
}
@ -78,6 +85,12 @@ func (am *externalAlertmanager) SaveAndApplyDefaultConfig(ctx context.Context) e
}
}
func ( am * externalAlertmanager ) CreateSilence ( ctx context . Context , silence * apimodels . PostableSilence ) ( string , error ) {
func ( am * externalAlertmanager ) CreateSilence ( ctx context . Context , silence * apimodels . PostableSilence ) ( string , error ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while creating silence" , "err" , r )
}
} ( )
params := amsilence . NewPostSilencesParamsWithContext ( ctx ) . WithSilence ( silence )
params := amsilence . NewPostSilencesParamsWithContext ( ctx ) . WithSilence ( silence )
res , err := am . amClient . Silence . PostSilences ( params )
res , err := am . amClient . Silence . PostSilences ( params )
if err != nil {
if err != nil {
@ -88,6 +101,12 @@ func (am *externalAlertmanager) CreateSilence(ctx context.Context, silence *apim
}
}
func ( am * externalAlertmanager ) DeleteSilence ( ctx context . Context , silenceID string ) error {
func ( am * externalAlertmanager ) DeleteSilence ( ctx context . Context , silenceID string ) error {
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while deleting silence" , "err" , r )
}
} ( )
params := amsilence . NewDeleteSilenceParamsWithContext ( ctx ) . WithSilenceID ( strfmt . UUID ( silenceID ) )
params := amsilence . NewDeleteSilenceParamsWithContext ( ctx ) . WithSilenceID ( strfmt . UUID ( silenceID ) )
_ , err := am . amClient . Silence . DeleteSilence ( params )
_ , err := am . amClient . Silence . DeleteSilence ( params )
if err != nil {
if err != nil {
@ -97,21 +116,28 @@ func (am *externalAlertmanager) DeleteSilence(ctx context.Context, silenceID str
}
}
func ( am * externalAlertmanager ) GetSilence ( ctx context . Context , silenceID string ) ( apimodels . GettableSilence , error ) {
func ( am * externalAlertmanager ) GetSilence ( ctx context . Context , silenceID string ) ( apimodels . GettableSilence , error ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while getting silence" , "err" , r )
}
} ( )
params := amsilence . NewGetSilenceParamsWithContext ( ctx ) . WithSilenceID ( strfmt . UUID ( silenceID ) )
params := amsilence . NewGetSilenceParamsWithContext ( ctx ) . WithSilenceID ( strfmt . UUID ( silenceID ) )
res , err := am . amClient . Silence . GetSilence ( params )
res , err := am . amClient . Silence . GetSilence ( params )
if err != nil {
if err != nil {
return apimodels . GettableSilence { } , err
return apimodels . GettableSilence { } , err
}
}
if res != nil {
return * res . Payload , nil
return * res . Payload , nil
}
// In theory, this should never happen as is not possible for GetSilence to return an empty payload but no error.
return apimodels . GettableSilence { } , fmt . Errorf ( "unexpected error while trying to fetch silence: %s" , silenceID )
}
}
func ( am * externalAlertmanager ) ListSilences ( ctx context . Context , filter [ ] string ) ( apimodels . GettableSilences , error ) {
func ( am * externalAlertmanager ) ListSilences ( ctx context . Context , filter [ ] string ) ( apimodels . GettableSilences , error ) {
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while listing silences" , "err" , r )
}
} ( )
params := amsilence . NewGetSilencesParamsWithContext ( ctx ) . WithFilter ( filter )
params := amsilence . NewGetSilencesParamsWithContext ( ctx ) . WithFilter ( filter )
res , err := am . amClient . Silence . GetSilences ( params )
res , err := am . amClient . Silence . GetSilences ( params )
if err != nil {
if err != nil {
@ -121,30 +147,83 @@ func (am *externalAlertmanager) ListSilences(ctx context.Context, filter []strin
return res . Payload , nil
return res . Payload , nil
}
}
func ( am * externalAlertmanager ) GetStatus ( ) apimodels . GettableStatus {
func ( am * externalAlertmanager ) GetAlerts ( ctx context . Context , active , silenced , inhibited bool , filter [ ] string , receiver string ) ( apimodels . GettableAlerts , error ) {
return apimodels . GettableStatus { }
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while getting alerts" , "err" , r )
}
} ( )
params := amalert . NewGetAlertsParamsWithContext ( ctx ) .
WithActive ( & active ) .
WithSilenced ( & silenced ) .
WithInhibited ( & inhibited ) .
WithFilter ( filter ) .
WithReceiver ( & receiver )
res , err := am . amClient . Alert . GetAlerts ( params )
if err != nil {
return apimodels . GettableAlerts { } , err
}
return res . Payload , nil
}
}
func ( am * externalAlertmanager ) GetAlerts ( active , silenced , inhibited bool , filter [ ] string , receiver string ) ( apimodels . GettableAlerts , error ) {
func ( am * externalAlertmanager ) GetAlertGroups ( ctx context . Context , active , silenced , inhibited bool , filter [ ] string , receiver string ) ( apimodels . AlertGroups , error ) {
return apimodels . GettableAlerts { } , nil
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while getting alert groups" , "err" , r )
}
} ( )
params := amalertgroup . NewGetAlertGroupsParamsWithContext ( ctx ) .
WithActive ( & active ) .
WithSilenced ( & silenced ) .
WithInhibited ( & inhibited ) .
WithFilter ( filter ) .
WithReceiver ( & receiver )
res , err := am . amClient . Alertgroup . GetAlertGroups ( params )
if err != nil {
return apimodels . AlertGroups { } , err
}
return res . Payload , nil
}
}
func ( am * externalAlertmanager ) GetAlertGroups ( active , silenced , inhibited bool , filter [ ] string , receiver string ) ( apimodels . AlertGroups , error ) {
// TODO: implement PutAlerts in a way that is similar to what Prometheus does.
return apimodels . AlertGroups { } , nil
// 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
func ( am * externalAlertmanager ) PutAlerts ( ctx context . Context , postableAlerts apimodels . PostableAlerts ) error {
defer func ( ) {
if r := recover ( ) ; r != nil {
am . log . Error ( "Panic while putting alerts" , "err" , r )
}
} ( )
alerts := make ( alertingNotify . PostableAlerts , 0 , len ( postableAlerts . PostableAlerts ) )
for _ , pa := range postableAlerts . PostableAlerts {
alerts = append ( alerts , & alertingNotify . PostableAlert {
Annotations : pa . Annotations ,
EndsAt : pa . EndsAt ,
StartsAt : pa . StartsAt ,
Alert : pa . Alert ,
} )
}
params := amalert . NewPostAlertsParamsWithContext ( ctx ) . WithAlerts ( alerts )
_ , err := am . amClient . Alert . PostAlerts ( params )
return err
}
}
func ( am * externalAlertmanager ) PutAlerts ( postableAlerts apimodels . PostableAlerts ) error {
func ( am * externalAlertmanager ) GetStatus ( ) apimodels . GettableStatus {
return nil
return apimodels . GettableStatus { }
}
}
func ( am * externalAlertmanager ) GetReceivers ( ctx context . Context ) [ ] apimodels . Receiver {
func ( am * externalAlertmanager ) GetReceivers ( ctx context . Context ) [ ] apimodels . Receiver {
return [ ] apimodels . Receiver { }
return [ ] apimodels . Receiver { }
}
}
func ( am * externalAlertmanager ) ApplyConfig ( ctx context . Context , config * models . AlertConfiguration ) error {
return nil
}
func ( am * externalAlertmanager ) TestReceivers ( ctx context . Context , c apimodels . TestReceiversConfigBodyParams ) ( * TestReceiversResult , error ) {
func ( am * externalAlertmanager ) TestReceivers ( ctx context . Context , c apimodels . TestReceiversConfigBodyParams ) ( * TestReceiversResult , error ) {
return & TestReceiversResult { } , nil
return & TestReceiversResult { } , nil
}
}