mirror of
https://github.com/grafana/grafana.git
synced 2025-07-29 02:12:16 +08:00
166 lines
4.0 KiB
Go
166 lines
4.0 KiB
Go
package api
|
|
|
|
import (
|
|
"github.com/grafana/grafana/pkg/api/dtos"
|
|
"github.com/grafana/grafana/pkg/bus"
|
|
"github.com/grafana/grafana/pkg/middleware"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
)
|
|
|
|
func ValidateOrgAlert(c *middleware.Context) {
|
|
id := c.ParamsInt64(":alertId")
|
|
query := models.GetAlertByIdQuery{Id: id}
|
|
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
c.JsonApiErr(404, "Alert not found", nil)
|
|
return
|
|
}
|
|
|
|
if c.OrgId != query.Result.OrgId {
|
|
c.JsonApiErr(403, "You are not allowed to edit/view alert", nil)
|
|
return
|
|
}
|
|
}
|
|
|
|
// GET /api/alerting/changes
|
|
func GetAlertChanges(c *middleware.Context) Response {
|
|
query := models.GetAlertChangesQuery{
|
|
OrgId: c.OrgId,
|
|
}
|
|
|
|
limit := c.QueryInt64("limit")
|
|
if limit == 0 {
|
|
limit = 50
|
|
}
|
|
|
|
query.Limit = limit
|
|
query.SinceId = c.QueryInt64("sinceId")
|
|
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
return ApiError(500, "List alerts failed", err)
|
|
}
|
|
|
|
return Json(200, query.Result)
|
|
}
|
|
|
|
// GET /api/alerts
|
|
func GetAlerts(c *middleware.Context) Response {
|
|
query := models.GetAlertsQuery{
|
|
OrgId: c.OrgId,
|
|
State: c.QueryStrings("state"),
|
|
DashboardId: c.QueryInt64("dashboardId"),
|
|
PanelId: c.QueryInt64("panelId"),
|
|
}
|
|
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
return ApiError(500, "List alerts failed", err)
|
|
}
|
|
|
|
dashboardIds := make([]int64, 0)
|
|
alertDTOs := make([]*dtos.AlertRuleDTO, 0)
|
|
for _, alert := range query.Result {
|
|
dashboardIds = append(dashboardIds, alert.DashboardId)
|
|
alertDTOs = append(alertDTOs, &dtos.AlertRuleDTO{
|
|
Id: alert.Id,
|
|
DashboardId: alert.DashboardId,
|
|
PanelId: alert.PanelId,
|
|
Query: alert.Query,
|
|
QueryRefId: alert.QueryRefId,
|
|
WarnLevel: alert.WarnLevel,
|
|
CritLevel: alert.CritLevel,
|
|
Frequency: alert.Frequency,
|
|
Name: alert.Name,
|
|
Description: alert.Description,
|
|
QueryRange: alert.QueryRange,
|
|
Aggregator: alert.Aggregator,
|
|
State: alert.State,
|
|
})
|
|
}
|
|
|
|
dashboardsQuery := models.GetDashboardsQuery{
|
|
DashboardIds: dashboardIds,
|
|
}
|
|
|
|
if len(alertDTOs) > 0 {
|
|
if err := bus.Dispatch(&dashboardsQuery); err != nil {
|
|
return ApiError(500, "List alerts failed", err)
|
|
}
|
|
}
|
|
|
|
//TODO: should be possible to speed this up with lookup table
|
|
for _, alert := range alertDTOs {
|
|
for _, dash := range *dashboardsQuery.Result {
|
|
if alert.DashboardId == dash.Id {
|
|
alert.DashbboardUri = "db/" + dash.Slug
|
|
}
|
|
}
|
|
}
|
|
|
|
return Json(200, alertDTOs)
|
|
}
|
|
|
|
// GET /api/alerts/:id
|
|
func GetAlert(c *middleware.Context) Response {
|
|
id := c.ParamsInt64(":alertId")
|
|
query := models.GetAlertByIdQuery{Id: id}
|
|
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
return ApiError(500, "List alerts failed", err)
|
|
}
|
|
|
|
return Json(200, &query.Result)
|
|
}
|
|
|
|
// DEL /api/alerts/:id
|
|
func DelAlert(c *middleware.Context) Response {
|
|
alertId := c.ParamsInt64(":alertId")
|
|
|
|
if alertId == 0 {
|
|
return ApiError(401, "Failed to parse alertid", nil)
|
|
}
|
|
|
|
cmd := models.DeleteAlertCommand{AlertId: alertId}
|
|
|
|
if err := bus.Dispatch(&cmd); err != nil {
|
|
return ApiError(500, "Failed to delete alert", err)
|
|
}
|
|
|
|
var resp = map[string]interface{}{"alertId": alertId}
|
|
return Json(200, resp)
|
|
}
|
|
|
|
// GET /api/alerts/events/:id
|
|
func GetAlertStates(c *middleware.Context) Response {
|
|
alertId := c.ParamsInt64(":alertId")
|
|
|
|
query := models.GetAlertsStateQuery{
|
|
AlertId: alertId,
|
|
}
|
|
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
return ApiError(500, "Failed get alert state log", err)
|
|
}
|
|
|
|
return Json(200, query.Result)
|
|
}
|
|
|
|
// PUT /api/alerts/events/:id
|
|
func PutAlertState(c *middleware.Context, cmd models.UpdateAlertStateCommand) Response {
|
|
cmd.AlertId = c.ParamsInt64(":alertId")
|
|
|
|
query := models.GetAlertByIdQuery{Id: cmd.AlertId}
|
|
if err := bus.Dispatch(&query); err != nil {
|
|
return ApiError(500, "Failed to get alertstate", err)
|
|
}
|
|
|
|
if query.Result.OrgId != 0 && query.Result.OrgId != c.OrgId {
|
|
return ApiError(500, "Alert not found", nil)
|
|
}
|
|
|
|
if err := bus.Dispatch(&cmd); err != nil {
|
|
return ApiError(500, "Failed to set new state", err)
|
|
}
|
|
|
|
return Json(200, cmd.Result)
|
|
}
|