mirror of
https://github.com/grafana/grafana.git
synced 2024-11-30 12:44:10 -06:00
fd633a1d5d
This way we are able to edit notification behavior per notifier. This would be usefull to let some notifiers send notifications, even when the state doesn't change, or with custom condition. Signed-off-by: Thibault Chataigner <t.chataigner@criteo.com>
112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
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
|
|
ConditionEvals 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 (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&orgId=%d", setting.AppUrl, slug, c.Rule.PanelId, c.Rule.OrgId)
|
|
return ruleUrl, nil
|
|
}
|
|
}
|