Loki/Prometheus: Change signature - return non-reference from ReadPrometheusStyleResult (#57209)

* Change signature - return non-reference from ReadPrometheusStyleResult

Related to https://github.com/grafana/grafana/issues/52430

* Fix invalid reference usage

* Potential fix for test data

* Remove additional ref usage

* Revert "Potential fix for test data"

This reverts commit 94ed588ab3.

* Commit changed test data

* Revert unwanted conflict resolution

* Add additional condition to track empty responses

* Setup valid empty response

* Re-introduce changes reverted by merge
This commit is contained in:
KonH 2023-01-13 15:00:39 +07:00 committed by GitHub
parent 078f2d4481
commit 4421b31b66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 46 deletions

View File

@ -159,14 +159,6 @@ func (api *LokiAPI) DataQuery(ctx context.Context, query lokiQuery) (data.Frames
iter := jsoniter.Parse(jsoniter.ConfigDefault, resp.Body, 1024)
res := converter.ReadPrometheusStyleResult(iter, converter.Options{MatrixWideSeries: false, VectorWideSeries: false})
if res == nil {
// it's hard to say if this is an error-case or not.
// we know the http-response was a success-response
// (otherwise we wouldn't be here in the code),
// so we will go with a success, with no data.
return data.Frames{}, nil
}
if res.Error != nil {
return nil, res.Error
}

View File

@ -1,6 +1,5 @@
// 🌟 This was machine generated. Do not edit. 🌟
// 🌟 This was machine generated. Do not edit. 🌟
{
"status": 200,
"frames": []
"status": 200
}

View File

@ -154,34 +154,32 @@ func (s *QueryData) fetch(ctx context.Context, client *client.Client, q *models.
// continue with other results processing
logger.Error("Exemplar query failed", "query", q.Expr, "err", err)
}
if res != nil {
response.Frames = append(response.Frames, res.Frames...)
}
response.Frames = append(response.Frames, res.Frames...)
}
return response, nil
}
func (s *QueryData) rangeQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (*backend.DataResponse, error) {
func (s *QueryData) rangeQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (backend.DataResponse, error) {
res, err := c.QueryRange(ctx, q)
if err != nil {
return nil, err
return backend.DataResponse{}, err
}
return s.parseResponse(ctx, q, res)
}
func (s *QueryData) instantQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (*backend.DataResponse, error) {
func (s *QueryData) instantQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (backend.DataResponse, error) {
res, err := c.QueryInstant(ctx, q)
if err != nil {
return nil, err
return backend.DataResponse{}, err
}
return s.parseResponse(ctx, q, res)
}
func (s *QueryData) exemplarQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (*backend.DataResponse, error) {
func (s *QueryData) exemplarQuery(ctx context.Context, c *client.Client, q *models.Query, headers map[string]string) (backend.DataResponse, error) {
res, err := c.QueryExemplars(ctx, q)
if err != nil {
return nil, err
return backend.DataResponse{}, err
}
return s.parseResponse(ctx, q, res)
}

View File

@ -17,7 +17,7 @@ import (
"github.com/grafana/grafana/pkg/util/converter"
)
func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *http.Response) (*backend.DataResponse, error) {
func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *http.Response) (backend.DataResponse, error) {
defer func() {
if err := res.Body.Close(); err != nil {
s.log.FromContext(ctx).Error("Failed to close response body", "err", err)
@ -29,8 +29,8 @@ func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *htt
MatrixWideSeries: s.enableWideSeries,
VectorWideSeries: s.enableWideSeries,
})
if r == nil {
return nil, fmt.Errorf("received empty response from prometheus")
if r.Frames == nil {
return r, fmt.Errorf("received empty response from prometheus")
}
// The ExecutedQueryString can be viewed in QueryInspector in UI
@ -46,7 +46,7 @@ func (s *QueryData) parseResponse(ctx context.Context, q *models.Query, res *htt
return r, nil
}
func (s *QueryData) processExemplars(q *models.Query, dr *backend.DataResponse) *backend.DataResponse {
func (s *QueryData) processExemplars(q *models.Query, dr backend.DataResponse) backend.DataResponse {
sampler := s.exemplarSampler()
labelTracker := exemplar.NewLabelTracker()
@ -89,7 +89,7 @@ func (s *QueryData) processExemplars(q *models.Query, dr *backend.DataResponse)
frames, err := framer.Frames()
return &backend.DataResponse{
return backend.DataResponse{
Frames: frames,
Error: err,
}

View File

@ -24,8 +24,8 @@ type Options struct {
}
// ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames
func ReadPrometheusStyleResult(iter *jsoniter.Iterator, opt Options) *backend.DataResponse {
var rsp *backend.DataResponse
func ReadPrometheusStyleResult(iter *jsoniter.Iterator, opt Options) backend.DataResponse {
var rsp backend.DataResponse
status := "unknown"
errorType := ""
err := ""
@ -55,7 +55,7 @@ func ReadPrometheusStyleResult(iter *jsoniter.Iterator, opt Options) *backend.Da
}
if status == "error" {
return &backend.DataResponse{
return backend.DataResponse{
Error: fmt.Errorf("%s: %s", errorType, err),
}
}
@ -91,20 +91,20 @@ func readWarnings(iter *jsoniter.Iterator) []data.Notice {
return warnings
}
func readPrometheusData(iter *jsoniter.Iterator, opt Options) *backend.DataResponse {
func readPrometheusData(iter *jsoniter.Iterator, opt Options) backend.DataResponse {
t := iter.WhatIsNext()
if t == jsoniter.ArrayValue {
return readArrayData(iter)
}
if t != jsoniter.ObjectValue {
return &backend.DataResponse{
return backend.DataResponse{
Error: fmt.Errorf("expected object type"),
}
}
resultType := ""
var rsp *backend.DataResponse
var rsp backend.DataResponse
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
switch l1Field {
@ -133,7 +133,7 @@ func readPrometheusData(iter *jsoniter.Iterator, opt Options) *backend.DataRespo
rsp = readScalar(iter)
default:
iter.Skip()
rsp = &backend.DataResponse{
rsp = backend.DataResponse{
Error: fmt.Errorf("unknown result type: %s", resultType),
}
}
@ -161,11 +161,11 @@ func readPrometheusData(iter *jsoniter.Iterator, opt Options) *backend.DataRespo
}
// will return strings or exemplars
func readArrayData(iter *jsoniter.Iterator) *backend.DataResponse {
func readArrayData(iter *jsoniter.Iterator) backend.DataResponse {
lookup := make(map[string]*data.Field)
var labelFrame *data.Frame
rsp := &backend.DataResponse{}
rsp := backend.DataResponse{}
stringField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
stringField.Name = "Value"
for iter.ReadArray() {
@ -311,7 +311,7 @@ func readLabelsOrExemplars(iter *jsoniter.Iterator) (*data.Frame, [][2]string) {
return frame, pairs
}
func readString(iter *jsoniter.Iterator) *backend.DataResponse {
func readString(iter *jsoniter.Iterator) backend.DataResponse {
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeField.Name = data.TimeSeriesTimeFieldName
valueField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
@ -334,12 +334,12 @@ func readString(iter *jsoniter.Iterator) *backend.DataResponse {
Custom: resultTypeToCustomMeta("string"),
}
return &backend.DataResponse{
return backend.DataResponse{
Frames: []*data.Frame{frame},
}
}
func readScalar(iter *jsoniter.Iterator) *backend.DataResponse {
func readScalar(iter *jsoniter.Iterator) backend.DataResponse {
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeField.Name = data.TimeSeriesTimeFieldName
valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0)
@ -358,12 +358,12 @@ func readScalar(iter *jsoniter.Iterator) *backend.DataResponse {
Custom: resultTypeToCustomMeta("scalar"),
}
return &backend.DataResponse{
return backend.DataResponse{
Frames: []*data.Frame{frame},
}
}
func readMatrixOrVectorWide(iter *jsoniter.Iterator, resultType string) *backend.DataResponse {
func readMatrixOrVectorWide(iter *jsoniter.Iterator, resultType string) backend.DataResponse {
rowIdx := 0
timeMap := map[int64]int{}
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
@ -373,7 +373,7 @@ func readMatrixOrVectorWide(iter *jsoniter.Iterator, resultType string) *backend
Type: data.FrameTypeTimeSeriesWide,
Custom: resultTypeToCustomMeta(resultType),
}
rsp := &backend.DataResponse{
rsp := backend.DataResponse{
Frames: []*data.Frame{},
}
@ -471,8 +471,8 @@ func addValuePairToFrame(frame *data.Frame, timeMap map[int64]int, rowIdx int, i
return timeMap, rowIdx
}
func readMatrixOrVectorMulti(iter *jsoniter.Iterator, resultType string) *backend.DataResponse {
rsp := &backend.DataResponse{}
func readMatrixOrVectorMulti(iter *jsoniter.Iterator, resultType string) backend.DataResponse {
rsp := backend.DataResponse{}
for iter.ReadArray() {
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
@ -669,8 +669,8 @@ func appendValueFromString(iter *jsoniter.Iterator, field *data.Field) error {
return nil
}
func readStream(iter *jsoniter.Iterator) *backend.DataResponse {
rsp := &backend.DataResponse{}
func readStream(iter *jsoniter.Iterator) backend.DataResponse {
rsp := backend.DataResponse{}
labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0)
labelsField.Name = "__labels" // avoid automatically spreading this by labels
@ -688,7 +688,7 @@ func readStream(iter *jsoniter.Iterator) *backend.DataResponse {
labels := data.Labels{}
labelJson, err := labelsToRawJson(labels)
if err != nil {
return &backend.DataResponse{Error: err}
return backend.DataResponse{Error: err}
}
for iter.ReadArray() {
@ -701,7 +701,7 @@ func readStream(iter *jsoniter.Iterator) *backend.DataResponse {
iter.ReadVal(&labels)
labelJson, err = labelsToRawJson(labels)
if err != nil {
return &backend.DataResponse{Error: err}
return backend.DataResponse{Error: err}
}
case "values":

View File

@ -68,7 +68,7 @@ func runScenario(name string, opts Options) func(t *testing.T) {
}
fname := name + "-frame"
experimental.CheckGoldenJSONResponse(t, "testdata", fname, rsp, update)
experimental.CheckGoldenJSONResponse(t, "testdata", fname, &rsp, update)
}
}