| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2016-12-19 23:07:55 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2016-12-19 20:24:45 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2016-12-16 00:01:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							|  |  |  | 	m "github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | // timeNow makes it possible to test usage of time
 | 
					
						
							|  |  |  | var timeNow = time.Now | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | func init() { | 
					
						
							|  |  |  | 	bus.AddHandler("sql", SaveAlerts) | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 	bus.AddHandler("sql", HandleAlertsQuery) | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 	bus.AddHandler("sql", GetAlertById) | 
					
						
							| 
									
										
										
										
											2016-06-03 21:24:53 +08:00
										 |  |  | 	bus.AddHandler("sql", GetAllAlertQueryHandler) | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 	bus.AddHandler("sql", SetAlertState) | 
					
						
							| 
									
										
										
										
											2016-09-30 23:37:47 +08:00
										 |  |  | 	bus.AddHandler("sql", GetAlertStatesForDashboard) | 
					
						
							| 
									
										
										
										
											2016-12-19 21:36:44 +08:00
										 |  |  | 	bus.AddHandler("sql", PauseAlert) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", PauseAllAlerts) | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 14:23:50 +08:00
										 |  |  | func GetAlertById(query *m.GetAlertByIdQuery) error { | 
					
						
							| 
									
										
										
										
											2016-06-11 16:26:48 +08:00
										 |  |  | 	alert := m.Alert{} | 
					
						
							| 
									
										
										
										
											2018-01-24 05:28:47 +08:00
										 |  |  | 	has, err := x.ID(query.Id).Get(&alert) | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 	if !has { | 
					
						
							|  |  |  | 		return fmt.Errorf("could not find alert") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-28 16:59:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 19:50:47 +08:00
										 |  |  | 	query.Result = &alert | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 21:24:53 +08:00
										 |  |  | func GetAllAlertQueryHandler(query *m.GetAllAlertsQuery) error { | 
					
						
							| 
									
										
										
										
											2016-06-11 16:26:48 +08:00
										 |  |  | 	var alerts []*m.Alert | 
					
						
							| 
									
										
										
										
											2016-06-11 16:54:24 +08:00
										 |  |  | 	err := x.Sql("select * from alert").Find(&alerts) | 
					
						
							| 
									
										
										
										
											2016-06-03 21:24:53 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query.Result = alerts | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | func deleteAlertByIdInternal(alertId int64, reason string, sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-10-14 15:43:30 +08:00
										 |  |  | 	sqlog.Debug("Deleting alert", "id", alertId, "reason", reason) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := sess.Exec("DELETE FROM alert WHERE id = ?", alertId); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if _, err := sess.Exec("DELETE FROM annotation WHERE alert_id = ?", alertId); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | func HandleAlertsQuery(query *m.GetAlertsQuery) error { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 	builder := SqlBuilder{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	builder.Write(`SELECT | 
					
						
							|  |  |  | 		alert.id, | 
					
						
							|  |  |  | 		alert.dashboard_id, | 
					
						
							|  |  |  | 		alert.panel_id, | 
					
						
							|  |  |  | 		alert.name, | 
					
						
							|  |  |  | 		alert.state, | 
					
						
							|  |  |  | 		alert.new_state_date, | 
					
						
							|  |  |  | 		alert.eval_date, | 
					
						
							|  |  |  | 		alert.execution_error, | 
					
						
							|  |  |  | 		dashboard.uid as dashboard_uid, | 
					
						
							|  |  |  | 		dashboard.slug as dashboard_slug | 
					
						
							|  |  |  | 		FROM alert | 
					
						
							|  |  |  | 		INNER JOIN dashboard on dashboard.id = alert.dashboard_id `) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	builder.Write(`WHERE alert.org_id = ?`, query.OrgId) | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-10 15:45:56 +08:00
										 |  |  | 	if query.DashboardId != 0 { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 		builder.Write(` AND alert.dashboard_id = ?`, query.DashboardId) | 
					
						
							| 
									
										
										
										
											2016-05-10 15:45:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if query.PanelId != 0 { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 		builder.Write(` AND alert.panel_id = ?`, query.PanelId) | 
					
						
							| 
									
										
										
										
											2016-05-10 15:45:56 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-31 21:16:19 +08:00
										 |  |  | 	if len(query.State) > 0 && query.State[0] != "all" { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 		builder.Write(` AND (`) | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 		for i, v := range query.State { | 
					
						
							|  |  |  | 			if i > 0 { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 				builder.Write(" OR ") | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-15 17:48:03 +08:00
										 |  |  | 			if strings.HasPrefix(v, "not_") { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 				builder.Write("state <> ? ") | 
					
						
							| 
									
										
										
										
											2017-11-15 17:48:03 +08:00
										 |  |  | 				v = strings.TrimPrefix(v, "not_") | 
					
						
							| 
									
										
										
										
											2017-11-13 17:30:11 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 				builder.Write("state = ? ") | 
					
						
							| 
									
										
										
										
											2017-11-13 17:30:11 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 			builder.AddParams(v) | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 		builder.Write(")") | 
					
						
							| 
									
										
										
										
											2016-05-09 20:30:28 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 	if query.User.OrgRole != m.ROLE_ADMIN { | 
					
						
							|  |  |  | 		builder.writeDashboardPermissionFilter(query.User, m.PERMISSION_EDIT) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	builder.Write(" ORDER BY name ASC") | 
					
						
							| 
									
										
										
										
											2017-10-12 16:22:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-14 14:36:44 +08:00
										 |  |  | 	if query.Limit != 0 { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 		builder.Write(" LIMIT ?", query.Limit) | 
					
						
							| 
									
										
										
										
											2016-09-14 14:36:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:56:04 +08:00
										 |  |  | 	alerts := make([]*m.AlertListItemDTO, 0) | 
					
						
							|  |  |  | 	if err := x.SQL(builder.GetSqlString(), builder.params...).Find(&alerts); err != nil { | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-27 22:21:02 +08:00
										 |  |  | 	for i := range alerts { | 
					
						
							| 
									
										
										
										
											2017-01-17 01:01:08 +08:00
										 |  |  | 		if alerts[i].ExecutionError == " " { | 
					
						
							|  |  |  | 			alerts[i].ExecutionError = "" | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 23:36:50 +08:00
										 |  |  | 	query.Result = alerts | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 18:23:44 +08:00
										 |  |  | func deleteAlertDefinition(dashboardId int64, sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-06-11 16:54:24 +08:00
										 |  |  | 	alerts := make([]*m.Alert, 0) | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 	sess.Where("dashboard_id = ?", dashboardId).Find(&alerts) | 
					
						
							| 
									
										
										
										
											2016-04-25 22:18:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 	for _, alert := range alerts { | 
					
						
							| 
									
										
										
										
											2016-10-14 15:43:30 +08:00
										 |  |  | 		deleteAlertByIdInternal(alert.Id, "Dashboard deleted", sess) | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | func SaveAlerts(cmd *m.SaveAlertsCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-07-14 19:32:16 +08:00
										 |  |  | 		existingAlerts, err := GetAlertsByDashboardId2(cmd.DashboardId, sess) | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-22 22:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 		if err := updateAlerts(existingAlerts, cmd, sess); err != nil { | 
					
						
							| 
									
										
										
										
											2016-07-14 19:32:16 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if err := deleteMissingAlerts(existingAlerts, cmd, sess); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-22 22:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | func updateAlerts(existingAlerts []*m.Alert, cmd *m.SaveAlertsCommand, sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-06-29 05:40:58 +08:00
										 |  |  | 	for _, alert := range cmd.Alerts { | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 		update := false | 
					
						
							| 
									
										
										
										
											2016-06-11 16:26:48 +08:00
										 |  |  | 		var alertToUpdate *m.Alert | 
					
						
							| 
									
										
										
										
											2016-04-25 22:18:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-14 19:32:16 +08:00
										 |  |  | 		for _, k := range existingAlerts { | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 			if alert.PanelId == k.PanelId { | 
					
						
							|  |  |  | 				update = true | 
					
						
							|  |  |  | 				alert.Id = k.Id | 
					
						
							|  |  |  | 				alertToUpdate = k | 
					
						
							| 
									
										
										
										
											2016-06-11 20:08:55 +08:00
										 |  |  | 				break | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 		if update { | 
					
						
							| 
									
										
										
										
											2016-06-10 04:21:28 +08:00
										 |  |  | 			if alertToUpdate.ContainsUpdates(alert) { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 				alert.Updated = timeNow() | 
					
						
							| 
									
										
										
										
											2016-04-28 14:42:51 +08:00
										 |  |  | 				alert.State = alertToUpdate.State | 
					
						
							| 
									
										
										
										
											2017-04-10 21:25:41 +08:00
										 |  |  | 				sess.MustCols("message") | 
					
						
							| 
									
										
										
										
											2016-06-06 19:50:47 +08:00
										 |  |  | 				_, err := sess.Id(alert.Id).Update(alert) | 
					
						
							| 
									
										
										
										
											2016-04-25 22:18:28 +08:00
										 |  |  | 				if err != nil { | 
					
						
							|  |  |  | 					return err | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-11 16:54:24 +08:00
										 |  |  | 				sqlog.Debug("Alert updated", "name", alert.Name, "id", alert.Id) | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 			alert.Updated = timeNow() | 
					
						
							|  |  |  | 			alert.Created = timeNow() | 
					
						
							| 
									
										
										
										
											2016-11-01 22:30:55 +08:00
										 |  |  | 			alert.State = m.AlertStatePending | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 			alert.NewStateDate = timeNow() | 
					
						
							| 
									
										
										
										
											2016-07-14 19:32:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-06 19:50:47 +08:00
										 |  |  | 			_, err := sess.Insert(alert) | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							| 
									
										
										
										
											2016-04-22 22:51:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-06-11 16:54:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			sqlog.Debug("Alert inserted", "name", alert.Name, "id", alert.Id) | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | func deleteMissingAlerts(alerts []*m.Alert, cmd *m.SaveAlertsCommand, sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 	for _, missingAlert := range alerts { | 
					
						
							|  |  |  | 		missing := true | 
					
						
							| 
									
										
										
										
											2016-04-22 23:49:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 05:40:58 +08:00
										 |  |  | 		for _, k := range cmd.Alerts { | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 			if missingAlert.PanelId == k.PanelId { | 
					
						
							|  |  |  | 				missing = false | 
					
						
							| 
									
										
										
										
											2016-06-11 20:08:55 +08:00
										 |  |  | 				break | 
					
						
							| 
									
										
										
										
											2016-04-22 23:49:50 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-22 23:49:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 		if missing { | 
					
						
							| 
									
										
										
										
											2016-10-14 15:43:30 +08:00
										 |  |  | 			deleteAlertByIdInternal(missingAlert.Id, "Removed from dashboard", sess) | 
					
						
							| 
									
										
										
										
											2016-04-22 23:49:50 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 22:31:13 +08:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | func GetAlertsByDashboardId2(dashboardId int64, sess *DBSession) ([]*m.Alert, error) { | 
					
						
							| 
									
										
										
										
											2016-06-11 16:26:48 +08:00
										 |  |  | 	alerts := make([]*m.Alert, 0) | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 	err := sess.Where("dashboard_id = ?", dashboardId).Find(&alerts) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-06-11 16:26:48 +08:00
										 |  |  | 		return []*m.Alert{}, err | 
					
						
							| 
									
										
										
										
											2016-04-22 23:49:50 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 21:48:29 +08:00
										 |  |  | 	return alerts, nil | 
					
						
							| 
									
										
										
										
											2016-04-13 16:33:45 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func SetAlertState(cmd *m.SetAlertStateCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 		alert := m.Alert{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if has, err := sess.Id(cmd.AlertId).Get(&alert); err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} else if !has { | 
					
						
							|  |  |  | 			return fmt.Errorf("Could not find alert") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-19 20:24:45 +08:00
										 |  |  | 		if alert.State == m.AlertStatePaused { | 
					
						
							|  |  |  | 			return m.ErrCannotChangeStateOnPausedAlert | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-21 21:47:02 +08:00
										 |  |  | 		if alert.State == cmd.State { | 
					
						
							|  |  |  | 			return m.ErrRequiresNewState | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 		alert.State = cmd.State | 
					
						
							| 
									
										
										
										
											2016-08-16 15:52:45 +08:00
										 |  |  | 		alert.StateChanges += 1 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 		alert.NewStateDate = timeNow() | 
					
						
							| 
									
										
										
										
											2016-09-14 20:35:05 +08:00
										 |  |  | 		alert.EvalData = cmd.EvalData | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 23:25:32 +08:00
										 |  |  | 		if cmd.Error == "" { | 
					
						
							|  |  |  | 			alert.ExecutionError = " " //without this space, xorm skips updating this field
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			alert.ExecutionError = cmd.Error | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-24 05:28:47 +08:00
										 |  |  | 		sess.ID(alert.Id).Update(&alert) | 
					
						
							| 
									
										
										
										
											2016-07-22 19:14:09 +08:00
										 |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-30 23:37:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-19 21:36:44 +08:00
										 |  |  | func PauseAlert(cmd *m.PauseAlertCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-12-19 23:07:55 +08:00
										 |  |  | 		if len(cmd.AlertIds) == 0 { | 
					
						
							|  |  |  | 			return fmt.Errorf("command contains no alertids") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var buffer bytes.Buffer | 
					
						
							| 
									
										
										
										
											2016-12-16 00:01:45 +08:00
										 |  |  | 		params := make([]interface{}, 0) | 
					
						
							| 
									
										
										
										
											2016-10-10 20:26:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 		buffer.WriteString(`UPDATE alert SET state = ?, new_state_date = ?`) | 
					
						
							| 
									
										
										
										
											2016-10-10 20:26:09 +08:00
										 |  |  | 		if cmd.Paused { | 
					
						
							| 
									
										
										
										
											2016-12-16 00:01:45 +08:00
										 |  |  | 			params = append(params, string(m.AlertStatePaused)) | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 			params = append(params, timeNow()) | 
					
						
							| 
									
										
										
										
											2016-10-10 20:26:09 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2016-12-16 00:01:45 +08:00
										 |  |  | 			params = append(params, string(m.AlertStatePending)) | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 			params = append(params, timeNow()) | 
					
						
							| 
									
										
										
										
											2016-10-10 20:26:09 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-19 23:07:55 +08:00
										 |  |  | 		buffer.WriteString(` WHERE id IN (?` + strings.Repeat(",?", len(cmd.AlertIds)-1) + `)`) | 
					
						
							|  |  |  | 		for _, v := range cmd.AlertIds { | 
					
						
							|  |  |  | 			params = append(params, v) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res, err := sess.Exec(buffer.String(), params...) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		cmd.ResultCount, _ = res.RowsAffected() | 
					
						
							|  |  |  | 		return nil | 
					
						
							| 
									
										
										
										
											2016-10-10 20:26:09 +08:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-19 21:36:44 +08:00
										 |  |  | func PauseAllAlerts(cmd *m.PauseAllAlertCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-23 16:56:23 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2016-12-19 20:24:45 +08:00
										 |  |  | 		var newState string | 
					
						
							|  |  |  | 		if cmd.Paused { | 
					
						
							|  |  |  | 			newState = string(m.AlertStatePaused) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			newState = string(m.AlertStatePending) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 20:06:28 +08:00
										 |  |  | 		res, err := sess.Exec(`UPDATE alert SET state = ?, new_state_date = ?`, newState, timeNow()) | 
					
						
							| 
									
										
										
										
											2016-12-19 20:24:45 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		cmd.ResultCount, _ = res.RowsAffected() | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 23:37:47 +08:00
										 |  |  | func GetAlertStatesForDashboard(query *m.GetAlertStatesForDashboardQuery) error { | 
					
						
							|  |  |  | 	var rawSql = `SELECT | 
					
						
							|  |  |  | 	                id, | 
					
						
							|  |  |  | 	                dashboard_id, | 
					
						
							|  |  |  | 	                panel_id, | 
					
						
							|  |  |  | 	                state, | 
					
						
							|  |  |  | 	                new_state_date | 
					
						
							|  |  |  | 	                FROM alert | 
					
						
							|  |  |  | 	                WHERE org_id = ? AND dashboard_id = ?` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	query.Result = make([]*m.AlertStateInfoDTO, 0) | 
					
						
							| 
									
										
										
										
											2018-01-24 05:28:47 +08:00
										 |  |  | 	err := x.SQL(rawSql, query.OrgId, query.DashboardId).Find(&query.Result) | 
					
						
							| 
									
										
										
										
											2016-09-30 23:37:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } |