diff --git a/pkg/api/alerting.go b/pkg/api/alerting.go index d3cb3b817fa..5652196b58c 100644 --- a/pkg/api/alerting.go +++ b/pkg/api/alerting.go @@ -75,6 +75,7 @@ func GetAlerts(c *middleware.Context) Response { State: alert.State, NewStateDate: alert.NewStateDate, ExecutionError: alert.ExecutionError, + EvalData: alert.EvalData, }) } diff --git a/pkg/api/dtos/alerting.go b/pkg/api/dtos/alerting.go index 4f3df88be9f..4285ebc89cc 100644 --- a/pkg/api/dtos/alerting.go +++ b/pkg/api/dtos/alerting.go @@ -17,6 +17,7 @@ type AlertRule struct { State m.AlertStateType `json:"state"` NewStateDate time.Time `json:"newStateDate"` EvalDate time.Time `json:"evalDate"` + EvalData *simplejson.Json `json:"evalData"` ExecutionError string `json:"executionError"` DashbboardUri string `json:"dashboardUri"` } diff --git a/pkg/services/alerting/result_handler.go b/pkg/services/alerting/result_handler.go index 8a78ca2a749..6b31dd4f951 100644 --- a/pkg/services/alerting/result_handler.go +++ b/pkg/services/alerting/result_handler.go @@ -31,13 +31,17 @@ func (handler *DefaultResultHandler) Handle(evalContext *EvalContext) error { executionError := "" annotationData := simplejson.New() + if evalContext.Firing { + annotationData = simplejson.NewFromAny(evalContext.EvalMatches) + } + if evalContext.Error != nil { executionError = evalContext.Error.Error() annotationData.Set("errorMessage", executionError) } - if evalContext.Firing { - annotationData = simplejson.NewFromAny(evalContext.EvalMatches) + if evalContext.NoDataFound { + annotationData.Set("no_data", true) } countStateResult(evalContext.Rule.State) diff --git a/pkg/services/sqlstore/alert.go b/pkg/services/sqlstore/alert.go index 8718b03e786..703a3fe34b8 100644 --- a/pkg/services/sqlstore/alert.go +++ b/pkg/services/sqlstore/alert.go @@ -113,6 +113,12 @@ func HandleAlertsQuery(query *m.GetAlertsQuery) error { return err } + for i, _ := range alerts { + if alerts[i].ExecutionError == " " { + alerts[i].ExecutionError = "" + } + } + query.Result = alerts return nil } diff --git a/public/app/features/alerting/alert_list_ctrl.ts b/public/app/features/alerting/alert_list_ctrl.ts index 5e3cce35c6e..78713ee0c4c 100644 --- a/public/app/features/alerting/alert_list_ctrl.ts +++ b/public/app/features/alerting/alert_list_ctrl.ts @@ -37,6 +37,9 @@ export class AlertListCtrl { this.alerts = _.map(result, alert => { alert.stateModel = alertDef.getStateDisplayModel(alert.state); alert.newStateDateAgo = moment(alert.newStateDate).fromNow().replace(" ago", ""); + if (alert.evalData && alert.evalData.no_data) { + alert.no_data = true; + } return alert; }); }); diff --git a/public/app/features/alerting/alert_tab_ctrl.ts b/public/app/features/alerting/alert_tab_ctrl.ts index c6683556745..89b1c63372f 100644 --- a/public/app/features/alerting/alert_tab_ctrl.ts +++ b/public/app/features/alerting/alert_tab_ctrl.ts @@ -82,6 +82,15 @@ export class AlertTabCtrl { ah.time = moment(ah.time).format('MMM D, YYYY HH:mm:ss'); ah.stateModel = alertDef.getStateDisplayModel(ah.newState); ah.metrics = alertDef.joinEvalMatches(ah.data, ', '); + + if (ah.data.errorMessage) { + ah.metrics = "Error: " + ah.data.errorMessage; + } + + if (ah.data.no_data) { + ah.metrics = "(due to no data)"; + } + return ah; }); }); diff --git a/public/app/features/alerting/partials/alert_list.html b/public/app/features/alerting/partials/alert_list.html index 35305b9bf03..5b723386904 100644 --- a/public/app/features/alerting/partials/alert_list.html +++ b/public/app/features/alerting/partials/alert_list.html @@ -52,11 +52,11 @@