Skip to content

Commit

Permalink
Merge pull request #414 from bboreham/decode-400s
Browse files Browse the repository at this point in the history
Decode JSON body when Prometheus returns 400 to an api call
  • Loading branch information
beorn7 authored Jun 4, 2018
2 parents a62824b + 04c0326 commit 7540c07
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
11 changes: 8 additions & 3 deletions api/prometheus/v1/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,11 @@ type apiResponse struct {
Error string `json:"error"`
}

func apiError(code int) bool {
// These are the codes that Prometheus sends when it returns an error.
return code == statusAPIError || code == http.StatusBadRequest
}

func (c apiClient) Do(ctx context.Context, req *http.Request) (*http.Response, []byte, error) {
resp, body, err := c.Client.Do(ctx, req)
if err != nil {
Expand All @@ -463,7 +468,7 @@ func (c apiClient) Do(ctx context.Context, req *http.Request) (*http.Response, [

code := resp.StatusCode

if code/100 != 2 && code != statusAPIError {
if code/100 != 2 && !apiError(code) {
return resp, body, &Error{
Type: ErrBadResponse,
Msg: fmt.Sprintf("bad response code %d", resp.StatusCode),
Expand All @@ -479,14 +484,14 @@ func (c apiClient) Do(ctx context.Context, req *http.Request) (*http.Response, [
}
}

if (code == statusAPIError) != (result.Status == "error") {
if apiError(code) != (result.Status == "error") {
err = &Error{
Type: ErrBadResponse,
Msg: "inconsistent body for response code",
}
}

if code == statusAPIError && result.Status == "error" {
if apiError(code) && result.Status == "error" {
err = &Error{
Type: result.ErrorType,
Msg: result.Error,
Expand Down
15 changes: 14 additions & 1 deletion api/prometheus/v1/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -606,7 +606,20 @@ func TestAPIClientDo(t *testing.T) {
response: "bad json",
err: &Error{
Type: ErrBadResponse,
Msg: "bad response code 400",
Msg: "bad response code 500",
},
code: http.StatusInternalServerError,
},
{
response: &apiResponse{
Status: "error",
Data: json.RawMessage(`null`),
ErrorType: ErrBadData,
Error: "end timestamp must not be before start time",
},
err: &Error{
Type: ErrBadData,
Msg: "end timestamp must not be before start time",
},
code: http.StatusBadRequest,
},
Expand Down

0 comments on commit 7540c07

Please sign in to comment.