Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 79 additions & 42 deletions api/v2/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,19 +262,21 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re

matchers, err := parseFilter(params.Filter)
if err != nil {
logger.Debug("Failed to parse matchers", "err", err)
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(err.Error())
message := "Failed to parse matchers"
logger.Debug(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alert_ops.GetAlertsBadRequestBody{Error: &errorMsg}
return alert_ops.NewGetAlertsBadRequest().WithPayload(body)
}

if params.Receiver != nil {
receiverFilter, err = regexp.Compile("^(?:" + *params.Receiver + ")$")
if err != nil {
logger.Debug("Failed to compile receiver regex", "err", err)
return alert_ops.
NewGetAlertsBadRequest().
WithPayload(
fmt.Sprintf("failed to parse receiver param: %v", err.Error()),
)
message := "Failed to compile receiver regex"
logger.Debug(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alert_ops.GetAlertsBadRequestBody{Error: &errorMsg}
return alert_ops.NewGetAlertsBadRequest().WithPayload(body)
}
}

Expand Down Expand Up @@ -315,8 +317,11 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re
api.mtx.RUnlock()

if err != nil {
logger.Error("Failed to get alerts", "err", err)
return alert_ops.NewGetAlertsInternalServerError().WithPayload(err.Error())
message := "Failed to get alerts"
logger.Error(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alert_ops.GetAlertsInternalServerErrorBody{Error: &errorMsg}
return alert_ops.NewGetAlertsInternalServerError().WithPayload(body)
}
sort.Slice(res, func(i, j int) bool {
return *res[i].Fingerprint < *res[j].Fingerprint
Expand Down Expand Up @@ -383,15 +388,19 @@ func (api *API) postAlertsHandler(params alert_ops.PostAlertsParams) middleware.
logger.Error(message, "err", err)
span.SetStatus(codes.Error, message)
span.RecordError(err)
return alert_ops.NewPostAlertsInternalServerError().WithPayload(err.Error())
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alert_ops.PostAlertsInternalServerErrorBody{Error: &errorMsg}
return alert_ops.NewPostAlertsInternalServerError().WithPayload(body)
}

if validationErrs.Len() > 0 {
message := "Failed to validate alerts"
logger.Error(message, "err", validationErrs.Error())
span.SetStatus(codes.Error, message)
span.RecordError(validationErrs)
return alert_ops.NewPostAlertsBadRequest().WithPayload(validationErrs.Error())
errorMsg := fmt.Sprintf("%s: %v", message, validationErrs)
body := &alert_ops.PostAlertsBadRequestBody{Error: &errorMsg}
return alert_ops.NewPostAlertsBadRequest().WithPayload(body)
}

return alert_ops.NewPostAlertsOK()
Expand All @@ -405,20 +414,22 @@ func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams

matchers, err := parseFilter(params.Filter)
if err != nil {
logger.Debug("Failed to parse matchers", "err", err)
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(err.Error())
message := "Failed to parse matchers"
logger.Debug(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alertgroup_ops.GetAlertGroupsBadRequestBody{Error: &errorMsg}
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(body)
}

var receiverFilter *regexp.Regexp
if params.Receiver != nil {
receiverFilter, err = regexp.Compile("^(?:" + *params.Receiver + ")$")
if err != nil {
logger.Error("Failed to compile receiver regex", "err", err)
return alertgroup_ops.
NewGetAlertGroupsBadRequest().
WithPayload(
fmt.Sprintf("failed to parse receiver param: %v", err.Error()),
)
message := "Failed to compile receiver regex"
logger.Debug(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alertgroup_ops.GetAlertGroupsBadRequestBody{Error: &errorMsg}
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(body)
}
}

Expand All @@ -439,7 +450,9 @@ func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams
logger.Error(message, "err", err)
span.SetStatus(codes.Error, message)
span.RecordError(err)
return alertgroup_ops.NewGetAlertGroupsInternalServerError()
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &alertgroup_ops.GetAlertGroupsInternalServerErrorBody{Error: &errorMsg}
return alertgroup_ops.NewGetAlertGroupsInternalServerError().WithPayload(body)
}

res := make(open_api_models.AlertGroups, 0, len(alertGroups))
Expand Down Expand Up @@ -548,14 +561,20 @@ func (api *API) getSilencesHandler(params silence_ops.GetSilencesParams) middlew

matchers, err := parseFilter(params.Filter)
if err != nil {
logger.Debug("Failed to parse matchers", "err", err)
return silence_ops.NewGetSilencesBadRequest().WithPayload(err.Error())
message := "Failed to parse matchers"
logger.Debug(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.GetSilencesBadRequestBody{Error: &errorMsg}
return silence_ops.NewGetSilencesBadRequest().WithPayload(body)
}

psils, _, err := api.silences.Query(ctx)
if err != nil {
logger.Error("Failed to get silences", "err", err)
return silence_ops.NewGetSilencesInternalServerError().WithPayload(err.Error())
message := "Failed to get silences"
logger.Error(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.GetSilencesInternalServerErrorBody{Error: &errorMsg}
return silence_ops.NewGetSilencesInternalServerError().WithPayload(body)
}

sils := open_api_models.GettableSilences{}
Expand All @@ -565,8 +584,11 @@ func (api *API) getSilencesHandler(params silence_ops.GetSilencesParams) middlew
}
silence, err := GettableSilenceFromProto(ps)
if err != nil {
logger.Error("Failed to unmarshal silence from proto", "err", err)
return silence_ops.NewGetSilencesInternalServerError().WithPayload(err.Error())
message := "Failed to unmarshal silence from proto"
logger.Error(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.GetSilencesInternalServerErrorBody{Error: &errorMsg}
return silence_ops.NewGetSilencesInternalServerError().WithPayload(body)
}
sils = append(sils, &silence)
}
Expand Down Expand Up @@ -647,8 +669,11 @@ func (api *API) getSilenceHandler(params silence_ops.GetSilenceParams) middlewar

sils, _, err := api.silences.Query(ctx, silence.QIDs(params.SilenceID.String()))
if err != nil {
logger.Error("Failed to get silence by id", "err", err, "id", params.SilenceID.String())
return silence_ops.NewGetSilenceInternalServerError().WithPayload(err.Error())
message := "Failed to get silence by id"
logger.Error(message, "err", err, "id", params.SilenceID.String())
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.GetSilenceInternalServerErrorBody{Error: &errorMsg}
return silence_ops.NewGetSilenceInternalServerError().WithPayload(body)
}

if len(sils) == 0 {
Expand All @@ -658,8 +683,11 @@ func (api *API) getSilenceHandler(params silence_ops.GetSilenceParams) middlewar

sil, err := GettableSilenceFromProto(sils[0])
if err != nil {
logger.Error("Failed to convert unmarshal from proto", "err", err)
return silence_ops.NewGetSilenceInternalServerError().WithPayload(err.Error())
message := "Failed to convert unmarshal from proto"
logger.Error(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.GetSilenceInternalServerErrorBody{Error: &errorMsg}
return silence_ops.NewGetSilenceInternalServerError().WithPayload(body)
}

return silence_ops.NewGetSilenceOK().WithPayload(&sil)
Expand All @@ -673,11 +701,14 @@ func (api *API) deleteSilenceHandler(params silence_ops.DeleteSilenceParams) mid

sid := params.SilenceID.String()
if err := api.silences.Expire(ctx, sid); err != nil {
logger.Error("Failed to expire silence", "err", err)
message := "Failed to expire silence"
logger.Error(message, "err", err)
if errors.Is(err, silence.ErrNotFound) {
return silence_ops.NewDeleteSilenceNotFound()
}
return silence_ops.NewDeleteSilenceInternalServerError().WithPayload(err.Error())
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.DeleteSilenceInternalServerErrorBody{Error: &errorMsg}
return silence_ops.NewDeleteSilenceInternalServerError().WithPayload(body)
}
return silence_ops.NewDeleteSilenceOK()
}
Expand All @@ -690,30 +721,36 @@ func (api *API) postSilencesHandler(params silence_ops.PostSilencesParams) middl

sil, err := PostableSilenceToProto(params.Silence)
if err != nil {
logger.Error("Failed to marshal silence to proto", "err", err)
return silence_ops.NewPostSilencesBadRequest().WithPayload(
fmt.Sprintf("failed to convert API silence to internal silence: %v", err.Error()),
)
message := "Failed to marshal silence to proto"
logger.Error(message, "err", err)
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.PostSilencesBadRequestBody{Error: &errorMsg}
return silence_ops.NewPostSilencesBadRequest().WithPayload(body)
}

if sil.StartsAt.After(sil.EndsAt) || sil.StartsAt.Equal(sil.EndsAt) {
msg := "Failed to create silence: start time must be before end time"
logger.Error(msg, "starts_at", sil.StartsAt, "ends_at", sil.EndsAt)
return silence_ops.NewPostSilencesBadRequest().WithPayload(msg)
body := &silence_ops.PostSilencesBadRequestBody{Error: &msg}
return silence_ops.NewPostSilencesBadRequest().WithPayload(body)
}

if sil.EndsAt.Before(time.Now()) {
msg := "Failed to create silence: end time can't be in the past"
logger.Error(msg, "ends_at", sil.EndsAt)
return silence_ops.NewPostSilencesBadRequest().WithPayload(msg)
body := &silence_ops.PostSilencesBadRequestBody{Error: &msg}
return silence_ops.NewPostSilencesBadRequest().WithPayload(body)
}

if err = api.silences.Set(ctx, sil); err != nil {
logger.Error("Failed to create silence", "err", err)
message := "Failed to create silence"
logger.Error(message, "err", err)
if errors.Is(err, silence.ErrNotFound) {
return silence_ops.NewPostSilencesNotFound().WithPayload(err.Error())
return silence_ops.NewPostSilencesNotFound()
}
return silence_ops.NewPostSilencesBadRequest().WithPayload(err.Error())
errorMsg := fmt.Sprintf("%s: %v", message, err)
body := &silence_ops.PostSilencesBadRequestBody{Error: &errorMsg}
return silence_ops.NewPostSilencesBadRequest().WithPayload(body)
}

return silence_ops.NewPostSilencesOK().WithPayload(&silence_ops.PostSilencesOKBody{
Expand Down
26 changes: 18 additions & 8 deletions api/v2/client/alert/alert_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading