mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
078f2d4481
commit
4421b31b66
@ -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
|
||||
}
|
||||
|
3
pkg/tsdb/loki/testdata/empty.golden.jsonc
vendored
3
pkg/tsdb/loki/testdata/empty.golden.jsonc
vendored
@ -1,6 +1,5 @@
|
||||
// 🌟 This was machine generated. Do not edit. 🌟
|
||||
// 🌟 This was machine generated. Do not edit. 🌟
|
||||
{
|
||||
"status": 200,
|
||||
"frames": []
|
||||
"status": 200
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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":
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user