| 333 | } |
| 334 | |
| 335 | func (a *API) PrometheusAlerts(w http.ResponseWriter, req *http.Request) { |
| 336 | logger := util_log.WithContext(req.Context(), a.logger) |
| 337 | userID, err := users.TenantID(req.Context()) |
| 338 | if err != nil || userID == "" { |
| 339 | level.Error(logger).Log("msg", "error extracting org id from context", "err", err) |
| 340 | util_api.RespondError(logger, w, v1.ErrBadData, "no valid org id found", http.StatusBadRequest) |
| 341 | return |
| 342 | } |
| 343 | |
| 344 | w.Header().Set("Content-Type", "application/json") |
| 345 | rulesRequest := RulesRequest{ |
| 346 | Type: alertingRuleFilter, |
| 347 | MaxRuleGroups: -1, |
| 348 | } |
| 349 | rulesResponse, err := a.ruler.GetRules(req.Context(), rulesRequest) |
| 350 | |
| 351 | if err != nil { |
| 352 | util_api.RespondError(logger, w, v1.ErrServer, err.Error(), http.StatusInternalServerError) |
| 353 | return |
| 354 | } |
| 355 | |
| 356 | rgs := rulesResponse.Groups |
| 357 | |
| 358 | alerts := []*Alert{} |
| 359 | |
| 360 | for _, g := range rgs { |
| 361 | for _, rl := range g.ActiveRules { |
| 362 | if rl.Rule.Alert != "" { |
| 363 | for _, a := range rl.Alerts { |
| 364 | alert := &Alert{ |
| 365 | Labels: cortexpb.FromLabelAdaptersToLabels(a.Labels), |
| 366 | Annotations: cortexpb.FromLabelAdaptersToLabels(a.Annotations), |
| 367 | State: a.GetState(), |
| 368 | ActiveAt: &a.ActiveAt, |
| 369 | Value: strconv.FormatFloat(a.Value, 'e', -1, 64), |
| 370 | } |
| 371 | if !a.KeepFiringSince.IsZero() { |
| 372 | alert.KeepFiringSince = &a.KeepFiringSince |
| 373 | } |
| 374 | alerts = append(alerts, alert) |
| 375 | } |
| 376 | } |
| 377 | } |
| 378 | } |
| 379 | |
| 380 | b, err := json.Marshal(&util_api.Response{ |
| 381 | Status: "success", |
| 382 | Data: &AlertDiscovery{Alerts: alerts}, |
| 383 | }) |
| 384 | if err != nil { |
| 385 | level.Error(logger).Log("msg", "error marshaling json response", "err", err) |
| 386 | util_api.RespondError(logger, w, v1.ErrServer, "unable to marshal the requested data", http.StatusInternalServerError) |
| 387 | return |
| 388 | } |
| 389 | w.Header().Set("Content-Type", "application/json") |
| 390 | w.WriteHeader(http.StatusOK) |
| 391 | if n, err := w.Write(b); err != nil { |
| 392 | level.Error(logger).Log("msg", "error writing response", "bytesWritten", n, "err", err) |