eval_handler.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package alerting
  2. import (
  3. "strconv"
  4. "time"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/metrics"
  7. )
  8. type DefaultEvalHandler struct {
  9. log log.Logger
  10. alertJobTimeout time.Duration
  11. }
  12. func NewEvalHandler() *DefaultEvalHandler {
  13. return &DefaultEvalHandler{
  14. log: log.New("alerting.evalHandler"),
  15. alertJobTimeout: time.Second * 5,
  16. }
  17. }
  18. func (e *DefaultEvalHandler) Eval(context *EvalContext) {
  19. firing := true
  20. firingEval := ""
  21. for i := 0; i < len(context.Rule.Conditions); i++ {
  22. condition := context.Rule.Conditions[i]
  23. cr, err := condition.Eval(context)
  24. if err != nil {
  25. context.Error = err
  26. }
  27. // break if condition could not be evaluated
  28. if context.Error != nil {
  29. break
  30. }
  31. // calculating Firing based on operator
  32. operator := "AND"
  33. if cr.Operator == "or" {
  34. firing = firing || cr.Firing
  35. operator = "OR"
  36. } else {
  37. firing = firing && cr.Firing
  38. }
  39. if i > 0 {
  40. firingEval = "[" + firingEval + " " + operator + " " + strconv.FormatBool(cr.Firing) + "]"
  41. } else {
  42. firingEval = "[" + strconv.FormatBool(firing) + "]"
  43. }
  44. context.EvalMatches = append(context.EvalMatches, cr.EvalMatches...)
  45. }
  46. context.FiringEval = firingEval + " = " + strconv.FormatBool(firing)
  47. context.Firing = firing
  48. context.EndTime = time.Now()
  49. elapsedTime := context.EndTime.Sub(context.StartTime) / time.Millisecond
  50. metrics.M_Alerting_Exeuction_Time.Update(elapsedTime)
  51. }