alert_rule.go 2.8 KB

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