test_rule.go 1.2 KB

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