mirror of
https://github.com/grafana/grafana.git
synced 2024-12-01 21:19:28 -06:00
1cc034d960
This change adds a field to state.State and models.AlertInstance that indicate the "Reason" that an instance has its current state. This helps us account for cases where the state is "Normal" but the underlying evaluation returned "NoData" or "Error", for example. Fixes #42606 Signed-off-by: Joe Blubaugh <joe.blubaugh@grafana.com>
100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// AlertInstance represents a single alert instance.
|
|
type AlertInstance struct {
|
|
RuleOrgID int64 `xorm:"rule_org_id"`
|
|
RuleUID string `xorm:"rule_uid"`
|
|
Labels InstanceLabels
|
|
LabelsHash string
|
|
CurrentState InstanceStateType
|
|
CurrentReason string
|
|
CurrentStateSince time.Time
|
|
CurrentStateEnd time.Time
|
|
LastEvalTime time.Time
|
|
}
|
|
|
|
// InstanceStateType is an enum for instance states.
|
|
type InstanceStateType string
|
|
|
|
const (
|
|
// InstanceStateFiring is for a firing alert.
|
|
InstanceStateFiring InstanceStateType = "Alerting"
|
|
// InstanceStateNormal is for a normal alert.
|
|
InstanceStateNormal InstanceStateType = "Normal"
|
|
// InstanceStatePending is for an alert that is firing but has not met the duration
|
|
InstanceStatePending InstanceStateType = "Pending"
|
|
// InstanceStateNoData is for an alert with no data.
|
|
InstanceStateNoData InstanceStateType = "NoData"
|
|
// InstanceStateError is for a erroring alert.
|
|
InstanceStateError InstanceStateType = "Error"
|
|
)
|
|
|
|
// IsValid checks that the value of InstanceStateType is a valid
|
|
// string.
|
|
func (i InstanceStateType) IsValid() bool {
|
|
return i == InstanceStateFiring ||
|
|
i == InstanceStateNormal ||
|
|
i == InstanceStateNoData ||
|
|
i == InstanceStatePending ||
|
|
i == InstanceStateError
|
|
}
|
|
|
|
// SaveAlertInstanceCommand is the query for saving a new alert instance.
|
|
type SaveAlertInstanceCommand struct {
|
|
RuleOrgID int64
|
|
RuleUID string
|
|
Labels InstanceLabels
|
|
State InstanceStateType
|
|
StateReason string
|
|
LastEvalTime time.Time
|
|
CurrentStateSince time.Time
|
|
CurrentStateEnd time.Time
|
|
}
|
|
|
|
// GetAlertInstanceQuery is the query for retrieving/deleting an alert definition by ID.
|
|
// nolint:unused
|
|
type GetAlertInstanceQuery struct {
|
|
RuleOrgID int64
|
|
RuleUID string
|
|
Labels InstanceLabels
|
|
|
|
Result *AlertInstance
|
|
}
|
|
|
|
// ListAlertInstancesQuery is the query list alert Instances.
|
|
type ListAlertInstancesQuery struct {
|
|
RuleOrgID int64 `json:"-"`
|
|
RuleUID string
|
|
State InstanceStateType
|
|
StateReason string
|
|
|
|
Result []*AlertInstance
|
|
}
|
|
|
|
// ValidateAlertInstance validates that the alert instance contains an alert rule id,
|
|
// and state.
|
|
func ValidateAlertInstance(alertInstance *AlertInstance) error {
|
|
if alertInstance == nil {
|
|
return fmt.Errorf("alert instance is invalid because it is nil")
|
|
}
|
|
|
|
if alertInstance.RuleOrgID == 0 {
|
|
return fmt.Errorf("alert instance is invalid due to missing alert rule organisation")
|
|
}
|
|
|
|
if alertInstance.RuleUID == "" {
|
|
return fmt.Errorf("alert instance is invalid due to missing alert rule uid")
|
|
}
|
|
|
|
if !alertInstance.CurrentState.IsValid() {
|
|
return fmt.Errorf("alert instance is invalid because the state '%v' is invalid", alertInstance.CurrentState)
|
|
}
|
|
|
|
return nil
|
|
}
|