Files
grafana/pkg/models/alert.go
T

205 lines
4.9 KiB
Go
Raw Normal View History

package models
import (
"fmt"
2019-04-23 11:24:47 +03:00
"time"
"github.com/grafana/grafana/pkg/components/simplejson"
)
2016-07-22 13:14:09 +02:00
type AlertStateType string
type NoDataOption string
type ExecutionErrorOption string
2016-07-22 13:14:09 +02:00
const (
AlertStateNoData AlertStateType = "no_data"
AlertStatePaused AlertStateType = "paused"
AlertStateAlerting AlertStateType = "alerting"
AlertStateOK AlertStateType = "ok"
AlertStatePending AlertStateType = "pending"
AlertStateUnknown AlertStateType = "unknown"
2016-07-22 13:14:09 +02:00
)
const (
2016-12-15 11:13:19 +01:00
NoDataSetOK NoDataOption = "ok"
NoDataSetNoData NoDataOption = "no_data"
NoDataKeepState NoDataOption = "keep_state"
2016-12-15 11:13:19 +01:00
NoDataSetAlerting NoDataOption = "alerting"
)
const (
ExecutionErrorSetOk ExecutionErrorOption = "ok"
ExecutionErrorSetAlerting ExecutionErrorOption = "alerting"
ExecutionErrorKeepState ExecutionErrorOption = "keep_state"
)
var (
2020-11-05 13:07:06 +01:00
ErrCannotChangeStateOnPausedAlert = fmt.Errorf("cannot change state on pause alert")
2019-04-23 11:24:47 +03:00
ErrRequiresNewState = fmt.Errorf("update alert state requires a new state")
)
2016-07-22 13:14:09 +02:00
func (s AlertStateType) IsValid() bool {
return s == AlertStateOK ||
s == AlertStateNoData ||
s == AlertStatePaused ||
s == AlertStatePending ||
s == AlertStateAlerting ||
s == AlertStateUnknown
2016-07-22 13:14:09 +02:00
}
func (s NoDataOption) IsValid() bool {
2016-12-15 11:13:19 +01:00
return s == NoDataSetNoData || s == NoDataSetAlerting || s == NoDataKeepState || s == NoDataSetOK
}
func (s NoDataOption) ToAlertState() AlertStateType {
return AlertStateType(s)
}
func (s ExecutionErrorOption) IsValid() bool {
return s == ExecutionErrorSetAlerting || s == ExecutionErrorKeepState || s == ExecutionErrorSetOk
}
func (s ExecutionErrorOption) ToAlertState() AlertStateType {
return AlertStateType(s)
}
type Alert struct {
2016-08-15 15:12:43 +02:00
Id int64
Version int64
2016-08-15 15:12:43 +02:00
OrgId int64
DashboardId int64
PanelId int64
Name string
Message string
2020-09-22 16:22:19 +02:00
Severity string // Unused
2016-08-15 15:12:43 +02:00
State AlertStateType
2020-09-22 16:22:19 +02:00
Handler int64 // Unused
2016-08-15 15:12:43 +02:00
Silenced bool
ExecutionError string
Frequency int64
2018-11-05 11:05:30 +01:00
For time.Duration
2016-08-15 15:12:43 +02:00
EvalData *simplejson.Json
NewStateDate time.Time
StateChanges int64
2016-07-14 13:32:16 +02:00
Created time.Time
Updated time.Time
2016-06-13 15:18:19 +02:00
Settings *simplejson.Json
}
func (a *Alert) ValidToSave() bool {
return a.DashboardId != 0 && a.OrgId != 0 && a.PanelId != 0
}
2020-11-05 13:07:06 +01:00
func (a *Alert) ContainsUpdates(other *Alert) bool {
result := false
2020-11-05 13:07:06 +01:00
result = result || a.Name != other.Name
result = result || a.Message != other.Message
2020-11-05 13:07:06 +01:00
if a.Settings != nil && other.Settings != nil {
json1, err1 := a.Settings.Encode()
2016-06-13 15:18:19 +02:00
json2, err2 := other.Settings.Encode()
2016-06-10 11:37:03 +02:00
if err1 != nil || err2 != nil {
return false
}
2016-06-10 11:37:03 +02:00
result = result || string(json1) != string(json2)
}
2020-09-22 16:22:19 +02:00
// don't compare .State! That would be insane.
return result
}
func (a *Alert) GetTagsFromSettings() []*Tag {
2019-06-06 13:29:30 +02:00
tags := []*Tag{}
if a.Settings != nil {
if data, ok := a.Settings.CheckGet("alertRuleTags"); ok {
2019-06-06 13:29:30 +02:00
for tagNameString, tagValue := range data.MustMap() {
// MustMap() already guarantees the return of a `map[string]interface{}`.
// Therefore we only need to verify that tagValue is a String.
tagValueString := simplejson.NewFromAny(tagValue).MustString()
tags = append(tags, &Tag{Key: tagNameString, Value: tagValueString})
}
}
}
return tags
}
2016-10-10 14:26:09 +02:00
type PauseAlertCommand struct {
OrgId int64
AlertIds []int64
ResultCount int64
Paused bool
2016-10-10 14:26:09 +02:00
}
type PauseAllAlertCommand struct {
ResultCount int64
Paused bool
}
2016-07-22 13:14:09 +02:00
type SetAlertStateCommand struct {
AlertId int64
OrgId int64
State AlertStateType
Error string
EvalData *simplejson.Json
Result Alert
2016-07-22 13:14:09 +02:00
}
2020-09-22 16:22:19 +02:00
// Queries
type GetAlertsQuery struct {
2018-06-01 14:36:40 +02:00
OrgId int64
State []string
DashboardIDs []int64
PanelId int64
Limit int64
Query string
User *SignedInUser
Result []*AlertListItemDTO
}
type GetAllAlertsQuery struct {
Result []*Alert
}
type GetAlertByIdQuery struct {
Id int64
Result *Alert
}
type GetAlertStatesForDashboardQuery struct {
OrgId int64
DashboardId int64
Result []*AlertStateInfoDTO
}
type AlertListItemDTO struct {
Id int64 `json:"id"`
DashboardId int64 `json:"dashboardId"`
DashboardUid string `json:"dashboardUid"`
DashboardSlug string `json:"dashboardSlug"`
PanelId int64 `json:"panelId"`
Name string `json:"name"`
State AlertStateType `json:"state"`
NewStateDate time.Time `json:"newStateDate"`
EvalDate time.Time `json:"evalDate"`
EvalData *simplejson.Json `json:"evalData"`
ExecutionError string `json:"executionError"`
Url string `json:"url"`
}
type AlertStateInfoDTO struct {
Id int64 `json:"id"`
DashboardId int64 `json:"dashboardId"`
PanelId int64 `json:"panelId"`
State AlertStateType `json:"state"`
NewStateDate time.Time `json:"newStateDate"`
}