dashboard_parser.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package alerting
  2. import (
  3. "github.com/grafana/grafana/pkg/bus"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. func ParseAlertsFromDashboard(cmd *m.SaveDashboardCommand) []m.AlertRule {
  8. alerts := make([]m.AlertRule, 0)
  9. for _, rowObj := range cmd.Dashboard.Get("rows").MustArray() {
  10. row := simplejson.NewFromAny(rowObj)
  11. for _, panelObj := range row.Get("panels").MustArray() {
  12. panel := simplejson.NewFromAny(panelObj)
  13. alerting := panel.Get("alerting")
  14. alert := m.AlertRule{
  15. DashboardId: cmd.Result.Id,
  16. OrgId: cmd.Result.OrgId,
  17. PanelId: panel.Get("id").MustInt64(),
  18. Id: alerting.Get("id").MustInt64(),
  19. QueryRefId: alerting.Get("queryRef").MustString(),
  20. WarnLevel: alerting.Get("warnLevel").MustInt64(),
  21. CritLevel: alerting.Get("critLevel").MustInt64(),
  22. WarnOperator: alerting.Get("warnOperator").MustString(),
  23. CritOperator: alerting.Get("critOperator").MustString(),
  24. Interval: alerting.Get("interval").MustString(),
  25. Title: alerting.Get("title").MustString(),
  26. Description: alerting.Get("description").MustString(),
  27. QueryRange: alerting.Get("queryRange").MustInt(),
  28. Aggregator: alerting.Get("aggregator").MustString(),
  29. }
  30. for _, targetsObj := range panel.Get("targets").MustArray() {
  31. target := simplejson.NewFromAny(targetsObj)
  32. if target.Get("refId").MustString() == alert.QueryRefId {
  33. targetJson, err := target.MarshalJSON()
  34. if err == nil {
  35. alert.Query = string(targetJson)
  36. }
  37. continue
  38. }
  39. }
  40. if panel.Get("datasource").MustString() == "" {
  41. query := &m.GetDataSourcesQuery{OrgId: cmd.OrgId}
  42. if err := bus.Dispatch(query); err == nil {
  43. for _, ds := range query.Result {
  44. if ds.IsDefault {
  45. alert.DatasourceId = ds.Id
  46. }
  47. }
  48. }
  49. } else {
  50. query := &m.GetDataSourceByNameQuery{
  51. Name: panel.Get("datasource").MustString(),
  52. OrgId: cmd.OrgId,
  53. }
  54. bus.Dispatch(query)
  55. alert.DatasourceId = query.Result.Id
  56. }
  57. if alert.Query != "" {
  58. alerts = append(alerts, alert)
  59. }
  60. }
  61. }
  62. return alerts
  63. }