handler.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package alerting
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/log"
  5. )
  6. var (
  7. descriptionFmt = "Actual value: %1.2f for %s. "
  8. )
  9. type HandlerImpl struct {
  10. log log.Logger
  11. }
  12. func NewHandler() *HandlerImpl {
  13. return &HandlerImpl{
  14. log: log.New("alerting.executor"),
  15. }
  16. }
  17. func (e *HandlerImpl) Execute(rule *AlertRule, resultQueue chan *AlertResultContext) {
  18. resultQueue <- e.eval(rule)
  19. }
  20. func (e *HandlerImpl) eval(rule *AlertRule) *AlertResultContext {
  21. result := &AlertResultContext{
  22. StartTime: time.Now(),
  23. }
  24. for _, condition := range rule.Conditions {
  25. condition.Eval(result)
  26. // break if condition could not be evaluated
  27. if result.Error != nil {
  28. break
  29. }
  30. // break if result has not triggered yet
  31. if result.Triggered == false {
  32. break
  33. }
  34. }
  35. result.EndTime = time.Now()
  36. return result
  37. }
  38. // func (e *HandlerImpl) executeQuery(job *AlertJob) (tsdb.TimeSeriesSlice, error) {
  39. // getDsInfo := &m.GetDataSourceByIdQuery{
  40. // Id: job.Rule.Query.DatasourceId,
  41. // OrgId: job.Rule.OrgId,
  42. // }
  43. //
  44. // if err := bus.Dispatch(getDsInfo); err != nil {
  45. // return nil, fmt.Errorf("Could not find datasource")
  46. // }
  47. //
  48. // req := e.GetRequestForAlertRule(job.Rule, getDsInfo.Result)
  49. // result := make(tsdb.TimeSeriesSlice, 0)
  50. //
  51. // resp, err := tsdb.HandleRequest(req)
  52. // if err != nil {
  53. // return nil, fmt.Errorf("Alerting: GetSeries() tsdb.HandleRequest() error %v", err)
  54. // }
  55. //
  56. // for _, v := range resp.Results {
  57. // if v.Error != nil {
  58. // return nil, fmt.Errorf("Alerting: GetSeries() tsdb.HandleRequest() response error %v", v)
  59. // }
  60. //
  61. // result = append(result, v.Series...)
  62. // }
  63. //
  64. // return result, nil
  65. // }
  66. //
  67. // func (e *HandlerImpl) GetRequestForAlertRule(rule *AlertRule, datasource *m.DataSource) *tsdb.Request {
  68. // e.log.Debug("GetRequest", "query", rule.Query.Query, "from", rule.Query.From, "datasourceId", datasource.Id)
  69. // req := &tsdb.Request{
  70. // TimeRange: tsdb.TimeRange{
  71. // From: "-" + rule.Query.From,
  72. // To: rule.Query.To,
  73. // },
  74. // Queries: []*tsdb.Query{
  75. // {
  76. // RefId: "A",
  77. // Query: rule.Query.Query,
  78. // DataSource: &tsdb.DataSourceInfo{
  79. // Id: datasource.Id,
  80. // Name: datasource.Name,
  81. // PluginId: datasource.Type,
  82. // Url: datasource.Url,
  83. // },
  84. // },
  85. // },
  86. // }
  87. //
  88. // return req
  89. // }
  90. //
  91. // func (e *HandlerImpl) evaluateRule(rule *AlertRule, series tsdb.TimeSeriesSlice) *AlertResult {
  92. // e.log.Debug("Evaluating Alerting Rule", "seriesCount", len(series), "ruleName", rule.Name)
  93. //
  94. // triggeredAlert := make([]*TriggeredAlert, 0)
  95. //
  96. // for _, serie := range series {
  97. // e.log.Debug("Evaluating series", "series", serie.Name)
  98. // transformedValue, _ := rule.Transformer.Transform(serie)
  99. //
  100. // critResult := evalCondition(rule.Critical, transformedValue)
  101. // condition2 := fmt.Sprintf("%v %s %v ", transformedValue, rule.Critical.Operator, rule.Critical.Value)
  102. // e.log.Debug("Alert execution Crit", "name", serie.Name, "condition", condition2, "result", critResult)
  103. // if critResult {
  104. // triggeredAlert = append(triggeredAlert, &TriggeredAlert{
  105. // State: alertstates.Critical,
  106. // Value: transformedValue,
  107. // Metric: serie.Name,
  108. // })
  109. // continue
  110. // }
  111. //
  112. // warnResult := evalCondition(rule.Warning, transformedValue)
  113. // condition := fmt.Sprintf("%v %s %v ", transformedValue, rule.Warning.Operator, rule.Warning.Value)
  114. // e.log.Debug("Alert execution Warn", "name", serie.Name, "condition", condition, "result", warnResult)
  115. // if warnResult {
  116. // triggeredAlert = append(triggeredAlert, &TriggeredAlert{
  117. // State: alertstates.Warn,
  118. // Value: transformedValue,
  119. // Metric: serie.Name,
  120. // })
  121. // }
  122. // }
  123. //
  124. // executionState := alertstates.Ok
  125. // for _, raised := range triggeredAlert {
  126. // if raised.State == alertstates.Critical {
  127. // executionState = alertstates.Critical
  128. // }
  129. //
  130. // if executionState != alertstates.Critical && raised.State == alertstates.Warn {
  131. // executionState = alertstates.Warn
  132. // }
  133. // }
  134. //
  135. // return &AlertResult{State: executionState, TriggeredAlerts: triggeredAlert}
  136. // }