From dd3c3b5857dbaddab5135ab43ccd85352222a734 Mon Sep 17 00:00:00 2001 From: Steve Simpson Date: Fri, 14 Jun 2024 09:19:04 +0200 Subject: [PATCH] Alerting: Update grafana/alerting. (#88914) --- go.mod | 2 +- go.sum | 4 +-- .../api/tooling/definitions/alertmanager.go | 7 ++-- .../alertmanager_mock/Alertmanager.go | 23 +++++++----- .../ngalert/notifier/testreceivers.go | 35 +------------------ pkg/services/ngalert/remote/alertmanager.go | 8 ++--- .../ngalert/remote/alertmanager_test.go | 2 +- .../ngalert/remote/mock/remoteAlertmanager.go | 23 +++++++----- .../alerting/api_notification_channel_test.go | 18 ++++------ 9 files changed, 50 insertions(+), 72 deletions(-) diff --git a/go.mod b/go.mod index 6632a8312cc..2513dd5b37b 100644 --- a/go.mod +++ b/go.mod @@ -86,7 +86,7 @@ require ( github.com/googleapis/gax-go/v2 v2.12.3 // @grafana/grafana-backend-group github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad - github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a // @grafana/alerting-backend + github.com/grafana/alerting v0.0.0-20240607182251-835aff588914 // @grafana/alerting-backend github.com/grafana/authlib v0.0.0-20240611075137-331cbe4e840f // @grafana/identity-access-team github.com/grafana/codejen v0.0.3 // @grafana/dataviz-squad github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code diff --git a/go.sum b/go.sum index 0f04edbd7d5..467b27c4790 100644 --- a/go.sum +++ b/go.sum @@ -2305,8 +2305,8 @@ github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a h1:MvrEgxNxmUqaFWkBtRlbgxStbdD8FcmtjlRp98bmMJU= -github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a/go.mod h1:U7Ta3K4T7jVgqGSYuPsfuPKHFiL2GbCZSHa3nHjmCos= +github.com/grafana/alerting v0.0.0-20240607182251-835aff588914 h1:WXLbSnnomltxdNcE20CI8RD8quZ/L0YpXP0WK+0S1BU= +github.com/grafana/alerting v0.0.0-20240607182251-835aff588914/go.mod h1:U7Ta3K4T7jVgqGSYuPsfuPKHFiL2GbCZSHa3nHjmCos= github.com/grafana/authlib v0.0.0-20240611075137-331cbe4e840f h1:hvRCAv+TgcHu3i/Sd7lFJx84iEtgzDCYuk7OWeXatD0= github.com/grafana/authlib v0.0.0-20240611075137-331cbe4e840f/go.mod h1:+MjD5sxxgLOIvw0ox18wJmjBzz8tOECo7quiiZAmgJY= github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw= diff --git a/pkg/services/ngalert/api/tooling/definitions/alertmanager.go b/pkg/services/ngalert/api/tooling/definitions/alertmanager.go index fd1321bb4d9..044d74c3ba4 100644 --- a/pkg/services/ngalert/api/tooling/definitions/alertmanager.go +++ b/pkg/services/ngalert/api/tooling/definitions/alertmanager.go @@ -15,6 +15,7 @@ import ( "gopkg.in/yaml.v3" "github.com/grafana/alerting/definition" + alertingmodels "github.com/grafana/alerting/models" ) // swagger:route POST /alertmanager/grafana/config/api/v1/alerts alertmanager RoutePostGrafanaAlertingConfig @@ -545,15 +546,15 @@ type AlertGroups = amv2.AlertGroups type AlertGroup = amv2.AlertGroup -type Receiver = amv2.Receiver +type Receiver = alertingmodels.Receiver // swagger:response receiversResponse type ReceiversResponse struct { // in:body - Body []amv2.Receiver + Body []alertingmodels.Receiver } -type Integration = amv2.Integration +type Integration = alertingmodels.Integration // swagger:parameters RouteGetAMAlerts RouteGetAMAlertGroups RouteGetGrafanaAMAlerts RouteGetGrafanaAMAlertGroups type AlertsParams struct { diff --git a/pkg/services/ngalert/notifier/alertmanager_mock/Alertmanager.go b/pkg/services/ngalert/notifier/alertmanager_mock/Alertmanager.go index 82d27daf97f..b0b647233c1 100644 --- a/pkg/services/ngalert/notifier/alertmanager_mock/Alertmanager.go +++ b/pkg/services/ngalert/notifier/alertmanager_mock/Alertmanager.go @@ -1,11 +1,14 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. +// Code generated by mockery v2.43.2. DO NOT EDIT. package alertmanager_mock import ( context "context" + alertingmodels "github.com/grafana/alerting/models" + definitions "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + mock "github.com/stretchr/testify/mock" models "github.com/grafana/grafana/pkg/services/ngalert/models" @@ -308,23 +311,23 @@ func (_c *AlertmanagerMock_GetAlerts_Call) RunAndReturn(run func(context.Context } // GetReceivers provides a mock function with given fields: ctx -func (_m *AlertmanagerMock) GetReceivers(ctx context.Context) ([]v2models.Receiver, error) { +func (_m *AlertmanagerMock) GetReceivers(ctx context.Context) ([]alertingmodels.Receiver, error) { ret := _m.Called(ctx) if len(ret) == 0 { panic("no return value specified for GetReceivers") } - var r0 []v2models.Receiver + var r0 []alertingmodels.Receiver var r1 error - if rf, ok := ret.Get(0).(func(context.Context) ([]v2models.Receiver, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context) ([]alertingmodels.Receiver, error)); ok { return rf(ctx) } - if rf, ok := ret.Get(0).(func(context.Context) []v2models.Receiver); ok { + if rf, ok := ret.Get(0).(func(context.Context) []alertingmodels.Receiver); ok { r0 = rf(ctx) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]v2models.Receiver) + r0 = ret.Get(0).([]alertingmodels.Receiver) } } @@ -355,12 +358,12 @@ func (_c *AlertmanagerMock_GetReceivers_Call) Run(run func(ctx context.Context)) return _c } -func (_c *AlertmanagerMock_GetReceivers_Call) Return(_a0 []v2models.Receiver, _a1 error) *AlertmanagerMock_GetReceivers_Call { +func (_c *AlertmanagerMock_GetReceivers_Call) Return(_a0 []alertingmodels.Receiver, _a1 error) *AlertmanagerMock_GetReceivers_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *AlertmanagerMock_GetReceivers_Call) RunAndReturn(run func(context.Context) ([]v2models.Receiver, error)) *AlertmanagerMock_GetReceivers_Call { +func (_c *AlertmanagerMock_GetReceivers_Call) RunAndReturn(run func(context.Context) ([]alertingmodels.Receiver, error)) *AlertmanagerMock_GetReceivers_Call { _c.Call.Return(run) return _c } @@ -726,6 +729,10 @@ func (_c *AlertmanagerMock_SaveAndApplyDefaultConfig_Call) RunAndReturn(run func func (_m *AlertmanagerMock) SilenceState(_a0 context.Context) (notify.SilenceState, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for SilenceState") + } + var r0 notify.SilenceState var r1 error if rf, ok := ret.Get(0).(func(context.Context) (notify.SilenceState, error)); ok { diff --git a/pkg/services/ngalert/notifier/testreceivers.go b/pkg/services/ngalert/notifier/testreceivers.go index eae0d4bc4e0..44b0c7a4d2a 100644 --- a/pkg/services/ngalert/notifier/testreceivers.go +++ b/pkg/services/ngalert/notifier/testreceivers.go @@ -7,8 +7,6 @@ import ( alertingNotify "github.com/grafana/alerting/notify" - "github.com/go-openapi/strfmt" - "github.com/prometheus/alertmanager/api/v2/models" "github.com/prometheus/alertmanager/types" apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" @@ -92,36 +90,5 @@ func (am *alertmanager) TestReceivers(ctx context.Context, c apimodels.TestRecei } func (am *alertmanager) GetReceivers(_ context.Context) ([]apimodels.Receiver, error) { - apiReceivers := make([]apimodels.Receiver, 0, len(am.Base.GetReceivers())) - for _, rcv := range am.Base.GetReceivers() { - // Build integrations slice for each receiver. - integrations := make([]*models.Integration, 0, len(rcv.Integrations())) - for _, integration := range rcv.Integrations() { - name := integration.Name() - sendResolved := integration.SendResolved() - ts, d, err := integration.GetReport() - integrations = append(integrations, &apimodels.Integration{ - Name: &name, - SendResolved: &sendResolved, - LastNotifyAttempt: strfmt.DateTime(ts), - LastNotifyAttemptDuration: d.String(), - LastNotifyAttemptError: func() string { - if err != nil { - return err.Error() - } - return "" - }(), - }) - } - - active := rcv.Active() - name := rcv.Name() - apiReceivers = append(apiReceivers, apimodels.Receiver{ - Active: &active, - Integrations: integrations, - Name: &name, - }) - } - - return apiReceivers, nil + return am.Base.GetReceivers(), nil } diff --git a/pkg/services/ngalert/remote/alertmanager.go b/pkg/services/ngalert/remote/alertmanager.go index 4c95da4dd98..1c9c8afff27 100644 --- a/pkg/services/ngalert/remote/alertmanager.go +++ b/pkg/services/ngalert/remote/alertmanager.go @@ -494,10 +494,10 @@ func (am *Alertmanager) GetReceivers(ctx context.Context) ([]apimodels.Receiver, var rcvs []apimodels.Receiver for _, rcv := range res.Payload { - if rcv.Integrations == nil { - rcv.Integrations = []*apimodels.Integration{} - } - rcvs = append(rcvs, *rcv) + rcvs = append(rcvs, apimodels.Receiver{ + Name: *rcv.Name, + Integrations: []apimodels.Integration{}, + }) } return rcvs, nil } diff --git a/pkg/services/ngalert/remote/alertmanager_test.go b/pkg/services/ngalert/remote/alertmanager_test.go index 8212deacc8e..dffb38e4644 100644 --- a/pkg/services/ngalert/remote/alertmanager_test.go +++ b/pkg/services/ngalert/remote/alertmanager_test.go @@ -715,7 +715,7 @@ func TestIntegrationRemoteAlertmanagerReceivers(t *testing.T) { // We should start with the default config. rcvs, err := am.GetReceivers(context.Background()) require.NoError(t, err) - require.Equal(t, "empty-receiver", *rcvs[0].Name) + require.Equal(t, "empty-receiver", rcvs[0].Name) } func genAlert(active bool, labels map[string]string) amv2.PostableAlert { diff --git a/pkg/services/ngalert/remote/mock/remoteAlertmanager.go b/pkg/services/ngalert/remote/mock/remoteAlertmanager.go index fac33bc02a6..8cf3983bcb0 100644 --- a/pkg/services/ngalert/remote/mock/remoteAlertmanager.go +++ b/pkg/services/ngalert/remote/mock/remoteAlertmanager.go @@ -1,11 +1,14 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. +// Code generated by mockery v2.43.2. DO NOT EDIT. package alertmanager_mock import ( context "context" + alertingmodels "github.com/grafana/alerting/models" + definitions "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" + mock "github.com/stretchr/testify/mock" models "github.com/grafana/grafana/pkg/services/ngalert/models" @@ -401,23 +404,23 @@ func (_c *RemoteAlertmanagerMock_GetAlerts_Call) RunAndReturn(run func(context.C } // GetReceivers provides a mock function with given fields: ctx -func (_m *RemoteAlertmanagerMock) GetReceivers(ctx context.Context) ([]v2models.Receiver, error) { +func (_m *RemoteAlertmanagerMock) GetReceivers(ctx context.Context) ([]alertingmodels.Receiver, error) { ret := _m.Called(ctx) if len(ret) == 0 { panic("no return value specified for GetReceivers") } - var r0 []v2models.Receiver + var r0 []alertingmodels.Receiver var r1 error - if rf, ok := ret.Get(0).(func(context.Context) ([]v2models.Receiver, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context) ([]alertingmodels.Receiver, error)); ok { return rf(ctx) } - if rf, ok := ret.Get(0).(func(context.Context) []v2models.Receiver); ok { + if rf, ok := ret.Get(0).(func(context.Context) []alertingmodels.Receiver); ok { r0 = rf(ctx) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]v2models.Receiver) + r0 = ret.Get(0).([]alertingmodels.Receiver) } } @@ -448,12 +451,12 @@ func (_c *RemoteAlertmanagerMock_GetReceivers_Call) Run(run func(ctx context.Con return _c } -func (_c *RemoteAlertmanagerMock_GetReceivers_Call) Return(_a0 []v2models.Receiver, _a1 error) *RemoteAlertmanagerMock_GetReceivers_Call { +func (_c *RemoteAlertmanagerMock_GetReceivers_Call) Return(_a0 []alertingmodels.Receiver, _a1 error) *RemoteAlertmanagerMock_GetReceivers_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *RemoteAlertmanagerMock_GetReceivers_Call) RunAndReturn(run func(context.Context) ([]v2models.Receiver, error)) *RemoteAlertmanagerMock_GetReceivers_Call { +func (_c *RemoteAlertmanagerMock_GetReceivers_Call) RunAndReturn(run func(context.Context) ([]alertingmodels.Receiver, error)) *RemoteAlertmanagerMock_GetReceivers_Call { _c.Call.Return(run) return _c } @@ -819,6 +822,10 @@ func (_c *RemoteAlertmanagerMock_SaveAndApplyDefaultConfig_Call) RunAndReturn(ru func (_m *RemoteAlertmanagerMock) SilenceState(_a0 context.Context) (notify.SilenceState, error) { ret := _m.Called(_a0) + if len(ret) == 0 { + panic("no return value specified for SilenceState") + } + var r0 notify.SilenceState var r1 error if rf, ok := ret.Get(0).(func(context.Context) (notify.SilenceState, error)); ok { diff --git a/pkg/tests/api/alerting/api_notification_channel_test.go b/pkg/tests/api/alerting/api_notification_channel_test.go index c6a900b3932..3aec3f06289 100644 --- a/pkg/tests/api/alerting/api_notification_channel_test.go +++ b/pkg/tests/api/alerting/api_notification_channel_test.go @@ -1031,33 +1031,29 @@ func TestIntegrationNotificationChannels(t *testing.T) { err := json.Unmarshal([]byte(b), &receivers) require.NoError(t, err) for _, rcv := range receivers { - t.Run("Receiver "+*rcv.Name, func(t *testing.T) { + t.Run("Receiver "+rcv.Name, func(t *testing.T) { var expActive bool - if _, ok := expInactiveReceivers[*rcv.Name]; !ok { + if _, ok := expInactiveReceivers[rcv.Name]; !ok { expActive = true } var expErr bool - if _, ok := expNotificationErrors[*rcv.Name]; ok { + if _, ok := expNotificationErrors[rcv.Name]; ok { expErr = true } - require.NotNil(t, rcv.Name) - require.NotNil(t, rcv.Active) require.NotEmpty(t, rcv.Integrations) if expActive { - require.True(t, *rcv.Active) + require.True(t, rcv.Active) } // We don't have test alerts for the default notifier, continue iterating. - if *rcv.Name == "grafana-default-email" { + if rcv.Name == "grafana-default-email" { return } for _, integration := range rcv.Integrations { require.NotNil(t, integration.Name) - t.Run("Integration "+*integration.Name, func(t *testing.T) { - require.NotNil(t, integration.SendResolved) - + t.Run("Integration "+integration.Name, func(t *testing.T) { // If the receiver is not active, no attempts to send notifications should be registered. if expActive { // Prometheus' durations get rounded down, so we might end up with "0s" if we have values smaller than 1ms. @@ -1070,7 +1066,7 @@ func TestIntegrationNotificationChannels(t *testing.T) { // Check whether we're expecting an error on this integration. if expErr { for _, integration := range rcv.Integrations { - require.Equal(t, expNotificationErrors[*rcv.Name], integration.LastNotifyAttemptError) + require.Equal(t, expNotificationErrors[rcv.Name], integration.LastNotifyAttemptError) } } else { require.Equal(t, "", integration.LastNotifyAttemptError)