func getAlertIdForRequest(c *middleware.Context) (int64, error) { alertId := c.QueryInt64("alertId") panelId := c.QueryInt64("panelId") dashboardId := c.QueryInt64("dashboardId") if alertId == 0 && dashboardId == 0 && panelId == 0 { return 0, fmt.Errorf("Missing alertId or dashboardId and panelId") } if alertId == 0 { //fetch alertId query := models.GetAlertsQuery{ OrgId: c.OrgId, DashboardId: dashboardId, PanelId: panelId, } if err := bus.Dispatch(&query); err != nil { return 0, err } if len(query.Result) != 1 { return 0, fmt.Errorf("PanelId is not unique on dashboard") } alertId = query.Result[0].Id } return alertId, nil }
func GetAlertStatesForDashboard(c *middleware.Context) Response { dashboardId := c.QueryInt64("dashboardId") if dashboardId == 0 { return ApiError(400, "Missing query parameter dashboardId", nil) } query := models.GetAlertStatesForDashboardQuery{ OrgId: c.OrgId, DashboardId: c.QueryInt64("dashboardId"), } if err := bus.Dispatch(&query); err != nil { return ApiError(500, "Failed to fetch alert states", err) } return Json(200, query.Result) }
func GetTestMetrics(c *middleware.Context) { from := c.QueryInt64("from") to := c.QueryInt64("to") maxDataPoints := c.QueryInt64("maxDataPoints") stepInSeconds := (to - from) / maxDataPoints result := dtos.MetricQueryResultDto{} result.Data = make([]dtos.MetricQueryResultDataDto, 1) for seriesIndex := range result.Data { points := make([][2]float64, maxDataPoints) walker := rand.Float64() * 100 time := from for i := range points { points[i][0] = walker points[i][1] = float64(time) walker += rand.Float64() - 0.5 time += stepInSeconds } result.Data[seriesIndex].Target = "test-series-" + strconv.Itoa(seriesIndex) result.Data[seriesIndex].DataPoints = points } c.JSON(200, &result) }
// GET /api/alerts func GetAlerts(c *middleware.Context) Response { query := models.GetAlertsQuery{ OrgId: c.OrgId, DashboardId: c.QueryInt64("dashboardId"), PanelId: c.QueryInt64("panelId"), Limit: c.QueryInt64("limit"), } states := c.QueryStrings("state") if len(states) > 0 { query.State = states } if err := bus.Dispatch(&query); err != nil { return ApiError(500, "List alerts failed", err) } dashboardIds := make([]int64, 0) alertDTOs := make([]*dtos.AlertRule, 0) for _, alert := range query.Result { dashboardIds = append(dashboardIds, alert.DashboardId) alertDTOs = append(alertDTOs, &dtos.AlertRule{ Id: alert.Id, DashboardId: alert.DashboardId, PanelId: alert.PanelId, Name: alert.Name, Message: alert.Message, State: alert.State, EvalDate: alert.EvalDate, NewStateDate: alert.NewStateDate, ExecutionError: alert.ExecutionError, }) } 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) }
func GetAnnotations(c *middleware.Context) Response { query := &annotations.ItemQuery{ From: c.QueryInt64("from") / 1000, To: c.QueryInt64("to") / 1000, Type: annotations.ItemType(c.Query("type")), OrgId: c.OrgId, AlertId: c.QueryInt64("alertId"), DashboardId: c.QueryInt64("dashboardId"), PanelId: c.QueryInt64("panelId"), Limit: c.QueryInt64("limit"), NewState: c.QueryStrings("newState"), } repo := annotations.GetRepository() items, err := repo.Find(query) if err != nil { return ApiError(500, "Failed to get annotations", err) } result := make([]dtos.Annotation, 0) for _, item := range items { result = append(result, dtos.Annotation{ AlertId: item.AlertId, Time: item.Epoch * 1000, Data: item.Data, NewState: item.NewState, PrevState: item.PrevState, Text: item.Text, Metric: item.Metric, Title: item.Title, }) } return Json(200, result) }