|
|
|
|
@ -30,6 +30,7 @@ import ( |
|
|
|
|
|
|
|
|
|
type RulerSrv struct { |
|
|
|
|
xactManager provisioning.TransactionManager |
|
|
|
|
provenanceStore provisioning.ProvisioningStore |
|
|
|
|
store store.RuleStore |
|
|
|
|
DatasourceCache datasources.CacheService |
|
|
|
|
QuotaService *quota.QuotaService |
|
|
|
|
@ -143,6 +144,11 @@ func (srv RulerSrv) RouteGetNamespaceRulesConfig(c *models.ReqContext) response. |
|
|
|
|
return accesscontrol.HasAccess(srv.ac, c)(accesscontrol.ReqSignedIn, evaluator) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
provenanceRecords, err := srv.provenanceStore.GetProvenances(c.Req.Context(), c.SignedInUser.OrgId, (&ngmodels.AlertRule{}).ResourceType()) |
|
|
|
|
if err != nil { |
|
|
|
|
return ErrResp(http.StatusInternalServerError, err, "failed to get provenance for rule group") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, r := range q.Result { |
|
|
|
|
if !authorizeDatasourceAccessForRule(r, hasAccess) { |
|
|
|
|
continue |
|
|
|
|
@ -154,11 +160,11 @@ func (srv RulerSrv) RouteGetNamespaceRulesConfig(c *models.ReqContext) response. |
|
|
|
|
Name: r.RuleGroup, |
|
|
|
|
Interval: ruleGroupInterval, |
|
|
|
|
Rules: []apimodels.GettableExtendedRuleNode{ |
|
|
|
|
toGettableExtendedRuleNode(*r, namespace.Id), |
|
|
|
|
toGettableExtendedRuleNode(*r, namespace.Id, provenanceRecords), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
ruleGroupConfig.Rules = append(ruleGroupConfig.Rules, toGettableExtendedRuleNode(*r, namespace.Id)) |
|
|
|
|
ruleGroupConfig.Rules = append(ruleGroupConfig.Rules, toGettableExtendedRuleNode(*r, namespace.Id, provenanceRecords)) |
|
|
|
|
ruleGroupConfigs[r.RuleGroup] = ruleGroupConfig |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -170,7 +176,7 @@ func (srv RulerSrv) RouteGetNamespaceRulesConfig(c *models.ReqContext) response. |
|
|
|
|
return response.JSON(http.StatusAccepted, result) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (srv RulerSrv) RouteGetRulegGroupConfig(c *models.ReqContext) response.Response { |
|
|
|
|
func (srv RulerSrv) RouteGetRulesGroupConfig(c *models.ReqContext) response.Response { |
|
|
|
|
namespaceTitle := web.Params(c.Req)[":Namespace"] |
|
|
|
|
namespace, err := srv.store.GetNamespaceByTitle(c.Req.Context(), namespaceTitle, c.SignedInUser.OrgId, c.SignedInUser, false) |
|
|
|
|
if err != nil { |
|
|
|
|
@ -194,12 +200,17 @@ func (srv RulerSrv) RouteGetRulegGroupConfig(c *models.ReqContext) response.Resp |
|
|
|
|
return accesscontrol.HasAccess(srv.ac, c)(accesscontrol.ReqSignedIn, evaluator) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
provenanceRecords, err := srv.provenanceStore.GetProvenances(c.Req.Context(), c.SignedInUser.OrgId, (&ngmodels.AlertRule{}).ResourceType()) |
|
|
|
|
if err != nil { |
|
|
|
|
return ErrResp(http.StatusInternalServerError, err, "failed to get group alert rules") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, r := range q.Result { |
|
|
|
|
if !authorizeDatasourceAccessForRule(r, hasAccess) { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
ruleGroupInterval = model.Duration(time.Duration(r.IntervalSeconds) * time.Second) |
|
|
|
|
ruleNodes = append(ruleNodes, toGettableExtendedRuleNode(*r, namespace.Id)) |
|
|
|
|
ruleNodes = append(ruleNodes, toGettableExtendedRuleNode(*r, namespace.Id, provenanceRecords)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
result := apimodels.RuleGroupConfigResponse{ |
|
|
|
|
@ -255,6 +266,11 @@ func (srv RulerSrv) RouteGetRulesConfig(c *models.ReqContext) response.Response |
|
|
|
|
return accesscontrol.HasAccess(srv.ac, c)(accesscontrol.ReqSignedIn, evaluator) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
provenanceRecords, err := srv.provenanceStore.GetProvenances(c.Req.Context(), c.SignedInUser.OrgId, (&ngmodels.AlertRule{}).ResourceType()) |
|
|
|
|
if err != nil { |
|
|
|
|
return ErrResp(http.StatusInternalServerError, err, "failed to get alert rules") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, r := range q.Result { |
|
|
|
|
if !authorizeDatasourceAccessForRule(r, hasAccess) { |
|
|
|
|
continue |
|
|
|
|
@ -273,7 +289,7 @@ func (srv RulerSrv) RouteGetRulesConfig(c *models.ReqContext) response.Response |
|
|
|
|
Name: r.RuleGroup, |
|
|
|
|
Interval: ruleGroupInterval, |
|
|
|
|
Rules: []apimodels.GettableExtendedRuleNode{ |
|
|
|
|
toGettableExtendedRuleNode(*r, folder.Id), |
|
|
|
|
toGettableExtendedRuleNode(*r, folder.Id, provenanceRecords), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
@ -284,11 +300,11 @@ func (srv RulerSrv) RouteGetRulesConfig(c *models.ReqContext) response.Response |
|
|
|
|
Name: r.RuleGroup, |
|
|
|
|
Interval: ruleGroupInterval, |
|
|
|
|
Rules: []apimodels.GettableExtendedRuleNode{ |
|
|
|
|
toGettableExtendedRuleNode(*r, folder.Id), |
|
|
|
|
toGettableExtendedRuleNode(*r, folder.Id, provenanceRecords), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
ruleGroupConfig.Rules = append(ruleGroupConfig.Rules, toGettableExtendedRuleNode(*r, folder.Id)) |
|
|
|
|
ruleGroupConfig.Rules = append(ruleGroupConfig.Rules, toGettableExtendedRuleNode(*r, folder.Id, provenanceRecords)) |
|
|
|
|
configs[namespace][r.RuleGroup] = ruleGroupConfig |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -437,7 +453,11 @@ func (srv RulerSrv) updateAlertRulesInGroup(c *models.ReqContext, namespace *mod |
|
|
|
|
return response.JSON(http.StatusAccepted, util.DynMap{"message": "rule group updated successfully"}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func toGettableExtendedRuleNode(r ngmodels.AlertRule, namespaceID int64) apimodels.GettableExtendedRuleNode { |
|
|
|
|
func toGettableExtendedRuleNode(r ngmodels.AlertRule, namespaceID int64, provenanceRecords map[string]ngmodels.Provenance) apimodels.GettableExtendedRuleNode { |
|
|
|
|
provenance := ngmodels.ProvenanceNone |
|
|
|
|
if prov, exists := provenanceRecords[r.ResourceID()]; exists { |
|
|
|
|
provenance = prov |
|
|
|
|
} |
|
|
|
|
gettableExtendedRuleNode := apimodels.GettableExtendedRuleNode{ |
|
|
|
|
GrafanaManagedAlert: &apimodels.GettableGrafanaRule{ |
|
|
|
|
ID: r.ID, |
|
|
|
|
@ -454,6 +474,7 @@ func toGettableExtendedRuleNode(r ngmodels.AlertRule, namespaceID int64) apimode |
|
|
|
|
RuleGroup: r.RuleGroup, |
|
|
|
|
NoDataState: apimodels.NoDataState(r.NoDataState), |
|
|
|
|
ExecErrState: apimodels.ExecutionErrorState(r.ExecErrState), |
|
|
|
|
Provenance: provenance, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
gettableExtendedRuleNode.ApiRuleNode = &apimodels.ApiRuleNode{ |
|
|
|
|
|