| 121 | } |
| 122 | |
| 123 | func (a *API) PrometheusRules(w http.ResponseWriter, req *http.Request) { |
| 124 | logger := util_log.WithContext(req.Context(), a.logger) |
| 125 | userID, err := users.TenantID(req.Context()) |
| 126 | if err != nil || userID == "" { |
| 127 | level.Error(logger).Log("msg", "error extracting org id from context", "err", err) |
| 128 | util_api.RespondError(logger, w, v1.ErrBadData, "no valid org id found", http.StatusBadRequest) |
| 129 | return |
| 130 | } |
| 131 | |
| 132 | if err := req.ParseForm(); err != nil { |
| 133 | level.Error(logger).Log("msg", "error parsing form/query params", "err", err) |
| 134 | util_api.RespondError(logger, w, v1.ErrBadData, "error parsing form/query params", http.StatusBadRequest) |
| 135 | return |
| 136 | } |
| 137 | |
| 138 | typ := strings.ToLower(req.URL.Query().Get("type")) |
| 139 | if typ != "" && typ != alertingRuleFilter && typ != recordingRuleFilter { |
| 140 | util_api.RespondError(logger, w, v1.ErrBadData, fmt.Sprintf("unsupported rule type %q", typ), http.StatusBadRequest) |
| 141 | return |
| 142 | } |
| 143 | |
| 144 | state := strings.ToLower(req.URL.Query().Get("state")) |
| 145 | if state != "" && state != firingStateFilter && state != pendingStateFilter && state != inactiveStateFilter && state != unknownStateFilter { |
| 146 | util_api.RespondError(logger, w, v1.ErrBadData, fmt.Sprintf("unsupported state value %q", state), http.StatusBadRequest) |
| 147 | return |
| 148 | } |
| 149 | |
| 150 | health := strings.ToLower(req.URL.Query().Get("health")) |
| 151 | if health != "" && health != unknownHealthFilter && health != okHealthFilter && health != errHealthFilter { |
| 152 | util_api.RespondError(logger, w, v1.ErrBadData, fmt.Sprintf("unsupported health value %q", health), http.StatusBadRequest) |
| 153 | return |
| 154 | } |
| 155 | |
| 156 | _, err = parseMatchersParam(req.Form["match[]"]) |
| 157 | if err != nil { |
| 158 | level.Error(logger).Log("msg", "error parsing match query params", "err", err) |
| 159 | util_api.RespondError(logger, w, v1.ErrBadData, fmt.Sprintf("error parsing match params %s", err), http.StatusBadRequest) |
| 160 | return |
| 161 | } |
| 162 | |
| 163 | excludeAlerts, err := parseExcludeAlerts(req) |
| 164 | if err != nil { |
| 165 | util_api.RespondError(logger, w, v1.ErrBadData, fmt.Sprintf("invalid parameter %q: %s", "exclude_alerts", err.Error()), http.StatusBadRequest) |
| 166 | return |
| 167 | } |
| 168 | |
| 169 | paginationRequest, err := parseListRulesPaginationRequest(req) |
| 170 | if err != nil { |
| 171 | util_api.RespondError(logger, w, v1.ErrBadData, err.Error(), http.StatusBadRequest) |
| 172 | return |
| 173 | } |
| 174 | |
| 175 | rulesRequest := RulesRequest{ |
| 176 | RuleNames: req.Form["rule_name[]"], |
| 177 | RuleGroupNames: req.Form["rule_group[]"], |
| 178 | Files: req.Form["file[]"], |
| 179 | Type: typ, |
| 180 | State: state, |