eval_context.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package alerting
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/log"
  7. m "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/setting"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. )
  11. type EvalContext struct {
  12. Firing bool
  13. IsTestRun bool
  14. EvalMatches []*EvalMatch
  15. Logs []*ResultLogEntry
  16. Error error
  17. Description string
  18. StartTime time.Time
  19. EndTime time.Time
  20. Rule *Rule
  21. DoneChan chan bool
  22. CancelChan chan bool
  23. log log.Logger
  24. dashboardSlug string
  25. ImagePublicUrl string
  26. ImageOnDiskPath string
  27. NoDataFound bool
  28. RetryCount int
  29. TimeRange tsdb.TimeRange
  30. }
  31. type StateDescription struct {
  32. Color string
  33. Text string
  34. Data string
  35. }
  36. func (c *EvalContext) GetStateModel() *StateDescription {
  37. switch c.Rule.State {
  38. case m.AlertStateOK:
  39. return &StateDescription{
  40. Color: "#36a64f",
  41. Text: "OK",
  42. }
  43. case m.AlertStateNoData:
  44. return &StateDescription{
  45. Color: "#888888",
  46. Text: "No Data",
  47. }
  48. case m.AlertStateExecError:
  49. return &StateDescription{
  50. Color: "#000",
  51. Text: "Execution Error",
  52. }
  53. case m.AlertStateAlerting:
  54. return &StateDescription{
  55. Color: "#D63232",
  56. Text: "Alerting",
  57. }
  58. default:
  59. panic("Unknown rule state " + c.Rule.State)
  60. }
  61. }
  62. func (a *EvalContext) GetDurationMs() float64 {
  63. return float64(a.EndTime.Nanosecond()-a.StartTime.Nanosecond()) / float64(1000000)
  64. }
  65. func (c *EvalContext) GetNotificationTitle() string {
  66. return "[" + c.GetStateModel().Text + "] " + c.Rule.Name
  67. }
  68. func (c *EvalContext) getDashboardSlug() (string, error) {
  69. if c.dashboardSlug != "" {
  70. return c.dashboardSlug, nil
  71. }
  72. slugQuery := &m.GetDashboardSlugByIdQuery{Id: c.Rule.DashboardId}
  73. if err := bus.Dispatch(slugQuery); err != nil {
  74. return "", err
  75. }
  76. c.dashboardSlug = slugQuery.Result
  77. return c.dashboardSlug, nil
  78. }
  79. func (c *EvalContext) GetRuleUrl() (string, error) {
  80. if slug, err := c.getDashboardSlug(); err != nil {
  81. return "", err
  82. } else {
  83. ruleUrl := fmt.Sprintf("%sdashboard/db/%s?fullscreen&edit&tab=alert&panelId=%d", setting.AppUrl, slug, c.Rule.PanelId)
  84. return ruleUrl, nil
  85. }
  86. }
  87. func (c *EvalContext) GetImageUrl() (string, error) {
  88. if slug, err := c.getDashboardSlug(); err != nil {
  89. return "", err
  90. } else {
  91. ruleUrl := fmt.Sprintf("%sdashboard-solo/db/%s?&panelId=%d", setting.AppUrl, slug, c.Rule.PanelId)
  92. return ruleUrl, nil
  93. }
  94. }
  95. func NewEvalContext(rule *Rule) *EvalContext {
  96. return &EvalContext{
  97. StartTime: time.Now(),
  98. Rule: rule,
  99. Logs: make([]*ResultLogEntry, 0),
  100. EvalMatches: make([]*EvalMatch, 0),
  101. DoneChan: make(chan bool, 1),
  102. CancelChan: make(chan bool, 1),
  103. log: log.New("alerting.evalContext"),
  104. RetryCount: 0,
  105. }
  106. }