Prometheus: Fix handling errors in streaming client (#61643)

* Return errors from data parsing

* Better error handling

* Fix the tests

* When there is no frame add empty frame to get metadata attached to it

* Fix tests

* Update testdata
This commit is contained in:
ismail simsek 2023-01-18 22:30:15 +01:00 committed by GitHub
parent 2c46f46d37
commit 29c8ce12a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 14 deletions

View File

@ -87,7 +87,7 @@ func TestIntegrationPrometheus(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.StatusOK, resp.StatusCode)
t.Cleanup(func() {
err := resp.Body.Close()
require.NoError(t, err)
@ -123,7 +123,7 @@ func TestIntegrationPrometheus(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.StatusOK, resp.StatusCode)
t.Cleanup(func() {
err := resp.Body.Close()
require.NoError(t, err)

View File

@ -125,23 +125,17 @@ func (s *QueryData) fetch(ctx context.Context, client *client.Client, q *models.
if q.InstantQuery {
res, err := s.instantQuery(traceCtx, client, q, headers)
if err != nil {
return nil, err
}
response.Error = res.Error
response.Error = err
response.Frames = res.Frames
}
if q.RangeQuery {
res, err := s.rangeQuery(traceCtx, client, q, headers)
if err != nil {
return nil, err
}
if res.Error != nil {
if response.Error == nil {
response.Error = res.Error
response.Error = err
} else {
response.Error = fmt.Errorf("%v %w", response.Error, res.Error) // lovely
response.Error = fmt.Errorf("%v %w", response.Error, err)
}
}
response.Frames = append(response.Frames, res.Frames...)

View File

@ -29,11 +29,13 @@ func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *htt
MatrixWideSeries: s.enableWideSeries,
VectorWideSeries: s.enableWideSeries,
})
if r.Frames == nil {
return r, fmt.Errorf("received empty response from prometheus")
}
// The ExecutedQueryString can be viewed in QueryInspector in UI
// Add frame to attach metadata to it
if len(r.Frames) == 0 {
r.Frames = append(r.Frames, data.NewFrame(""))
}
for _, frame := range r.Frames {
if s.enableWideSeries {
addMetadataToWideFrame(q, frame)
@ -42,6 +44,10 @@ func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *htt
}
}
if r.Error != nil {
return r, r.Error
}
r = s.processExemplars(q, r)
return r, nil
}

View File

@ -26,6 +26,16 @@
// +-----------------------------------+-----------------+--------------------------------------------+----------------+-------------------+-------------------+----------------+----------------+--------------------+----------------+------------------+-----------------+-------------------+----------------------------------+
//
//
//
// Frame[1] {
// "executedQueryString": "Expr: histogram_quantile(0.99, sum(rate(traces_spanmetrics_duration_seconds_bucket[15s])) by (le))\nStep: 15s"
// }
// Name:
// Dimensions: 0 Fields by 0 Rows
// +
// +
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
@ -1040,6 +1050,17 @@
]
]
}
},
{
"schema": {
"meta": {
"executedQueryString": "Expr: histogram_quantile(0.99, sum(rate(traces_spanmetrics_duration_seconds_bucket[15s])) by (le))\nStep: 15s"
},
"fields": []
},
"data": {
"values": []
}
}
]
}

View File

@ -26,6 +26,16 @@
// +-----------------------------------+-----------------+--------------------------------------------+----------------+-------------------+-------------------+----------------+----------------+--------------------+----------------+------------------+-----------------+-------------------+----------------------------------+
//
//
//
// Frame[1] {
// "executedQueryString": "Expr: histogram_quantile(0.99, sum(rate(traces_spanmetrics_duration_seconds_bucket[15s])) by (le))\nStep: 15s"
// }
// Name:
// Dimensions: 0 Fields by 0 Rows
// +
// +
//
//
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
@ -1040,6 +1050,17 @@
]
]
}
},
{
"schema": {
"meta": {
"executedQueryString": "Expr: histogram_quantile(0.99, sum(rate(traces_spanmetrics_duration_seconds_bucket[15s])) by (le))\nStep: 15s"
},
"fields": []
},
"data": {
"values": []
}
}
]
}