mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: use duration model for alert rule provisioning api (#53196)
This commit is contained in:
parent
e14c91d5d4
commit
7f0002448d
@ -254,7 +254,11 @@ func (srv *ProvisioningSrv) RouteRouteGetAlertRule(c *models.ReqContext, UID str
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (srv *ProvisioningSrv) RoutePostAlertRule(c *models.ReqContext, ar definitions.ProvisionedAlertRule) response.Response {
|
func (srv *ProvisioningSrv) RoutePostAlertRule(c *models.ReqContext, ar definitions.ProvisionedAlertRule) response.Response {
|
||||||
createdAlertRule, err := srv.alertRules.CreateAlertRule(c.Req.Context(), ar.UpstreamModel(), alerting_models.ProvenanceAPI, c.UserID)
|
upstreamModel, err := ar.UpstreamModel()
|
||||||
|
if err != nil {
|
||||||
|
ErrResp(http.StatusBadRequest, err, "")
|
||||||
|
}
|
||||||
|
createdAlertRule, err := srv.alertRules.CreateAlertRule(c.Req.Context(), upstreamModel, alerting_models.ProvenanceAPI, c.UserID)
|
||||||
if errors.Is(err, alerting_models.ErrAlertRuleFailedValidation) {
|
if errors.Is(err, alerting_models.ErrAlertRuleFailedValidation) {
|
||||||
return ErrResp(http.StatusBadRequest, err, "")
|
return ErrResp(http.StatusBadRequest, err, "")
|
||||||
}
|
}
|
||||||
@ -274,9 +278,12 @@ func (srv *ProvisioningSrv) RoutePostAlertRule(c *models.ReqContext, ar definiti
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (srv *ProvisioningSrv) RoutePutAlertRule(c *models.ReqContext, ar definitions.ProvisionedAlertRule, UID string) response.Response {
|
func (srv *ProvisioningSrv) RoutePutAlertRule(c *models.ReqContext, ar definitions.ProvisionedAlertRule, UID string) response.Response {
|
||||||
updated := ar.UpstreamModel()
|
updated, err := ar.UpstreamModel()
|
||||||
|
if err != nil {
|
||||||
|
ErrResp(http.StatusBadRequest, err, "")
|
||||||
|
}
|
||||||
updated.UID = UID
|
updated.UID = UID
|
||||||
updatedAlertRule, err := srv.alertRules.UpdateAlertRule(c.Req.Context(), ar.UpstreamModel(), alerting_models.ProvenanceAPI)
|
updatedAlertRule, err := srv.alertRules.UpdateAlertRule(c.Req.Context(), updated, alerting_models.ProvenanceAPI)
|
||||||
if errors.Is(err, alerting_models.ErrAlertRuleNotFound) {
|
if errors.Is(err, alerting_models.ErrAlertRuleNotFound) {
|
||||||
return response.Empty(http.StatusNotFound)
|
return response.Empty(http.StatusNotFound)
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
prometheus "github.com/prometheus/alertmanager/config"
|
prometheus "github.com/prometheus/alertmanager/config"
|
||||||
"github.com/prometheus/alertmanager/timeinterval"
|
"github.com/prometheus/alertmanager/timeinterval"
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
@ -243,11 +244,13 @@ func TestProvisioningApi(t *testing.T) {
|
|||||||
t.Run("PUT returns 400", func(t *testing.T) {
|
t.Run("PUT returns 400", func(t *testing.T) {
|
||||||
sut := createProvisioningSrvSut(t)
|
sut := createProvisioningSrvSut(t)
|
||||||
rc := createTestRequestCtx()
|
rc := createTestRequestCtx()
|
||||||
insertRule(t, sut, createTestAlertRule("rule", 1))
|
uid := "123123"
|
||||||
rule := createInvalidAlertRule()
|
rule := createTestAlertRule("rule", 1)
|
||||||
|
rule.UID = uid
|
||||||
response := sut.RoutePutAlertRule(&rc, rule, "rule")
|
insertRule(t, sut, rule)
|
||||||
|
rule = createInvalidAlertRule()
|
||||||
|
|
||||||
|
response := sut.RoutePutAlertRule(&rc, rule, uid)
|
||||||
require.Equal(t, 400, response.Status())
|
require.Equal(t, 400, response.Status())
|
||||||
require.NotEmpty(t, response.Body())
|
require.NotEmpty(t, response.Body())
|
||||||
require.Contains(t, string(response.Body()), "invalid alert rule")
|
require.Contains(t, string(response.Body()), "invalid alert rule")
|
||||||
@ -533,7 +536,7 @@ func createTestAlertRule(title string, orgID int64) definitions.ProvisionedAlert
|
|||||||
},
|
},
|
||||||
RuleGroup: "my-cool-group",
|
RuleGroup: "my-cool-group",
|
||||||
FolderUID: "folder-uid",
|
FolderUID: "folder-uid",
|
||||||
For: time.Second * 60,
|
For: model.Duration(60),
|
||||||
NoDataState: models.OK,
|
NoDataState: models.OK,
|
||||||
ExecErrState: models.OkErrState,
|
ExecErrState: models.OkErrState,
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
|
"github.com/prometheus/common/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// swagger:route GET /api/v1/provisioning/alert-rules/{UID} provisioning stable RouteGetAlertRule
|
// swagger:route GET /api/v1/provisioning/alert-rules/{UID} provisioning stable RouteGetAlertRule
|
||||||
@ -87,7 +88,7 @@ type ProvisionedAlertRule struct {
|
|||||||
// required: true
|
// required: true
|
||||||
ExecErrState models.ExecutionErrorState `json:"execErrState"`
|
ExecErrState models.ExecutionErrorState `json:"execErrState"`
|
||||||
// required: true
|
// required: true
|
||||||
For time.Duration `json:"for"`
|
For model.Duration `json:"for"`
|
||||||
// example: {"runbook_url": "https://supercoolrunbook.com/page/13"}
|
// example: {"runbook_url": "https://supercoolrunbook.com/page/13"}
|
||||||
Annotations map[string]string `json:"annotations,omitempty"`
|
Annotations map[string]string `json:"annotations,omitempty"`
|
||||||
// example: {"team": "sre-team-1"}
|
// example: {"team": "sre-team-1"}
|
||||||
@ -96,7 +97,11 @@ type ProvisionedAlertRule struct {
|
|||||||
Provenance models.Provenance `json:"provenance,omitempty"`
|
Provenance models.Provenance `json:"provenance,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ProvisionedAlertRule) UpstreamModel() models.AlertRule {
|
func (a *ProvisionedAlertRule) UpstreamModel() (models.AlertRule, error) {
|
||||||
|
forDur, err := time.ParseDuration(a.For.String())
|
||||||
|
if err != nil {
|
||||||
|
return models.AlertRule{}, err
|
||||||
|
}
|
||||||
return models.AlertRule{
|
return models.AlertRule{
|
||||||
ID: a.ID,
|
ID: a.ID,
|
||||||
UID: a.UID,
|
UID: a.UID,
|
||||||
@ -109,10 +114,10 @@ func (a *ProvisionedAlertRule) UpstreamModel() models.AlertRule {
|
|||||||
Updated: a.Updated,
|
Updated: a.Updated,
|
||||||
NoDataState: a.NoDataState,
|
NoDataState: a.NoDataState,
|
||||||
ExecErrState: a.ExecErrState,
|
ExecErrState: a.ExecErrState,
|
||||||
For: a.For,
|
For: forDur,
|
||||||
Annotations: a.Annotations,
|
Annotations: a.Annotations,
|
||||||
Labels: a.Labels,
|
Labels: a.Labels,
|
||||||
}
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAlertRule(rule models.AlertRule, provenance models.Provenance) ProvisionedAlertRule {
|
func NewAlertRule(rule models.AlertRule, provenance models.Provenance) ProvisionedAlertRule {
|
||||||
@ -123,7 +128,7 @@ func NewAlertRule(rule models.AlertRule, provenance models.Provenance) Provision
|
|||||||
FolderUID: rule.NamespaceUID,
|
FolderUID: rule.NamespaceUID,
|
||||||
RuleGroup: rule.RuleGroup,
|
RuleGroup: rule.RuleGroup,
|
||||||
Title: rule.Title,
|
Title: rule.Title,
|
||||||
For: rule.For,
|
For: model.Duration(rule.For.Seconds()),
|
||||||
Condition: rule.Condition,
|
Condition: rule.Condition,
|
||||||
Data: rule.Data,
|
Data: rule.Data,
|
||||||
Updated: rule.Updated,
|
Updated: rule.Updated,
|
||||||
|
Loading…
Reference in New Issue
Block a user