test_rule.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package alerting
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. m "github.com/grafana/grafana/pkg/models"
  8. )
  9. type AlertTestCommand struct {
  10. Dashboard *simplejson.Json
  11. PanelId int64
  12. OrgId int64
  13. User *m.SignedInUser
  14. Result *EvalContext
  15. }
  16. func init() {
  17. bus.AddHandler("alerting", handleAlertTestCommand)
  18. }
  19. func handleAlertTestCommand(cmd *AlertTestCommand) error {
  20. dash := m.NewDashboardFromJson(cmd.Dashboard)
  21. extractor := NewDashAlertExtractor(dash, cmd.OrgId, cmd.User)
  22. alerts, err := extractor.GetAlerts()
  23. if err != nil {
  24. return err
  25. }
  26. for _, alert := range alerts {
  27. if alert.PanelId == cmd.PanelId {
  28. rule, err := NewRuleFromDBAlert(alert)
  29. if err != nil {
  30. return err
  31. }
  32. cmd.Result = testAlertRule(rule)
  33. return nil
  34. }
  35. }
  36. return fmt.Errorf("Could not find alert with panel id %d", cmd.PanelId)
  37. }
  38. func testAlertRule(rule *Rule) *EvalContext {
  39. handler := NewEvalHandler()
  40. context := NewEvalContext(context.Background(), rule)
  41. context.IsTestRun = true
  42. handler.Eval(context)
  43. context.Rule.State = context.GetNewState()
  44. return context
  45. }