|
@@ -1,14 +1,16 @@
|
|
|
package alerting
|
|
package alerting
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+
|
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
|
"github.com/grafana/grafana/pkg/log"
|
|
"github.com/grafana/grafana/pkg/log"
|
|
|
m "github.com/grafana/grafana/pkg/models"
|
|
m "github.com/grafana/grafana/pkg/models"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRule {
|
|
|
|
|
- alerts := make([]*m.AlertRule, 0)
|
|
|
|
|
|
|
+func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRuleModel {
|
|
|
|
|
+ alerts := make([]*m.AlertRuleModel, 0)
|
|
|
|
|
|
|
|
for _, rowObj := range cmd.Dashboard.Get("rows").MustArray() {
|
|
for _, rowObj := range cmd.Dashboard.Get("rows").MustArray() {
|
|
|
row := simplejson.NewFromAny(rowObj)
|
|
row := simplejson.NewFromAny(rowObj)
|
|
@@ -17,7 +19,7 @@ func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRule {
|
|
|
panel := simplejson.NewFromAny(panelObj)
|
|
panel := simplejson.NewFromAny(panelObj)
|
|
|
|
|
|
|
|
alerting := panel.Get("alerting")
|
|
alerting := panel.Get("alerting")
|
|
|
- alert := &m.AlertRule{
|
|
|
|
|
|
|
+ alert := &m.AlertRuleModel{
|
|
|
DashboardId: cmd.Result.Id,
|
|
DashboardId: cmd.Result.Id,
|
|
|
OrgId: cmd.Result.OrgId,
|
|
OrgId: cmd.Result.OrgId,
|
|
|
PanelId: panel.Get("id").MustInt64(),
|
|
PanelId: panel.Get("id").MustInt64(),
|
|
@@ -28,9 +30,8 @@ func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRule {
|
|
|
|
|
|
|
|
log.Info("Alertrule: %v", alert.Name)
|
|
log.Info("Alertrule: %v", alert.Name)
|
|
|
|
|
|
|
|
- expression := alerting
|
|
|
|
|
- valueQuery := expression.Get("valueQuery")
|
|
|
|
|
- valueQueryRef := valueQuery.Get("queryRefId").MustString()
|
|
|
|
|
|
|
+ valueQuery := alerting.Get("query")
|
|
|
|
|
+ valueQueryRef := valueQuery.Get("refId").MustString()
|
|
|
for _, targetsObj := range panel.Get("targets").MustArray() {
|
|
for _, targetsObj := range panel.Get("targets").MustArray() {
|
|
|
target := simplejson.NewFromAny(targetsObj)
|
|
target := simplejson.NewFromAny(targetsObj)
|
|
|
|
|
|
|
@@ -47,7 +48,7 @@ func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRule {
|
|
|
if err := bus.Dispatch(query); err == nil {
|
|
if err := bus.Dispatch(query); err == nil {
|
|
|
for _, ds := range query.Result {
|
|
for _, ds := range query.Result {
|
|
|
if ds.IsDefault {
|
|
if ds.IsDefault {
|
|
|
- valueQuery.Set("datasourceId", ds.Id)
|
|
|
|
|
|
|
+ alerting.SetPath([]string{"query", "datasourceId"}, ds.Id)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -57,59 +58,72 @@ func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []*m.AlertRule {
|
|
|
OrgId: cmd.OrgId,
|
|
OrgId: cmd.OrgId,
|
|
|
}
|
|
}
|
|
|
bus.Dispatch(query)
|
|
bus.Dispatch(query)
|
|
|
- valueQuery.Set("datasourceId", query.Result.Id)
|
|
|
|
|
|
|
+ alerting.SetPath([]string{"query", "datasourceId"}, query.Result.Id)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
targetQuery := target.Get("target").MustString()
|
|
targetQuery := target.Get("target").MustString()
|
|
|
if targetQuery != "" {
|
|
if targetQuery != "" {
|
|
|
- valueQuery.Set("query", targetQuery)
|
|
|
|
|
|
|
+ alerting.SetPath([]string{"query", "query"}, targetQuery)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- expression.Set("valueQuery", valueQuery)
|
|
|
|
|
- alert.Expression = expression
|
|
|
|
|
-
|
|
|
|
|
- alertRule := &AlertRule{}
|
|
|
|
|
|
|
+ alert.Expression = alerting
|
|
|
|
|
|
|
|
- ParseAlertRulesFromAlertModel(alert, alertRule)
|
|
|
|
|
|
|
+ _, err := ConvetAlertModelToAlertRule(alert)
|
|
|
|
|
|
|
|
- if alert.ValidToSave() && alertRule.IsValid() {
|
|
|
|
|
|
|
+ if err == nil && alert.ValidToSave() {
|
|
|
alerts = append(alerts, alert)
|
|
alerts = append(alerts, alert)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.Error2("Failed to parse model from expression", "error", err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return alerts
|
|
return alerts
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (rule *AlertRule) IsValid() bool {
|
|
|
|
|
- return rule.ValueQuery.Query != ""
|
|
|
|
|
-}
|
|
|
|
|
|
|
+func ConvetAlertModelToAlertRule(ruleDef *m.AlertRuleModel) (*AlertRule, error) {
|
|
|
|
|
+ model := &AlertRule{}
|
|
|
|
|
+ model.Id = ruleDef.Id
|
|
|
|
|
+ model.OrgId = ruleDef.OrgId
|
|
|
|
|
+ model.Name = ruleDef.Name
|
|
|
|
|
+ model.Description = ruleDef.Description
|
|
|
|
|
+ model.State = ruleDef.State
|
|
|
|
|
|
|
|
-func ParseAlertRulesFromAlertModel(ruleDef *m.AlertRule, model *AlertRule) error {
|
|
|
|
|
critical := ruleDef.Expression.Get("critical")
|
|
critical := ruleDef.Expression.Get("critical")
|
|
|
model.Critical = Level{
|
|
model.Critical = Level{
|
|
|
- Operator: critical.Get("operator").MustString(),
|
|
|
|
|
|
|
+ Operator: critical.Get("op").MustString(),
|
|
|
Level: critical.Get("level").MustFloat64(),
|
|
Level: critical.Get("level").MustFloat64(),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
warning := ruleDef.Expression.Get("warning")
|
|
warning := ruleDef.Expression.Get("warning")
|
|
|
model.Warning = Level{
|
|
model.Warning = Level{
|
|
|
- Operator: warning.Get("operator").MustString(),
|
|
|
|
|
|
|
+ Operator: warning.Get("op").MustString(),
|
|
|
Level: warning.Get("level").MustFloat64(),
|
|
Level: warning.Get("level").MustFloat64(),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
model.Frequency = ruleDef.Expression.Get("frequency").MustInt64()
|
|
model.Frequency = ruleDef.Expression.Get("frequency").MustInt64()
|
|
|
|
|
+ model.Transform = ruleDef.Expression.Get("transform").Get("type").MustString()
|
|
|
|
|
+ model.TransformParams = *ruleDef.Expression.Get("transform")
|
|
|
|
|
+
|
|
|
|
|
+ query := ruleDef.Expression.Get("query")
|
|
|
|
|
+ model.Query = AlertQuery{
|
|
|
|
|
+ Query: query.Get("query").MustString(),
|
|
|
|
|
+ DatasourceId: query.Get("datasourceId").MustInt64(),
|
|
|
|
|
+ From: query.Get("from").MustString(),
|
|
|
|
|
+ To: query.Get("to").MustString(),
|
|
|
|
|
+ Aggregator: query.Get("agg").MustString(),
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if model.Query.Query == "" {
|
|
|
|
|
+ return nil, fmt.Errorf("missing query.query")
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- valueQuery := ruleDef.Expression.Get("valueQuery")
|
|
|
|
|
- model.ValueQuery = AlertQuery{
|
|
|
|
|
- Query: valueQuery.Get("query").MustString(),
|
|
|
|
|
- DatasourceId: valueQuery.Get("datasourceId").MustInt64(),
|
|
|
|
|
- From: valueQuery.Get("From").MustInt64(),
|
|
|
|
|
- Until: valueQuery.Get("until").MustInt64(),
|
|
|
|
|
- Aggregator: valueQuery.Get("aggregator").MustString(),
|
|
|
|
|
|
|
+ if model.Query.DatasourceId == 0 {
|
|
|
|
|
+ return nil, fmt.Errorf("missing query.datasourceId")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return nil
|
|
|
|
|
|
|
+ return model, nil
|
|
|
}
|
|
}
|