mirror of https://github.com/grafana/grafana.git
221 lines
6.1 KiB
Go
221 lines
6.1 KiB
Go
package definitions
|
||
|
||
import (
|
||
"time"
|
||
|
||
"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
|
||
//
|
||
// Get a specific alert rule by UID.
|
||
//
|
||
// Responses:
|
||
// 200: ProvisionedAlertRule
|
||
// 404: description: Not found.
|
||
|
||
// swagger:route POST /api/v1/provisioning/alert-rules provisioning stable RoutePostAlertRule
|
||
//
|
||
// Create a new alert rule.
|
||
//
|
||
// Consumes:
|
||
// - application/json
|
||
//
|
||
// Responses:
|
||
// 201: ProvisionedAlertRule
|
||
// 400: ValidationError
|
||
|
||
// swagger:route PUT /api/v1/provisioning/alert-rules/{UID} provisioning stable RoutePutAlertRule
|
||
//
|
||
// Update an existing alert rule.
|
||
//
|
||
// Consumes:
|
||
// - application/json
|
||
//
|
||
// Responses:
|
||
// 200: ProvisionedAlertRule
|
||
// 400: ValidationError
|
||
|
||
// swagger:route DELETE /api/v1/provisioning/alert-rules/{UID} provisioning stable RouteDeleteAlertRule
|
||
//
|
||
// Delete a specific alert rule by UID.
|
||
//
|
||
// Responses:
|
||
// 204: description: The alert rule was deleted successfully.
|
||
|
||
// swagger:parameters RouteGetAlertRule RoutePutAlertRule RouteDeleteAlertRule
|
||
type AlertRuleUIDReference struct {
|
||
// Alert rule UID
|
||
// in:path
|
||
UID string
|
||
}
|
||
|
||
// swagger:parameters RoutePostAlertRule RoutePutAlertRule
|
||
type AlertRulePayload struct {
|
||
// in:body
|
||
Body ProvisionedAlertRule
|
||
}
|
||
|
||
type ProvisionedAlertRule struct {
|
||
ID int64 `json:"id"`
|
||
UID string `json:"uid"`
|
||
// required: true
|
||
OrgID int64 `json:"orgID"`
|
||
// required: true
|
||
// example: project_x
|
||
FolderUID string `json:"folderUID"`
|
||
// required: true
|
||
// minLength: 1
|
||
// maxLength: 190
|
||
// example: eval_group_1
|
||
RuleGroup string `json:"ruleGroup"`
|
||
// required: true
|
||
// minLength: 1
|
||
// maxLength: 190
|
||
// example: Always firing
|
||
Title string `json:"title"`
|
||
// required: true
|
||
// example: A
|
||
Condition string `json:"condition"`
|
||
// required: true
|
||
// example: [{"refId":"A","queryType":"","relativeTimeRange":{"from":0,"to":0},"datasourceUid":"-100","model":{"conditions":[{"evaluator":{"params":[0,0],"type":"gt"},"operator":{"type":"and"},"query":{"params":[]},"reducer":{"params":[],"type":"avg"},"type":"query"}],"datasource":{"type":"__expr__","uid":"__expr__"},"expression":"1 == 1","hide":false,"intervalMs":1000,"maxDataPoints":43200,"refId":"A","type":"math"}}]
|
||
Data []models.AlertQuery `json:"data"`
|
||
// readonly: true
|
||
Updated time.Time `json:"updated,omitempty"`
|
||
// required: true
|
||
NoDataState models.NoDataState `json:"noDataState"`
|
||
// required: true
|
||
ExecErrState models.ExecutionErrorState `json:"execErrState"`
|
||
// required: true
|
||
For model.Duration `json:"for"`
|
||
// example: {"runbook_url": "https://supercoolrunbook.com/page/13"}
|
||
Annotations map[string]string `json:"annotations,omitempty"`
|
||
// example: {"team": "sre-team-1"}
|
||
Labels map[string]string `json:"labels,omitempty"`
|
||
// readonly: true
|
||
Provenance models.Provenance `json:"provenance,omitempty"`
|
||
}
|
||
|
||
func (a *ProvisionedAlertRule) UpstreamModel() (models.AlertRule, error) {
|
||
forDur, err := time.ParseDuration(a.For.String())
|
||
if err != nil {
|
||
return models.AlertRule{}, err
|
||
}
|
||
return models.AlertRule{
|
||
ID: a.ID,
|
||
UID: a.UID,
|
||
OrgID: a.OrgID,
|
||
NamespaceUID: a.FolderUID,
|
||
RuleGroup: a.RuleGroup,
|
||
Title: a.Title,
|
||
Condition: a.Condition,
|
||
Data: a.Data,
|
||
Updated: a.Updated,
|
||
NoDataState: a.NoDataState,
|
||
ExecErrState: a.ExecErrState,
|
||
For: forDur,
|
||
Annotations: a.Annotations,
|
||
Labels: a.Labels,
|
||
}, nil
|
||
}
|
||
|
||
func NewAlertRule(rule models.AlertRule, provenance models.Provenance) ProvisionedAlertRule {
|
||
return ProvisionedAlertRule{
|
||
ID: rule.ID,
|
||
UID: rule.UID,
|
||
OrgID: rule.OrgID,
|
||
FolderUID: rule.NamespaceUID,
|
||
RuleGroup: rule.RuleGroup,
|
||
Title: rule.Title,
|
||
For: model.Duration(rule.For),
|
||
Condition: rule.Condition,
|
||
Data: rule.Data,
|
||
Updated: rule.Updated,
|
||
NoDataState: rule.NoDataState,
|
||
ExecErrState: rule.ExecErrState,
|
||
Annotations: rule.Annotations,
|
||
Labels: rule.Labels,
|
||
Provenance: provenance,
|
||
}
|
||
}
|
||
|
||
// swagger:route GET /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group} provisioning stable RouteGetAlertRuleGroup
|
||
//
|
||
// Get a rule group.
|
||
//
|
||
// Responses:
|
||
// 200: AlertRuleGroup
|
||
// 404: description: Not found.
|
||
|
||
// swagger:route PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group} provisioning stable RoutePutAlertRuleGroup
|
||
//
|
||
// Update the interval of a rule group.
|
||
//
|
||
// Consumes:
|
||
// - application/json
|
||
//
|
||
// Responses:
|
||
// 200: AlertRuleGroup
|
||
// 400: ValidationError
|
||
|
||
// swagger:parameters RouteGetAlertRuleGroup RoutePutAlertRuleGroup
|
||
type FolderUIDPathParam struct {
|
||
// in:path
|
||
FolderUID string `json:"FolderUID"`
|
||
}
|
||
|
||
// swagger:parameters RouteGetAlertRuleGroup RoutePutAlertRuleGroup
|
||
type RuleGroupPathParam struct {
|
||
// in:path
|
||
Group string `json:"Group"`
|
||
}
|
||
|
||
// swagger:parameters RoutePutAlertRuleGroup
|
||
type AlertRuleGroupPayload struct {
|
||
// in:body
|
||
Body AlertRuleGroup
|
||
}
|
||
|
||
// swagger:model
|
||
type AlertRuleGroupMetadata struct {
|
||
Interval int64 `json:"interval"`
|
||
}
|
||
|
||
// swagger:model
|
||
type AlertRuleGroup struct {
|
||
Title string `json:"title"`
|
||
FolderUID string `json:"folderUid"`
|
||
Interval int64 `json:"interval"`
|
||
Rules []ProvisionedAlertRule `json:"rules"`
|
||
}
|
||
|
||
func (a *AlertRuleGroup) ToModel() (models.AlertRuleGroup, error) {
|
||
ruleGroup := models.AlertRuleGroup{
|
||
Title: a.Title,
|
||
FolderUID: a.FolderUID,
|
||
Interval: a.Interval,
|
||
}
|
||
for i := range a.Rules {
|
||
converted, err := a.Rules[i].UpstreamModel()
|
||
if err != nil {
|
||
return models.AlertRuleGroup{}, err
|
||
}
|
||
ruleGroup.Rules = append(ruleGroup.Rules, converted)
|
||
}
|
||
return ruleGroup, nil
|
||
}
|
||
|
||
func NewAlertRuleGroupFromModel(d models.AlertRuleGroup) AlertRuleGroup {
|
||
rules := make([]ProvisionedAlertRule, 0, len(d.Rules))
|
||
for i := range d.Rules {
|
||
rules = append(rules, NewAlertRule(d.Rules[i], d.Provenance))
|
||
}
|
||
return AlertRuleGroup{
|
||
Title: d.Title,
|
||
FolderUID: d.FolderUID,
|
||
Interval: d.Interval,
|
||
Rules: rules,
|
||
}
|
||
}
|