From 63670b7adc5e9062a0cf96632f729c2a8cf7f26d Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Tue, 13 Feb 2024 21:19:13 +0100 Subject: [PATCH] Chore: Use jsoniter in prometheus from grafana-plugin-sdk-go (#82359) use jsoniter from grafana-plugin-sdk-go --- pkg/util/converter/jsonitere/jsonitere.go | 66 ----------------------- pkg/util/converter/prom.go | 56 +++++++++---------- 2 files changed, 28 insertions(+), 94 deletions(-) delete mode 100644 pkg/util/converter/jsonitere/jsonitere.go diff --git a/pkg/util/converter/jsonitere/jsonitere.go b/pkg/util/converter/jsonitere/jsonitere.go deleted file mode 100644 index 4bc0c2ed55f..00000000000 --- a/pkg/util/converter/jsonitere/jsonitere.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package jsonitere wraps json-iterator/go's Iterator methods with error returns -// so linting can catch unchecked errors. -// The underlying iterator's Error property is returned and not reset. -// See json-iterator/go for method documentation and additional methods that -// can be added to this library. -package jsonitere - -import ( - j "github.com/json-iterator/go" -) - -type Iterator struct { - // named property instead of embedded so there is no - // confusion about which method or property is called - i *j.Iterator -} - -func NewIterator(i *j.Iterator) *Iterator { - return &Iterator{i} -} - -func (iter *Iterator) Read() (any, error) { - return iter.i.Read(), iter.i.Error -} - -func (iter *Iterator) ReadAny() (j.Any, error) { - return iter.i.ReadAny(), iter.i.Error -} - -func (iter *Iterator) ReadArray() (bool, error) { - return iter.i.ReadArray(), iter.i.Error -} - -func (iter *Iterator) ReadObject() (string, error) { - return iter.i.ReadObject(), iter.i.Error -} - -func (iter *Iterator) ReadString() (string, error) { - return iter.i.ReadString(), iter.i.Error -} - -func (iter *Iterator) WhatIsNext() (j.ValueType, error) { - return iter.i.WhatIsNext(), iter.i.Error -} - -func (iter *Iterator) Skip() error { - iter.i.Skip() - return iter.i.Error -} - -func (iter *Iterator) SkipAndReturnBytes() []byte { - return iter.i.SkipAndReturnBytes() -} - -func (iter *Iterator) ReadVal(obj any) error { - iter.i.ReadVal(obj) - return iter.i.Error -} - -func (iter *Iterator) ReadFloat64() (float64, error) { - return iter.i.ReadFloat64(), iter.i.Error -} - -func (iter *Iterator) ReadInt8() (int8, error) { - return iter.i.ReadInt8(), iter.i.Error -} diff --git a/pkg/util/converter/prom.go b/pkg/util/converter/prom.go index 60215e5cff9..7b5cd6b95f6 100644 --- a/pkg/util/converter/prom.go +++ b/pkg/util/converter/prom.go @@ -8,15 +8,15 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/data" + sdkjsoniter "github.com/grafana/grafana-plugin-sdk-go/data/utils/jsoniter" jsoniter "github.com/json-iterator/go" - "golang.org/x/exp/slices" - "github.com/grafana/grafana/pkg/util/converter/jsonitere" + "golang.org/x/exp/slices" ) // helpful while debugging all the options that may appear func logf(format string, a ...any) { - //fmt.Printf(format, a...) + // fmt.Printf(format, a...) } type Options struct { @@ -29,7 +29,7 @@ func rspErr(e error) backend.DataResponse { // ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames func ReadPrometheusStyleResult(jIter *jsoniter.Iterator, opt Options) backend.DataResponse { - iter := jsonitere.NewIterator(jIter) + iter := sdkjsoniter.NewIterator(jIter) var rsp backend.DataResponse status := "unknown" errorType := "" @@ -102,14 +102,14 @@ l1Fields: return rsp } -func readWarnings(iter *jsonitere.Iterator) ([]data.Notice, error) { +func readWarnings(iter *sdkjsoniter.Iterator) ([]data.Notice, error) { warnings := []data.Notice{} next, err := iter.WhatIsNext() if err != nil { return nil, err } - if next != jsoniter.ArrayValue { + if next != sdkjsoniter.ArrayValue { return warnings, nil } @@ -121,7 +121,7 @@ func readWarnings(iter *jsonitere.Iterator) ([]data.Notice, error) { if err != nil { return nil, err } - if next == jsoniter.StringValue { + if next == sdkjsoniter.StringValue { s, err := iter.ReadString() if err != nil { return nil, err @@ -137,18 +137,18 @@ func readWarnings(iter *jsonitere.Iterator) ([]data.Notice, error) { return warnings, nil } -func readPrometheusData(iter *jsonitere.Iterator, opt Options) backend.DataResponse { +func readPrometheusData(iter *sdkjsoniter.Iterator, opt Options) backend.DataResponse { var rsp backend.DataResponse t, err := iter.WhatIsNext() if err != nil { return rspErr(err) } - if t == jsoniter.ArrayValue { + if t == sdkjsoniter.ArrayValue { return readArrayData(iter) } - if t != jsoniter.ObjectValue { + if t != sdkjsoniter.ObjectValue { return backend.DataResponse{ Error: fmt.Errorf("expected object type"), } @@ -190,7 +190,7 @@ l1Fields: // if we have saved resultBytes we will parse them here // we saved them because when we had them we don't know the resultType if len(resultBytes) > 0 { - ji := jsonitere.NewIterator(jsoniter.ParseBytes(jsoniter.ConfigDefault, resultBytes)) + ji := sdkjsoniter.NewIterator(jsoniter.ParseBytes(sdkjsoniter.ConfigDefault, resultBytes)) rsp = readResult(resultType, rsp, ji, opt, encodingFlags) } case "result": @@ -200,7 +200,7 @@ l1Fields: if resultTypeFound { rsp = readResult(resultType, rsp, iter, opt, encodingFlags) } else { - resultBytes = iter.SkipAndReturnBytes() + resultBytes, _ = iter.SkipAndReturnBytes() } case "stats": @@ -241,7 +241,7 @@ l1Fields: } // will read the result object based on the resultType and return a DataResponse -func readResult(resultType string, rsp backend.DataResponse, iter *jsonitere.Iterator, opt Options, encodingFlags []string) backend.DataResponse { +func readResult(resultType string, rsp backend.DataResponse, iter *sdkjsoniter.Iterator, opt Options, encodingFlags []string) backend.DataResponse { switch resultType { case "matrix", "vector": rsp = readMatrixOrVectorMulti(iter, resultType, opt) @@ -279,7 +279,7 @@ func readResult(resultType string, rsp backend.DataResponse, iter *jsonitere.Ite } // will return strings or exemplars -func readArrayData(iter *jsonitere.Iterator) backend.DataResponse { +func readArrayData(iter *sdkjsoniter.Iterator) backend.DataResponse { lookup := make(map[string]*data.Field) var labelFrame *data.Frame @@ -298,7 +298,7 @@ func readArrayData(iter *jsonitere.Iterator) backend.DataResponse { } switch next { - case jsoniter.StringValue: + case sdkjsoniter.StringValue: s, err := iter.ReadString() if err != nil { return rspErr(err) @@ -306,7 +306,7 @@ func readArrayData(iter *jsonitere.Iterator) backend.DataResponse { stringField.Append(s) // Either label or exemplars - case jsoniter.ObjectValue: + case sdkjsoniter.ObjectValue: exemplar, labelPairs, err := readLabelsOrExemplars(iter) if err != nil { rspErr(err) @@ -365,7 +365,7 @@ func readArrayData(iter *jsonitere.Iterator) backend.DataResponse { } // For consistent ordering read values to an array not a map -func readLabelsAsPairs(iter *jsonitere.Iterator) ([][2]string, error) { +func readLabelsAsPairs(iter *sdkjsoniter.Iterator) ([][2]string, error) { pairs := make([][2]string, 0, 10) for k, err := iter.ReadObject(); k != ""; k, err = iter.ReadObject() { if err != nil { @@ -380,7 +380,7 @@ func readLabelsAsPairs(iter *jsonitere.Iterator) ([][2]string, error) { return pairs, nil } -func readLabelsOrExemplars(iter *jsonitere.Iterator) (*data.Frame, [][2]string, error) { +func readLabelsOrExemplars(iter *sdkjsoniter.Iterator) (*data.Frame, [][2]string, error) { pairs := make([][2]string, 0, 10) labels := data.Labels{} var frame *data.Frame @@ -496,7 +496,7 @@ l1Fields: return frame, pairs, nil } -func readString(iter *jsonitere.Iterator) backend.DataResponse { +func readString(iter *sdkjsoniter.Iterator) backend.DataResponse { timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeField.Name = data.TimeSeriesTimeFieldName valueField := data.NewFieldFromFieldType(data.FieldTypeString, 0) @@ -541,7 +541,7 @@ func readString(iter *jsonitere.Iterator) backend.DataResponse { } } -func readScalar(iter *jsonitere.Iterator, dataPlane bool) backend.DataResponse { +func readScalar(iter *sdkjsoniter.Iterator, dataPlane bool) backend.DataResponse { rsp := backend.DataResponse{} timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) @@ -573,7 +573,7 @@ func readScalar(iter *jsonitere.Iterator, dataPlane bool) backend.DataResponse { } } -func readMatrixOrVectorMulti(iter *jsonitere.Iterator, resultType string, opt Options) backend.DataResponse { +func readMatrixOrVectorMulti(iter *sdkjsoniter.Iterator, resultType string, opt Options) backend.DataResponse { rsp := backend.DataResponse{} for more, err := iter.ReadArray(); more; more, err = iter.ReadArray() { @@ -679,7 +679,7 @@ func readMatrixOrVectorMulti(iter *jsonitere.Iterator, resultType string, opt Op return rsp } -func readTimeValuePair(iter *jsonitere.Iterator) (time.Time, float64, error) { +func readTimeValuePair(iter *sdkjsoniter.Iterator) (time.Time, float64, error) { if _, err := iter.ReadArray(); err != nil { return time.Time{}, 0, err } @@ -708,7 +708,7 @@ func readTimeValuePair(iter *jsonitere.Iterator) (time.Time, float64, error) { } type histogramInfo struct { - //XMax (time) YMin Ymax Count YLayout + // XMax (time) YMin Ymax Count YLayout time *data.Field yMin *data.Field // will have labels? yMax *data.Field @@ -734,7 +734,7 @@ func newHistogramInfo() *histogramInfo { // This will read a single sparse histogram // [ time, { count, sum, buckets: [...] }] -func readHistogram(iter *jsonitere.Iterator, hist *histogramInfo) error { +func readHistogram(iter *sdkjsoniter.Iterator, hist *histogramInfo) error { // first element if _, err := iter.ReadArray(); err != nil { return err @@ -834,7 +834,7 @@ func readHistogram(iter *jsonitere.Iterator, hist *histogramInfo) error { return nil } -func appendValueFromString(iter *jsonitere.Iterator, field *data.Field) error { +func appendValueFromString(iter *sdkjsoniter.Iterator, field *data.Field) error { var err error var s string if s, err = iter.ReadString(); err != nil { @@ -850,7 +850,7 @@ func appendValueFromString(iter *jsonitere.Iterator, field *data.Field) error { return nil } -func readStream(iter *jsonitere.Iterator) backend.DataResponse { +func readStream(iter *sdkjsoniter.Iterator) backend.DataResponse { rsp := backend.DataResponse{} labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0) @@ -950,7 +950,7 @@ func readStream(iter *jsonitere.Iterator) backend.DataResponse { return rsp } -func readCategorizedStream(iter *jsonitere.Iterator) backend.DataResponse { +func readCategorizedStream(iter *sdkjsoniter.Iterator) backend.DataResponse { rsp := backend.DataResponse{} labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0) @@ -1084,7 +1084,7 @@ func readCategorizedStream(iter *jsonitere.Iterator) backend.DataResponse { return rsp } -func readCategorizedStreamField(iter *jsonitere.Iterator) (map[string]interface{}, map[string]interface{}, error) { +func readCategorizedStreamField(iter *sdkjsoniter.Iterator) (map[string]interface{}, map[string]interface{}, error) { parsedLabels := data.Labels{} structuredMetadata := data.Labels{} var parsedLabelsMap map[string]interface{}