| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package alerting
- import (
- "context"
- "fmt"
- "time"
- "github.com/grafana/grafana/pkg/bus"
- "github.com/grafana/grafana/pkg/log"
- m "github.com/grafana/grafana/pkg/models"
- "github.com/grafana/grafana/pkg/setting"
- )
- type EvalContext struct {
- Firing bool
- IsTestRun bool
- EvalMatches []*EvalMatch
- Logs []*ResultLogEntry
- Error error
- Description string
- StartTime time.Time
- EndTime time.Time
- Rule *Rule
- log log.Logger
- dashboardSlug string
- ImagePublicUrl string
- ImageOnDiskPath string
- NoDataFound bool
- PrevAlertState m.AlertStateType
- Ctx context.Context
- }
- func NewEvalContext(alertCtx context.Context, rule *Rule) *EvalContext {
- return &EvalContext{
- Ctx: alertCtx,
- StartTime: time.Now(),
- Rule: rule,
- Logs: make([]*ResultLogEntry, 0),
- EvalMatches: make([]*EvalMatch, 0),
- log: log.New("alerting.evalContext"),
- PrevAlertState: rule.State,
- }
- }
- type StateDescription struct {
- Color string
- Text string
- Data string
- }
- func (c *EvalContext) GetStateModel() *StateDescription {
- switch c.Rule.State {
- case m.AlertStateOK:
- return &StateDescription{
- Color: "#36a64f",
- Text: "OK",
- }
- case m.AlertStateNoData:
- return &StateDescription{
- Color: "#888888",
- Text: "No Data",
- }
- case m.AlertStateAlerting:
- return &StateDescription{
- Color: "#D63232",
- Text: "Alerting",
- }
- default:
- panic("Unknown rule state " + c.Rule.State)
- }
- }
- func (c *EvalContext) ShouldUpdateAlertState() bool {
- return c.Rule.State != c.PrevAlertState
- }
- func (c *EvalContext) ShouldSendNotification() bool {
- if (c.PrevAlertState == m.AlertStatePending) && (c.Rule.State == m.AlertStateOK) {
- return false
- }
- return true
- }
- func (a *EvalContext) GetDurationMs() float64 {
- return float64(a.EndTime.Nanosecond()-a.StartTime.Nanosecond()) / float64(1000000)
- }
- func (c *EvalContext) GetNotificationTitle() string {
- return "[" + c.GetStateModel().Text + "] " + c.Rule.Name
- }
- func (c *EvalContext) GetDashboardSlug() (string, error) {
- if c.dashboardSlug != "" {
- return c.dashboardSlug, nil
- }
- slugQuery := &m.GetDashboardSlugByIdQuery{Id: c.Rule.DashboardId}
- if err := bus.Dispatch(slugQuery); err != nil {
- return "", err
- }
- c.dashboardSlug = slugQuery.Result
- return c.dashboardSlug, nil
- }
- func (c *EvalContext) GetRuleUrl() (string, error) {
- if c.IsTestRun {
- return setting.AppUrl, nil
- }
- if slug, err := c.GetDashboardSlug(); err != nil {
- return "", err
- } else {
- ruleUrl := fmt.Sprintf("%sdashboard/db/%s?fullscreen&edit&tab=alert&panelId=%d", setting.AppUrl, slug, c.Rule.PanelId)
- return ruleUrl, nil
- }
- }
|