test_rule.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. Result *EvalContext
  14. }
  15. func init() {
  16. bus.AddHandler("alerting", handleAlertTestCommand)
  17. }
  18. func handleAlertTestCommand(cmd *AlertTestCommand) error {
  19. dash := m.NewDashboardFromJson(cmd.Dashboard)
  20. extractor := NewDashAlertExtractor(dash, cmd.OrgId)
  21. alerts, err := extractor.GetAlerts()
  22. if err != nil {
  23. return err
  24. }
  25. for _, alert := range alerts {
  26. if alert.PanelId == cmd.PanelId {
  27. rule, err := NewRuleFromDBAlert(alert)
  28. if err != nil {
  29. return err
  30. }
  31. cmd.Result = testAlertRule(rule)
  32. return nil
  33. }
  34. }
  35. return fmt.Errorf("Could not find alert with panel id %d", cmd.PanelId)
  36. }
  37. func testAlertRule(rule *Rule) *EvalContext {
  38. handler := NewEvalHandler()
  39. context := NewEvalContext(context.TODO(), rule)
  40. context.IsTestRun = true
  41. handler.Eval(context)
  42. return context
  43. }