handler.go 4.4 KB

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