alert_rule.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. NotificationGroups []int64
  26. }
  27. var (
  28. ValueFormatRegex = regexp.MustCompile("^\\d+")
  29. UnitFormatRegex = regexp.MustCompile("\\w{1}$")
  30. )
  31. var unitMultiplier = map[string]int{
  32. "s": 1,
  33. "m": 60,
  34. "h": 3600,
  35. }
  36. func getTimeDurationStringToSeconds(str string) int64 {
  37. multiplier := 1
  38. value, _ := strconv.Atoi(ValueFormatRegex.FindAllString(str, 1)[0])
  39. unit := UnitFormatRegex.FindAllString(str, 1)[0]
  40. if val, ok := unitMultiplier[unit]; ok {
  41. multiplier = val
  42. }
  43. return int64(value * multiplier)
  44. }
  45. func NewAlertRuleFromDBModel(ruleDef *m.Alert) (*AlertRule, error) {
  46. model := &AlertRule{}
  47. model.Id = ruleDef.Id
  48. model.OrgId = ruleDef.OrgId
  49. model.Name = ruleDef.Name
  50. model.Description = ruleDef.Description
  51. model.State = ruleDef.State
  52. model.Frequency = ruleDef.Frequency
  53. model.NotificationGroups = []int64{1, 2}
  54. critical := ruleDef.Settings.Get("crit")
  55. model.Critical = Level{
  56. Operator: critical.Get("op").MustString(),
  57. Value: critical.Get("value").MustFloat64(),
  58. }
  59. warning := ruleDef.Settings.Get("warn")
  60. model.Warning = Level{
  61. Operator: warning.Get("op").MustString(),
  62. Value: warning.Get("value").MustFloat64(),
  63. }
  64. model.Transform = ruleDef.Settings.Get("transform").Get("type").MustString()
  65. model.TransformParams = *ruleDef.Settings.Get("transform")
  66. if model.Transform == "aggregation" {
  67. method := ruleDef.Settings.Get("transform").Get("method").MustString()
  68. model.Transformer = transformers.NewAggregationTransformer(method)
  69. }
  70. query := ruleDef.Settings.Get("query")
  71. model.Query = AlertQuery{
  72. Query: query.Get("query").MustString(),
  73. DatasourceId: query.Get("datasourceId").MustInt64(),
  74. From: query.Get("from").MustString(),
  75. To: query.Get("to").MustString(),
  76. Aggregator: query.Get("agg").MustString(),
  77. }
  78. if model.Query.Query == "" {
  79. return nil, fmt.Errorf("missing query.query")
  80. }
  81. if model.Query.DatasourceId == 0 {
  82. return nil, fmt.Errorf("missing query.datasourceId")
  83. }
  84. return model, nil
  85. }