InfluxDB: Return better error messages from backend (#70066)

Co-authored-by: ludovio <ludovic.viaud@gmail.com>
This commit is contained in:
ismail simsek
2023-07-04 14:55:08 +03:00
committed by GitHub
parent a62ae10a02
commit 61a77b4f6b
6 changed files with 43 additions and 46 deletions

View File

@ -87,7 +87,7 @@ func TestIntegrationInflux(t *testing.T) {
// nolint:gosec
resp, err := http.Post(u, "application/json", buf1)
require.NoError(t, err)
require.Equal(t, http.StatusInternalServerError, resp.StatusCode)
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
t.Cleanup(func() {
err := resp.Body.Close()
require.NoError(t, err)

View File

@ -93,10 +93,7 @@ func CheckInfluxQLHealth(ctx context.Context, dsInfo *models.DatasourceInfo, s *
}
}()
if res.StatusCode/100 != 2 {
return getHealthCheckMessage(logger, "", fmt.Errorf("error reading InfluxDB. Status Code: %d", res.StatusCode))
}
resp := s.responseParser.Parse(res.Body, []Query{{
resp := s.responseParser.Parse(res.Body, res.StatusCode, []Query{{
RefID: refID,
UseRawQuery: true,
RawQuery: queryString,

View File

@ -142,11 +142,8 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
logger.Warn("Failed to close response body", "err", err)
}
}()
if res.StatusCode/100 != 2 {
return &backend.QueryDataResponse{}, fmt.Errorf("InfluxDB returned error status: %s", res.Status)
}
resp := s.responseParser.Parse(res.Body, queries)
resp := s.responseParser.Parse(res.Body, res.StatusCode, queries)
return resp, nil
}

View File

@ -19,17 +19,20 @@ var (
legendFormat = regexp.MustCompile(`\[\[([\@\/\w-]+)(\.[\@\/\w-]+)*\]\]*|\$([\@\w-]+?)*`)
)
func (rp *ResponseParser) Parse(buf io.ReadCloser, queries []Query) *backend.QueryDataResponse {
return rp.parse(buf, queries)
func (rp *ResponseParser) Parse(buf io.ReadCloser, statusCode int, queries []Query) *backend.QueryDataResponse {
return rp.parse(buf, statusCode, queries)
}
// parse is the same as Parse, but without the io.ReadCloser (we don't need to
// close the buffer)
func (*ResponseParser) parse(buf io.Reader, queries []Query) *backend.QueryDataResponse {
func (*ResponseParser) parse(buf io.Reader, statusCode int, queries []Query) *backend.QueryDataResponse {
resp := backend.NewQueryDataResponse()
response, jsonErr := parseJSON(buf)
if statusCode/100 != 2 {
resp.Responses["A"] = backend.DataResponse{Error: fmt.Errorf("InfluxDB returned error: %s", response.Error)}
}
if jsonErr != nil {
resp.Responses["A"] = backend.DataResponse{Error: jsonErr}
return resp

View File

@ -22,7 +22,7 @@ func BenchmarkParseJson(b *testing.B) {
for n := 0; n < b.N; n++ {
buf := strings.NewReader(testResponse)
result := parser.parse(buf, queries)
result := parser.parse(buf, 200, queries)
require.NotNil(b, result.Responses["A"].Frames)
require.NoError(b, result.Responses["A"].Error)
}

View File

@ -36,7 +36,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
query := &Query{}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
require.Nil(t, result.Responses["A"].Frames)
require.Error(t, result.Responses["A"].Error)
@ -118,7 +118,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
)
boolFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame := result.Responses["A"]
if diff := cmp.Diff(floatFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -164,7 +164,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
newField,
)
result := parser.Parse(prepare(response), queries)
result := parser.Parse(prepare(response), 200, queries)
frame := result.Responses["metricFindQuery"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -203,7 +203,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
newField,
)
result := parser.Parse(prepare(response), queries)
result := parser.Parse(prepare(response), 200, queries)
frame := result.Responses["metricFindQuery"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -232,7 +232,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
queryB := &Query{}
queryB.RefID = "B"
queries = append(queries, *queryB)
result := parser.Parse(prepare(response), queries)
result := parser.Parse(prepare(response), 200, queries)
assert.Len(t, result.Responses, 2)
assert.Contains(t, result.Responses, "A")
@ -265,7 +265,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
query := &Query{}
query.RawQuery = "Test raw query"
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame := result.Responses["A"]
assert.Equal(t, frame.Frames[0].Meta.ExecutedQueryString, "Test raw query")
@ -311,7 +311,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame := result.Responses["A"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -359,7 +359,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame := result.Responses["A"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -410,7 +410,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
newField,
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
t.Run("should parse aliases", func(t *testing.T) {
frame := result.Responses["A"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -418,7 +418,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $m $measurement", Measurement: "10m"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name := "alias 10m 10m"
@ -429,7 +429,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $col", Measurement: "10m"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias mean"
testFrame.Name = name
@ -449,7 +449,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $tag_datacenter"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias America"
testFrame.Name = name
@ -463,7 +463,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $tag_datacenter/$tag_datacenter"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias America/America"
testFrame.Name = name
@ -477,7 +477,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[col]]", Measurement: "10m"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias mean"
testFrame.Name = name
@ -487,7 +487,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $0 $1 $2 $3 $4"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias cpu upc $2 $3 $4"
testFrame.Name = name
@ -497,7 +497,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $0, $1 - $2 - $3, $4: something"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias cpu, upc - $2 - $3, $4: something"
testFrame.Name = name
@ -507,7 +507,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $1"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias upc"
testFrame.Name = name
@ -517,7 +517,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias $5"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias $5"
testFrame.Name = name
@ -527,7 +527,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "series alias"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "series alias"
testFrame.Name = name
@ -537,7 +537,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[m]] [[measurement]]", Measurement: "10m"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias 10m 10m"
testFrame.Name = name
@ -547,7 +547,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[tag_datacenter]]"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias America"
testFrame.Name = name
@ -557,7 +557,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[tag_dc.region.name]]"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Northeast"
testFrame.Name = name
@ -567,7 +567,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[tag_cluster-name]]"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Cluster"
testFrame.Name = name
@ -577,7 +577,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[tag_/cluster/name/]]"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Cluster/"
testFrame.Name = name
@ -587,7 +587,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias [[tag_@cluster@name@]]"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Cluster@"
testFrame.Name = name
@ -598,7 +598,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
})
t.Run("shouldn't parse aliases", func(t *testing.T) {
query = &Query{Alias: "alias words with no brackets"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame := result.Responses["A"]
name := "alias words with no brackets"
testFrame.Name = name
@ -608,7 +608,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias Test 1.5"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Test 1.5"
testFrame.Name = name
@ -618,7 +618,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
}
query = &Query{Alias: "alias Test -1"}
result = parser.Parse(prepare(response), addQueryToQueries(*query))
result = parser.Parse(prepare(response), 200, addQueryToQueries(*query))
frame = result.Responses["A"]
name = "alias Test -1"
testFrame.Name = name
@ -677,7 +677,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
newField,
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
result := parser.Parse(prepare(response), queries)
result := parser.Parse(prepare(response), 200, queries)
frame := result.Responses["A"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -698,7 +698,7 @@ func TestInfluxdbResponseParser(t *testing.T) {
query := &Query{}
result := parser.Parse(prepare(response), addQueryToQueries(*query))
result := parser.Parse(prepare(response), 200, addQueryToQueries(*query))
require.Nil(t, result.Responses["A"].Frames)
@ -797,7 +797,7 @@ func TestResponseParser_Parse_RetentionPolicy(t *testing.T) {
}),
)
result := parser.Parse(prepare(response), queries)
result := parser.Parse(prepare(response), 200, queries)
frame := result.Responses["metricFindQuery"]
if diff := cmp.Diff(policyFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
@ -870,7 +870,7 @@ func TestResponseParser_Parse(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
parser := &ResponseParser{}
got := parser.Parse(prepare(tt.input), addQueryToQueries(Query{}))
got := parser.Parse(prepare(tt.input), 200, addQueryToQueries(Query{}))
require.NotNil(t, got)
if tt.f != nil {
tt.f(t, got)