alert_rule.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package alerting
  2. import (
  3. "fmt"
  4. "regexp"
  5. "strconv"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. "github.com/grafana/grafana/pkg/services/alerting/transformers"
  8. m "github.com/grafana/grafana/pkg/models"
  9. )
  10. type AlertRule struct {
  11. Id int64
  12. OrgId int64
  13. DashboardId int64
  14. PanelId int64
  15. Frequency int64
  16. Name string
  17. Description string
  18. State string
  19. Warning Level
  20. Critical Level
  21. Query AlertQuery
  22. Transform string
  23. TransformParams simplejson.Json
  24. Transformer transformers.Transformer
  25. }
  26. var (
  27. ValueFormatRegex = regexp.MustCompile("^\\d+")
  28. UnitFormatRegex = regexp.MustCompile("\\w{1}$")
  29. )
  30. var unitMultiplier = map[string]int{
  31. "s": 1,
  32. "m": 60,
  33. "h": 3600,
  34. }
  35. func getTimeDurationStringToSeconds(str string) int64 {
  36. multiplier := 1
  37. value, _ := strconv.Atoi(ValueFormatRegex.FindAllString(str, 1)[0])
  38. unit := UnitFormatRegex.FindAllString(str, 1)[0]
  39. if val, ok := unitMultiplier[unit]; ok {
  40. multiplier = val
  41. }
  42. return int64(value * multiplier)
  43. }
  44. func NewAlertRuleFromDBModel(ruleDef *m.Alert) (*AlertRule, error) {
  45. model := &AlertRule{}
  46. model.Id = ruleDef.Id
  47. model.OrgId = ruleDef.OrgId
  48. model.Name = ruleDef.Name
  49. model.Description = ruleDef.Description
  50. model.State = ruleDef.State
  51. critical := ruleDef.Settings.Get("critical")
  52. model.Critical = Level{
  53. Operator: critical.Get("op").MustString(),
  54. Level: critical.Get("level").MustFloat64(),
  55. }
  56. warning := ruleDef.Settings.Get("warn")
  57. model.Warning = Level{
  58. Operator: warning.Get("op").MustString(),
  59. Level: warning.Get("level").MustFloat64(),
  60. }
  61. model.Frequency = getTimeDurationStringToSeconds(ruleDef.Settings.Get("frequency").MustString())
  62. model.Transform = ruleDef.Settings.Get("transform").Get("type").MustString()
  63. model.TransformParams = *ruleDef.Settings.Get("transform")
  64. if model.Transform == "aggregation" {
  65. method := ruleDef.Settings.Get("transform").Get("method").MustString()
  66. model.Transformer = transformers.NewAggregationTransformer(method)
  67. }
  68. query := ruleDef.Settings.Get("query")
  69. model.Query = AlertQuery{
  70. Query: query.Get("query").MustString(),
  71. DatasourceId: query.Get("datasourceId").MustInt64(),
  72. From: query.Get("from").MustString(),
  73. To: query.Get("to").MustString(),
  74. Aggregator: query.Get("agg").MustString(),
  75. }
  76. if model.Query.Query == "" {
  77. return nil, fmt.Errorf("missing query.query")
  78. }
  79. if model.Query.DatasourceId == 0 {
  80. return nil, fmt.Errorf("missing query.datasourceId")
  81. }
  82. return model, nil
  83. }