From 110d4661d7340fab92ab3ab5deea24b106cf9709 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Mon, 4 Apr 2022 17:22:14 -0700 Subject: [PATCH] Converter: use streaming JSON parser to construct frames from loki/prometheus responses (#44520) --- pkg/util/converter/prom.go | 386 ++++++++++++++++++ pkg/util/converter/prom_test.go | 83 ++++ .../testdata/loki-streams-a-frame.json | 90 ++++ .../testdata/loki-streams-a-golden.txt | 56 +++ .../converter/testdata/loki-streams-a.json | 81 ++++ .../testdata/loki-streams-b-frame.json | 90 ++++ .../testdata/loki-streams-b-golden.txt | 55 +++ .../converter/testdata/loki-streams-b.json | 76 ++++ .../testdata/prom-exemplars-frame.json | 102 +++++ .../testdata/prom-exemplars-golden.txt | 31 ++ .../converter/testdata/prom-exemplars.json | 47 +++ .../converter/testdata/prom-labels-frame.json | 24 ++ .../converter/testdata/prom-labels-golden.txt | 25 ++ pkg/util/converter/testdata/prom-labels.json | 26 ++ .../converter/testdata/prom-matrix-frame.json | 78 ++++ .../converter/testdata/prom-matrix-golden.txt | 38 ++ .../testdata/prom-matrix-with-nans-frame.json | 55 +++ .../testdata/prom-matrix-with-nans-golden.txt | 20 + .../testdata/prom-matrix-with-nans.json | 16 + pkg/util/converter/testdata/prom-matrix.json | 33 ++ .../converter/testdata/prom-series-frame.json | 44 ++ .../converter/testdata/prom-series-golden.txt | 18 + pkg/util/converter/testdata/prom-series.json | 21 + .../converter/testdata/prom-vector-frame.json | 213 ++++++++++ .../converter/testdata/prom-vector-golden.txt | 82 ++++ pkg/util/converter/testdata/prom-vector.json | 36 ++ 26 files changed, 1826 insertions(+) create mode 100644 pkg/util/converter/prom.go create mode 100644 pkg/util/converter/prom_test.go create mode 100644 pkg/util/converter/testdata/loki-streams-a-frame.json create mode 100644 pkg/util/converter/testdata/loki-streams-a-golden.txt create mode 100644 pkg/util/converter/testdata/loki-streams-a.json create mode 100644 pkg/util/converter/testdata/loki-streams-b-frame.json create mode 100644 pkg/util/converter/testdata/loki-streams-b-golden.txt create mode 100644 pkg/util/converter/testdata/loki-streams-b.json create mode 100644 pkg/util/converter/testdata/prom-exemplars-frame.json create mode 100644 pkg/util/converter/testdata/prom-exemplars-golden.txt create mode 100644 pkg/util/converter/testdata/prom-exemplars.json create mode 100644 pkg/util/converter/testdata/prom-labels-frame.json create mode 100644 pkg/util/converter/testdata/prom-labels-golden.txt create mode 100644 pkg/util/converter/testdata/prom-labels.json create mode 100644 pkg/util/converter/testdata/prom-matrix-frame.json create mode 100644 pkg/util/converter/testdata/prom-matrix-golden.txt create mode 100644 pkg/util/converter/testdata/prom-matrix-with-nans-frame.json create mode 100644 pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt create mode 100644 pkg/util/converter/testdata/prom-matrix-with-nans.json create mode 100644 pkg/util/converter/testdata/prom-matrix.json create mode 100644 pkg/util/converter/testdata/prom-series-frame.json create mode 100644 pkg/util/converter/testdata/prom-series-golden.txt create mode 100644 pkg/util/converter/testdata/prom-series.json create mode 100644 pkg/util/converter/testdata/prom-vector-frame.json create mode 100644 pkg/util/converter/testdata/prom-vector-golden.txt create mode 100644 pkg/util/converter/testdata/prom-vector.json diff --git a/pkg/util/converter/prom.go b/pkg/util/converter/prom.go new file mode 100644 index 00000000000..640dd148eac --- /dev/null +++ b/pkg/util/converter/prom.go @@ -0,0 +1,386 @@ +package converter + +import ( + "fmt" + "strconv" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/data" + jsoniter "github.com/json-iterator/go" +) + +// helpful while debugging all the options that may appear +func logf(format string, a ...interface{}) { + //fmt.Printf(format, a...) +} + +// ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames +func ReadPrometheusStyleResult(iter *jsoniter.Iterator) *backend.DataResponse { + var rsp *backend.DataResponse + status := "unknown" + + for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { + switch l1Field { + case "status": + status = iter.ReadString() + + case "data": + rsp = readPrometheusData(iter) + + // case "error": + // case "errorType": + // case "warnings": + default: + v := iter.Read() + logf("[ROOT] TODO, support key: %s / %v\n", l1Field, v) + } + } + + if status != "success" { + logf("ERROR: %s\n", status) + } + + return rsp +} + +func readPrometheusData(iter *jsoniter.Iterator) *backend.DataResponse { + t := iter.WhatIsNext() + if t == jsoniter.ArrayValue { + return readArrayData(iter) + } + + if t != jsoniter.ObjectValue { + return &backend.DataResponse{ + Error: fmt.Errorf("expected object type"), + } + } + + resultType := "" + var rsp *backend.DataResponse + + for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { + switch l1Field { + case "resultType": + resultType = iter.ReadString() + + case "result": + switch resultType { + case "matrix": + rsp = readMatrixOrVector(iter) + case "vector": + rsp = readMatrixOrVector(iter) + case "streams": + rsp = readStream(iter) + default: + iter.Skip() + rsp = &backend.DataResponse{ + Error: fmt.Errorf("unknown result type: %s", resultType), + } + } + + case "stats": + v := iter.Read() + if len(rsp.Frames) > 0 { + meta := rsp.Frames[0].Meta + if meta == nil { + meta = &data.FrameMeta{} + rsp.Frames[0].Meta = meta + } + meta.Custom = map[string]interface{}{ + "stats": v, + } + } + + default: + v := iter.Read() + logf("[data] TODO, support key: %s / %v\n", l1Field, v) + } + } + + return rsp +} + +// will return strings or exemplars +func readArrayData(iter *jsoniter.Iterator) *backend.DataResponse { + lookup := make(map[string]*data.Field) + + var labelFrame *data.Frame + rsp := &backend.DataResponse{} + stringField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + stringField.Name = "Value" + for iter.ReadArray() { + switch iter.WhatIsNext() { + case jsoniter.StringValue: + stringField.Append(iter.ReadString()) + + // Either label or exemplars + case jsoniter.ObjectValue: + exemplar, labelPairs := readLabelsOrExemplars(iter) + if exemplar != nil { + rsp.Frames = append(rsp.Frames, exemplar) + } else if labelPairs != nil { + max := 0 + for _, pair := range labelPairs { + k := pair[0] + v := pair[1] + f, ok := lookup[k] + if !ok { + f = data.NewFieldFromFieldType(data.FieldTypeString, 0) + f.Name = k + lookup[k] = f + + if labelFrame == nil { + labelFrame = data.NewFrame("") + rsp.Frames = append(rsp.Frames, labelFrame) + } + labelFrame.Fields = append(labelFrame.Fields, f) + } + f.Append(fmt.Sprintf("%v", v)) + if f.Len() > max { + max = f.Len() + } + } + + // Make sure all fields have equal length + for _, f := range lookup { + diff := max - f.Len() + if diff > 0 { + f.Extend(diff) + } + } + } + + default: + { + ext := iter.ReadAny() + v := fmt.Sprintf("%v", ext) + stringField.Append(v) + } + } + } + + if rsp.Frames == nil || stringField.Len() > 0 { + rsp.Frames = append(rsp.Frames, data.NewFrame("", stringField)) + } + + return rsp +} + +// For consistent ordering read values to an array not a map +func readLabelsAsPairs(iter *jsoniter.Iterator) [][2]string { + pairs := make([][2]string, 0, 10) + for k := iter.ReadObject(); k != ""; k = iter.ReadObject() { + pairs = append(pairs, [2]string{k, iter.ReadString()}) + } + return pairs +} + +func readLabelsOrExemplars(iter *jsoniter.Iterator) (*data.Frame, [][2]string) { + pairs := make([][2]string, 0, 10) + labels := data.Labels{} + var frame *data.Frame + + for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { + switch l1Field { + case "seriesLabels": + iter.ReadVal(&labels) + case "exemplars": + lookup := make(map[string]*data.Field) + timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) + valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0) + valueField.Name = labels["__name__"] + delete(labels, "__name__") + valueField.Labels = labels + frame = data.NewFrame("", timeField, valueField) + for iter.ReadArray() { + for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() { + switch l2Field { + // nolint:goconst + case "value": + v, _ := strconv.ParseFloat(iter.ReadString(), 64) + valueField.Append(v) + + case "timestamp": + ts := timeFromFloat(iter.ReadFloat64()) + timeField.Append(ts) + + case "labels": + max := 0 + for _, pair := range readLabelsAsPairs(iter) { + k := pair[0] + v := pair[1] + f, ok := lookup[k] + if !ok { + f = data.NewFieldFromFieldType(data.FieldTypeString, 0) + f.Name = k + lookup[k] = f + frame.Fields = append(frame.Fields, f) + } + f.Append(v) + if f.Len() > max { + max = f.Len() + } + } + + // Make sure all fields have equal length + for _, f := range lookup { + diff := max - f.Len() + if diff > 0 { + f.Extend(diff) + } + } + + default: + iter.Skip() + frame.AppendNotices(data.Notice{ + Severity: data.NoticeSeverityError, + Text: fmt.Sprintf("unable to parse key: %s in response body", l2Field), + }) + } + } + } + default: + v := fmt.Sprintf("%v", iter.Read()) + pairs = append(pairs, [2]string{l1Field, v}) + } + } + + return frame, pairs +} + +func readMatrixOrVector(iter *jsoniter.Iterator) *backend.DataResponse { + rsp := &backend.DataResponse{} + + for iter.ReadArray() { + timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) + timeField.Name = data.TimeSeriesTimeFieldName + valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0) + valueField.Labels = data.Labels{} + + for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { + switch l1Field { + case "metric": + iter.ReadVal(&valueField.Labels) + + case "value": + t, v, err := readTimeValuePair(iter) + if err == nil { + timeField.Append(t) + valueField.Append(v) + } + + // nolint:goconst + case "values": + for iter.ReadArray() { + t, v, err := readTimeValuePair(iter) + if err == nil { + timeField.Append(t) + valueField.Append(v) + } + } + } + } + + name, ok := valueField.Labels["__name__"] + if ok { + valueField.Name = name + delete(valueField.Labels, "__name__") + } else { + valueField.Name = data.TimeSeriesValueFieldName + } + + frame := data.NewFrame("", timeField, valueField) + frame.Meta = &data.FrameMeta{ + Type: data.FrameTypeTimeSeriesMany, + } + rsp.Frames = append(rsp.Frames, frame) + } + + return rsp +} + +func readTimeValuePair(iter *jsoniter.Iterator) (time.Time, float64, error) { + iter.ReadArray() + t := iter.ReadFloat64() + iter.ReadArray() + v := iter.ReadString() + iter.ReadArray() + + tt := timeFromFloat(t) + fv, err := strconv.ParseFloat(v, 64) + return tt, fv, err +} + +func readStream(iter *jsoniter.Iterator) *backend.DataResponse { + rsp := &backend.DataResponse{} + + labelsField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + labelsField.Name = "__labels" // avoid automatically spreading this by labels + + timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) + timeField.Name = "Time" + + lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + lineField.Name = "Line" + + // Nanoseconds time field + tsField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + tsField.Name = "TS" + + labels := data.Labels{} + labelString := labels.String() + + for iter.ReadArray() { + for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { + switch l1Field { + case "stream": + iter.ReadVal(&labels) + labelString = labels.String() + + case "values": + for iter.ReadArray() { + iter.ReadArray() + ts := iter.ReadString() + iter.ReadArray() + line := iter.ReadString() + iter.ReadArray() + + t := timeFromLokiString(ts) + + labelsField.Append(labelString) + timeField.Append(t) + lineField.Append(line) + tsField.Append(ts) + } + } + } + } + + frame := data.NewFrame("", labelsField, timeField, lineField, tsField) + frame.Meta = &data.FrameMeta{} + rsp.Frames = append(rsp.Frames, frame) + + return rsp +} + +func timeFromFloat(fv float64) time.Time { + return time.UnixMilli(int64(fv * 1000.0)).UTC() +} + +func timeFromLokiString(str string) time.Time { + // normal time values look like: 1645030246277587968 + // and are less than: math.MaxInt65=9223372036854775807 + // This will do a fast path for any date before 2033 + s := len(str) + if s < 19 || (s == 19 && str[0] == '1') { + ns, err := strconv.ParseInt(str, 10, 64) + if err == nil { + return time.Unix(0, ns).UTC() + } + } + + ss, _ := strconv.ParseInt(str[0:10], 10, 64) + ns, _ := strconv.ParseInt(str[10:], 10, 64) + return time.Unix(ss, ns).UTC() +} diff --git a/pkg/util/converter/prom_test.go b/pkg/util/converter/prom_test.go new file mode 100644 index 00000000000..04b71545364 --- /dev/null +++ b/pkg/util/converter/prom_test.go @@ -0,0 +1,83 @@ +package converter + +import ( + "io/ioutil" + "os" + "path" + "testing" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/experimental" + jsoniter "github.com/json-iterator/go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestReadPromFrames(t *testing.T) { + files := []string{ + "prom-labels", + "prom-matrix", + "prom-matrix-with-nans", + "prom-vector", + "prom-series", + "prom-exemplars", + "loki-streams-a", + "loki-streams-b", + } + + for _, name := range files { + t.Run(name, func(t *testing.T) { + // nolint:gosec + // We can ignore the gosec G304 because this is a test with static defined paths + f, err := os.Open(path.Join("testdata", name+".json")) + require.NoError(t, err) + + iter := jsoniter.Parse(jsoniter.ConfigDefault, f, 1024) + rsp := ReadPrometheusStyleResult(iter) + + out, err := jsoniter.MarshalIndent(rsp, "", " ") + require.NoError(t, err) + + save := false + fpath := path.Join("testdata", name+"-frame.json") + + // nolint:gosec + // We can ignore the gosec G304 because this is a test with static defined paths + current, err := ioutil.ReadFile(fpath) + if err == nil { + same := assert.JSONEq(t, string(out), string(current)) + if !same { + save = true + } + } else { + assert.Fail(t, "missing file: "+fpath) + save = true + } + + if save { + err = os.WriteFile(fpath, out, 0600) + require.NoError(t, err) + } + + fpath = path.Join("testdata", name+"-golden.txt") + err = experimental.CheckGoldenDataResponse(fpath, rsp, true) + assert.NoError(t, err) + }) + } +} + +func TestTimeConversions(t *testing.T) { + // include millisecond precision + assert.Equal(t, + time.Date(2020, time.September, 14, 15, 22, 25, 479000000, time.UTC), + timeFromFloat(1600096945.479)) + + // Loki date parsing + assert.Equal(t, + time.Date(2022, time.February, 16, 16, 50, 46, 277587968, time.UTC), + timeFromLokiString("1645030246277587968")) + + assert.Equal(t, + time.Date(2033, time.May, 18, 3, 33, 20, 0, time.UTC), + timeFromLokiString("2000000000000000000")) +} diff --git a/pkg/util/converter/testdata/loki-streams-a-frame.json b/pkg/util/converter/testdata/loki-streams-a-frame.json new file mode 100644 index 00000000000..bd5df94989e --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-a-frame.json @@ -0,0 +1,90 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "custom": { + "stats": { + "ingester": { + "totalChunksMatched": 0, + "totalBatches": 0, + "totalLinesSent": 0, + "headChunkBytes": 0, + "headChunkLines": 0, + "decompressedLines": 0, + "compressedBytes": 0, + "totalReached": 0, + "totalDuplicates": 0, + "decompressedBytes": 0 + }, + "summary": { + "bytesProcessedPerSecond": 3507022, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55, + "execTime": 0.002216125 + }, + "store": { + "totalChunksDownloaded": 2, + "headChunkBytes": 0, + "decompressedLines": 55, + "totalDuplicates": 0, + "totalChunksRef": 2, + "headChunkLines": 0, + "decompressedBytes": 7772, + "compressedBytes": 31432, + "chunksDownloadTime": 0.000390958 + } + } + } + }, + "fields": [ + { + "name": "__labels", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Line", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "TS", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + "level=error, location=moonπŸŒ™","level=info, location=moonπŸŒ™","level=info, location=moonπŸŒ™","level=info, location=moonπŸŒ™","level=info, location=moonπŸŒ™","level=info, location=moonπŸŒ™" + ], + [ + 1645030244810,1645030247027,1645030246277,1645030246277,1645030245539,1645030244091 + ], + [ + "log line error 1","log line info 1","log line info 2","log line info 2","log line info 3","log line info 4" + ], + [ + "1645030244810757120","1645030247027735040","1645030246277587968","1645030246277587968","1645030245539423744","1645030244091700992" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/loki-streams-a-golden.txt b/pkg/util/converter/testdata/loki-streams-a-golden.txt new file mode 100644 index 00000000000..727f13947ae --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-a-golden.txt @@ -0,0 +1,56 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "custom": { + "stats": { + "ingester": { + "compressedBytes": 0, + "decompressedBytes": 0, + "decompressedLines": 0, + "headChunkBytes": 0, + "headChunkLines": 0, + "totalBatches": 0, + "totalChunksMatched": 0, + "totalDuplicates": 0, + "totalLinesSent": 0, + "totalReached": 0 + }, + "store": { + "chunksDownloadTime": 0.000390958, + "compressedBytes": 31432, + "decompressedBytes": 7772, + "decompressedLines": 55, + "headChunkBytes": 0, + "headChunkLines": 0, + "totalChunksDownloaded": 2, + "totalChunksRef": 2, + "totalDuplicates": 0 + }, + "summary": { + "bytesProcessedPerSecond": 3507022, + "execTime": 0.002216125, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55 + } + } + } +} +Name: +Dimensions: 4 Fields by 6 Rows ++------------------------------+-----------------------------------------+------------------+---------------------+ +| Name: __labels | Name: Time | Name: Line | Name: TS | +| Labels: | Labels: | Labels: | Labels: | +| Type: []string | Type: []time.Time | Type: []string | Type: []string | ++------------------------------+-----------------------------------------+------------------+---------------------+ +| level=error, location=moonπŸŒ™ | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | +| level=info, location=moonπŸŒ™ | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | +| level=info, location=moonπŸŒ™ | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | +| level=info, location=moonπŸŒ™ | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | +| level=info, location=moonπŸŒ™ | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 | +| level=info, location=moonπŸŒ™ | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 | ++------------------------------+-----------------------------------------+------------------+---------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=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 diff --git a/pkg/util/converter/testdata/loki-streams-a.json b/pkg/util/converter/testdata/loki-streams-a.json new file mode 100644 index 00000000000..7531b4dd656 --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-a.json @@ -0,0 +1,81 @@ +{ + "status": "success", + "data": { + "resultType": "streams", + "result": [ + { + "stream": { + "level": "error", + "location": "moonπŸŒ™" + }, + "values": [ + [ + "1645030244810757120", + "log line error 1" + ] + ] + }, + { + "stream": { + "level": "info", + "location": "moonπŸŒ™" + }, + "values": [ + [ + "1645030247027735040", + "log line info 1" + ], + [ + "1645030246277587968", + "log line info 2" + ], + [ + "1645030246277587968", + "log line info 2" + ], + [ + "1645030245539423744", + "log line info 3" + ], + [ + "1645030244091700992", + "log line info 4" + ] + ] + } + ], + "stats": { + "summary": { + "bytesProcessedPerSecond": 3507022, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55, + "execTime": 0.002216125 + }, + "store": { + "totalChunksRef": 2, + "totalChunksDownloaded": 2, + "chunksDownloadTime": 0.000390958, + "headChunkBytes": 0, + "headChunkLines": 0, + "decompressedBytes": 7772, + "decompressedLines": 55, + "compressedBytes": 31432, + "totalDuplicates": 0 + }, + "ingester": { + "totalReached": 0, + "totalChunksMatched": 0, + "totalBatches": 0, + "totalLinesSent": 0, + "headChunkBytes": 0, + "headChunkLines": 0, + "decompressedBytes": 0, + "decompressedLines": 0, + "compressedBytes": 0, + "totalDuplicates": 0 + } + } + } + } + \ No newline at end of file diff --git a/pkg/util/converter/testdata/loki-streams-b-frame.json b/pkg/util/converter/testdata/loki-streams-b-frame.json new file mode 100644 index 00000000000..28ef33d2768 --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-b-frame.json @@ -0,0 +1,90 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "custom": { + "stats": { + "summary": { + "execTime": 0.002216125, + "bytesProcessedPerSecond": 3507022, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55 + }, + "store": { + "headChunkBytes": 0, + "decompressedLines": 55, + "compressedBytes": 31432, + "totalDuplicates": 0, + "totalChunksDownloaded": 2, + "chunksDownloadTime": 0.000390958, + "headChunkLines": 0, + "decompressedBytes": 7772, + "totalChunksRef": 2 + }, + "ingester": { + "headChunkBytes": 0, + "decompressedBytes": 0, + "totalBatches": 0, + "totalLinesSent": 0, + "headChunkLines": 0, + "decompressedLines": 0, + "compressedBytes": 0, + "totalDuplicates": 0, + "totalReached": 0, + "totalChunksMatched": 0 + } + } + } + }, + "fields": [ + { + "name": "__labels", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Line", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "TS", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + "level=error, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon" + ], + [ + 1645030244810,1645030247027,1645030246277,1645030245539,1645030244091 + ], + [ + "log line error 1","log line info 1","log line info 2","log line info 3","log line info 4" + ], + [ + "1645030244810757120","1645030247027735040","1645030246277587968","1645030245539423744","1645030244091700992" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/loki-streams-b-golden.txt b/pkg/util/converter/testdata/loki-streams-b-golden.txt new file mode 100644 index 00000000000..c5291a2e1a5 --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-b-golden.txt @@ -0,0 +1,55 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "custom": { + "stats": { + "ingester": { + "compressedBytes": 0, + "decompressedBytes": 0, + "decompressedLines": 0, + "headChunkBytes": 0, + "headChunkLines": 0, + "totalBatches": 0, + "totalChunksMatched": 0, + "totalDuplicates": 0, + "totalLinesSent": 0, + "totalReached": 0 + }, + "store": { + "chunksDownloadTime": 0.000390958, + "compressedBytes": 31432, + "decompressedBytes": 7772, + "decompressedLines": 55, + "headChunkBytes": 0, + "headChunkLines": 0, + "totalChunksDownloaded": 2, + "totalChunksRef": 2, + "totalDuplicates": 0 + }, + "summary": { + "bytesProcessedPerSecond": 3507022, + "execTime": 0.002216125, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55 + } + } + } +} +Name: +Dimensions: 4 Fields by 5 Rows ++----------------------------+-----------------------------------------+------------------+---------------------+ +| Name: __labels | Name: Time | Name: Line | Name: TS | +| Labels: | Labels: | Labels: | Labels: | +| Type: []string | Type: []time.Time | Type: []string | Type: []string | ++----------------------------+-----------------------------------------+------------------+---------------------+ +| level=error, location=moon | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | +| level=info, location=moon | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | +| level=info, location=moon | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | +| level=info, location=moon | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 | +| level=info, location=moon | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 | ++----------------------------+-----------------------------------------+------------------+---------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=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 diff --git a/pkg/util/converter/testdata/loki-streams-b.json b/pkg/util/converter/testdata/loki-streams-b.json new file mode 100644 index 00000000000..87fb82a3952 --- /dev/null +++ b/pkg/util/converter/testdata/loki-streams-b.json @@ -0,0 +1,76 @@ +{ + "status": "success", + "data": { + "resultType": "streams", + "result": [ + { + "stream": { + "level": "error", + "location": "moon" + }, + "values": [ + [ + "1645030244810757120", + "log line error 1" + ] + ] + }, + { + "stream": { + "level": "info", + "location": "moon" + }, + "values": [ + [ + "1645030247027735040", + "log line info 1" + ], + [ + "1645030246277587968", + "log line info 2" + ], + [ + "1645030245539423744", + "log line info 3" + ], + [ + "1645030244091700992", + "log line info 4" + ] + ] + } + ], + "stats": { + "summary": { + "bytesProcessedPerSecond": 3507022, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55, + "execTime": 0.002216125 + }, + "store": { + "totalChunksRef": 2, + "totalChunksDownloaded": 2, + "chunksDownloadTime": 0.000390958, + "headChunkBytes": 0, + "headChunkLines": 0, + "decompressedBytes": 7772, + "decompressedLines": 55, + "compressedBytes": 31432, + "totalDuplicates": 0 + }, + "ingester": { + "totalReached": 0, + "totalChunksMatched": 0, + "totalBatches": 0, + "totalLinesSent": 0, + "headChunkBytes": 0, + "headChunkLines": 0, + "decompressedBytes": 0, + "decompressedLines": 0, + "compressedBytes": 0, + "totalDuplicates": 0 + } + } + } +} diff --git a/pkg/util/converter/testdata/prom-exemplars-frame.json b/pkg/util/converter/testdata/prom-exemplars-frame.json new file mode 100644 index 00000000000..9f1a87297e8 --- /dev/null +++ b/pkg/util/converter/testdata/prom-exemplars-frame.json @@ -0,0 +1,102 @@ +{ + "frames": [ + { + "schema": { + "fields": [ + { + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "test_exemplar_metric_total", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "instance": "localhost:8090", + "job": "prometheus", + "service": "bar" + } + }, + { + "name": "traceID", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "a", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + 1600096945479 + ], + [ + 6 + ], + [ + "EpTxMJ40fUus7aGY" + ], + [ + "not in next" + ] + ] + } + }, + { + "schema": { + "fields": [ + { + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "test_exemplar_metric_total", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "instance": "localhost:8090", + "job": "prometheus", + "service": "foo" + } + }, + { + "name": "traceID", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + 1600096955479,1600096965489 + ], + [ + 19,20 + ], + [ + "Olp9XHlq763ccsfa","hCtjygkIHwAN9vs4" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-exemplars-golden.txt b/pkg/util/converter/testdata/prom-exemplars-golden.txt new file mode 100644 index 00000000000..2ed17bd815e --- /dev/null +++ b/pkg/util/converter/testdata/prom-exemplars-golden.txt @@ -0,0 +1,31 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] +Name: +Dimensions: 4 Fields by 1 Rows ++-----------------------------------+--------------------------------------------------------------+------------------+----------------+ +| Name: | Name: test_exemplar_metric_total | Name: traceID | Name: a | +| Labels: | Labels: instance=localhost:8090, job=prometheus, service=bar | Labels: | Labels: | +| Type: []time.Time | Type: []float64 | Type: []string | Type: []string | ++-----------------------------------+--------------------------------------------------------------+------------------+----------------+ +| 2020-09-14 15:22:25.479 +0000 UTC | 6 | EpTxMJ40fUus7aGY | not in next | ++-----------------------------------+--------------------------------------------------------------+------------------+----------------+ + + + +Frame[1] +Name: +Dimensions: 3 Fields by 2 Rows ++-----------------------------------+--------------------------------------------------------------+------------------+ +| Name: | Name: test_exemplar_metric_total | Name: traceID | +| Labels: | Labels: instance=localhost:8090, job=prometheus, service=foo | Labels: | +| Type: []time.Time | Type: []float64 | Type: []string | ++-----------------------------------+--------------------------------------------------------------+------------------+ +| 2020-09-14 15:22:35.479 +0000 UTC | 19 | Olp9XHlq763ccsfa | +| 2020-09-14 15:22:45.489 +0000 UTC | 20 | hCtjygkIHwAN9vs4 | ++-----------------------------------+--------------------------------------------------------------+------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=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 +FRAME=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 diff --git a/pkg/util/converter/testdata/prom-exemplars.json b/pkg/util/converter/testdata/prom-exemplars.json new file mode 100644 index 00000000000..e194e82b8a8 --- /dev/null +++ b/pkg/util/converter/testdata/prom-exemplars.json @@ -0,0 +1,47 @@ +{ + "status": "success", + "data": [ + { + "seriesLabels": { + "__name__": "test_exemplar_metric_total", + "instance": "localhost:8090", + "job": "prometheus", + "service": "bar" + }, + "exemplars": [ + { + "labels": { + "traceID": "EpTxMJ40fUus7aGY", + "a": "not in next" + }, + "value": "6", + "timestamp": 1600096945.479 + } + ] + }, + { + "seriesLabels": { + "__name__": "test_exemplar_metric_total", + "instance": "localhost:8090", + "job": "prometheus", + "service": "foo" + }, + "exemplars": [ + { + "labels": { + "traceID": "Olp9XHlq763ccsfa" + }, + "value": "19", + "timestamp": 1600096955.479 + }, + { + "labels": { + "traceID": "hCtjygkIHwAN9vs4" + }, + "value": "20", + "timestamp": 1600096965.489 + } + ] + } + ] +} diff --git a/pkg/util/converter/testdata/prom-labels-frame.json b/pkg/util/converter/testdata/prom-labels-frame.json new file mode 100644 index 00000000000..ce2ea92da99 --- /dev/null +++ b/pkg/util/converter/testdata/prom-labels-frame.json @@ -0,0 +1,24 @@ +{ + "frames": [ + { + "schema": { + "fields": [ + { + "name": "Value", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + "__name__","call","code","config","dialer_name","endpoint","event","goversion","handler","instance","interval","job","le","listener_name","name","quantile","reason","role","scrape_job","slice","version" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-labels-golden.txt b/pkg/util/converter/testdata/prom-labels-golden.txt new file mode 100644 index 00000000000..bcff6d3e963 --- /dev/null +++ b/pkg/util/converter/testdata/prom-labels-golden.txt @@ -0,0 +1,25 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] +Name: +Dimensions: 1 Fields by 21 Rows ++----------------+ +| Name: Value | +| Labels: | +| Type: []string | ++----------------+ +| __name__ | +| call | +| code | +| config | +| dialer_name | +| endpoint | +| event | +| goversion | +| handler | +| ... | ++----------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////AAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAACE////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAKT///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAQAAABgAAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEgAAAAAAAAFRAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAAAD/////mAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAOgAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAEgAAAAVAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAABYAAAAAAAAAIwAAAAAAAAAAAAAAAEAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABYAAAAhAAAAKQAAAC4AAAA3AAAAPgAAAEYAAABOAAAAUQAAAFMAAABgAAAAZAAAAGwAAAByAAAAdgAAAIAAAACFAAAAjAAAAF9fbmFtZV9fY2FsbGNvZGVjb25maWdkaWFsZXJfbmFtZWVuZHBvaW50ZXZlbnRnb3ZlcnNpb25oYW5kbGVyaW5zdGFuY2VpbnRlcnZhbGpvYmxlbGlzdGVuZXJfbmFtZW5hbWVxdWFudGlsZXJlYXNvbnJvbGVzY3JhcGVfam9ic2xpY2V2ZXJzaW9uAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAAQAQAAAAAAAKAAAAAAAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAACE////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAKT///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAQAAABgAAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEgAAAAAAAAFRAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAAAAwAQAAQVJST1cx diff --git a/pkg/util/converter/testdata/prom-labels.json b/pkg/util/converter/testdata/prom-labels.json new file mode 100644 index 00000000000..fd505b23d98 --- /dev/null +++ b/pkg/util/converter/testdata/prom-labels.json @@ -0,0 +1,26 @@ +{ + "status": "success", + "data": [ + "__name__", + "call", + "code", + "config", + "dialer_name", + "endpoint", + "event", + "goversion", + "handler", + "instance", + "interval", + "job", + "le", + "listener_name", + "name", + "quantile", + "reason", + "role", + "scrape_job", + "slice", + "version" + ] +} diff --git a/pkg/util/converter/testdata/prom-matrix-frame.json b/pkg/util/converter/testdata/prom-matrix-frame.json new file mode 100644 index 00000000000..af91613cb20 --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix-frame.json @@ -0,0 +1,78 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "up", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "job": "prometheus", + "instance": "localhost:9090" + } + } + ] + }, + "data": { + "values": [ + [ + 1435781430781,1435781445781,1435781460781 + ], + [ + 1,1,1 + ] + ] + } + }, + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "up", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "job": "node", + "instance": "localhost:9091" + } + } + ] + }, + "data": { + "values": [ + [ + 1435781430781,1435781445781,1435781460781 + ], + [ + 0,0,1 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-matrix-golden.txt b/pkg/util/converter/testdata/prom-matrix-golden.txt new file mode 100644 index 00000000000..83088450f9d --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix-golden.txt @@ -0,0 +1,38 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 3 Rows ++-----------------------------------+-------------------------------------------------+ +| Name: Time | Name: up | +| Labels: | Labels: instance=localhost:9090, job=prometheus | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+-------------------------------------------------+ +| 2015-07-01 20:10:30.781 +0000 UTC | 1 | +| 2015-07-01 20:10:45.781 +0000 UTC | 1 | +| 2015-07-01 20:11:00.781 +0000 UTC | 1 | ++-----------------------------------+-------------------------------------------------+ + + + +Frame[1] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 3 Rows ++-----------------------------------+-------------------------------------------+ +| Name: Time | Name: up | +| Labels: | Labels: instance=localhost:9091, job=node | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+-------------------------------------------+ +| 2015-07-01 20:10:30.781 +0000 UTC | 0 | +| 2015-07-01 20:10:45.781 +0000 UTC | 0 | +| 2015-07-01 20:11:00.781 +0000 UTC | 1 | ++-----------------------------------+-------------------------------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////8AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAoP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADA/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOD+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMQAAAAEAAAAVv///xQAAACMAAAAjAAAAAAAAAOMAAAAAgAAACgAAAAEAAAASP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABo////CAAAADwAAAAwAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkwIiwiam9iIjoicHJvbWV0aGV1cyJ9AAAAAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAADAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAABAuc2smuvsE0CP3yqe6+wTQGXxqKHr7BMAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8QAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAPAAAAAAABAABAAAAAAIAAAAAAADAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAACMAAAAAwAAAEwAAAAoAAAABAAAAKD+//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAAwP7//wgAAAAMAAAAAAAAAAAAAAAEAAAAbmFtZQAAAADg/v//CAAAACQAAAAaAAAAeyJ0eXBlIjoidGltZXNlcmllcy1tYW55In0AAAQAAABtZXRhAAAAAAIAAADEAAAABAAAAFb///8UAAAAjAAAAIwAAAAAAAADjAAAAAIAAAAoAAAABAAAAEj///8IAAAADAAAAAIAAAB1cAAABAAAAG5hbWUAAAAAaP///wgAAAA8AAAAMAAAAHsiaW5zdGFuY2UiOiJsb2NhbGhvc3Q6OTA5MCIsImpvYiI6InByb21ldGhldXMifQAAAAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAIAIAAEFSUk9XMQ== +FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkxIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAwAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAgAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAQLnNrJrr7BNAj98qnuvsE0Bl8aih6+wTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAQAAQAAAPgBAAAAAAAAwAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACo/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMj+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA6P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAvAAAAAQAAABe////FAAAAIQAAACEAAAAAAAAA4QAAAACAAAAKAAAAAQAAABQ////CAAAAAwAAAACAAAAdXAAAAQAAABuYW1lAAAAAHD///8IAAAANAAAACoAAAB7Imluc3RhbmNlIjoibG9jYWxob3N0OjkwOTEiLCJqb2IiOiJub2RlIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAYAgAAQVJST1cx diff --git a/pkg/util/converter/testdata/prom-matrix-with-nans-frame.json b/pkg/util/converter/testdata/prom-matrix-with-nans-frame.json new file mode 100644 index 00000000000..93ba618a21c --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix-with-nans-frame.json @@ -0,0 +1,55 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Value", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "job": "prometheus", + "handler": "/api/v1/query_range" + } + } + ] + }, + "data": { + "values": [ + [ + 1641889530000,1641889531000,1641889532000 + ], + [ + null,null,null + ] + ], + "entities": [ + null, + { + "NaN": [ + 1 + ], + "Inf": [ + 0 + ], + "NegInf": [ + 2 + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt b/pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt new file mode 100644 index 00000000000..7aa69989cf2 --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt @@ -0,0 +1,20 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 3 Rows ++-------------------------------+-----------------------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: handler=/api/v1/query_range, job=prometheus | +| Type: []time.Time | Type: []float64 | ++-------------------------------+-----------------------------------------------------+ +| 2022-01-11 08:25:30 +0000 UTC | +Inf | +| 2022-01-11 08:25:31 +0000 UTC | NaN | +| 2022-01-11 08:25:32 +0000 UTC | -Inf | ++-------------------------------+-----------------------------------------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////+AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAmP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC4/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMwAAAAEAAAATv///xQAAACUAAAAlAAAAAAAAAOUAAAAAgAAACwAAAAEAAAAQP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAZP///wgAAABAAAAANAAAAHsiaGFuZGxlciI6Ii9hcGkvdjEvcXVlcnlfcmFuZ2UiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAAP////+4AAAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAMAAAAAAAAAAUAAAAAAAAAwQACgAYAAwACAAEAAoAAAAUAAAAWAAAAAMAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAABEFRTUKckWAA6wT9QpyRYA2EqL1CnJFgAAAAAAAPB/AQAAAAAA+H8AAAAAAADw/xAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAAIAgAAAAAAAMAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAmP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC4/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMwAAAAEAAAATv///xQAAACUAAAAlAAAAAAAAAOUAAAAAgAAACwAAAAEAAAAQP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAZP///wgAAABAAAAANAAAAHsiaGFuZGxlciI6Ii9hcGkvdjEvcXVlcnlfcmFuZ2UiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAACgCAABBUlJPVzE= diff --git a/pkg/util/converter/testdata/prom-matrix-with-nans.json b/pkg/util/converter/testdata/prom-matrix-with-nans.json new file mode 100644 index 00000000000..c2c9a609a37 --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix-with-nans.json @@ -0,0 +1,16 @@ +{ + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { "handler": "/api/v1/query_range", "job": "prometheus" }, + "values": [ + [1641889530, "+Inf"], + [1641889531, "NaN"], + [1641889532, "-Inf"] + ] + } + ] + } + } \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-matrix.json b/pkg/util/converter/testdata/prom-matrix.json new file mode 100644 index 00000000000..368eaa1f19f --- /dev/null +++ b/pkg/util/converter/testdata/prom-matrix.json @@ -0,0 +1,33 @@ +{ + "status" : "success", + "data" : { + "resultType" : "matrix", + "result" : [ + { + "metric" : { + "__name__" : "up", + "job" : "prometheus", + "instance" : "localhost:9090" + }, + "values" : [ + [ 1435781430.781, "1" ], + [ 1435781445.781, "1" ], + [ 1435781460.781, "1" ] + ] + }, + { + "metric" : { + "__name__" : "up", + "job" : "node", + "instance" : "localhost:9091" + }, + "values" : [ + [ 1435781430.781, "0" ], + [ 1435781445.781, "0" ], + [ 1435781460.781, "1" ] + ] + } + ] + } + } + \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-series-frame.json b/pkg/util/converter/testdata/prom-series-frame.json new file mode 100644 index 00000000000..397dcef8981 --- /dev/null +++ b/pkg/util/converter/testdata/prom-series-frame.json @@ -0,0 +1,44 @@ +{ + "frames": [ + { + "schema": { + "fields": [ + { + "name": "__name__", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "job", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "instance", + "type": "string", + "typeInfo": { + "frame": "string" + } + } + ] + }, + "data": { + "values": [ + [ + "up","up","process_start_time_seconds" + ], + [ + "prometheus","node","prometheus" + ], + [ + "localhost:9090","localhost:9091","localhost:9090" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-series-golden.txt b/pkg/util/converter/testdata/prom-series-golden.txt new file mode 100644 index 00000000000..da12d51ed1a --- /dev/null +++ b/pkg/util/converter/testdata/prom-series-golden.txt @@ -0,0 +1,18 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] +Name: +Dimensions: 3 Fields by 3 Rows ++----------------------------+----------------+----------------+ +| Name: __name__ | Name: job | Name: instance | +| Labels: | Labels: | Labels: | +| Type: []string | Type: []string | Type: []string | ++----------------------------+----------------+----------------+ +| up | prometheus | localhost:9090 | +| up | node | localhost:9091 | +| process_start_time_seconds | prometheus | localhost:9090 | ++----------------------------+----------------+----------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////wAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAOz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAwAAANAAAABoAAAABAAAAE7///8UAAAAQAAAAEAAAAAAAAAFPAAAAAEAAAAEAAAAPP///wgAAAAUAAAACAAAAGluc3RhbmNlAAAAAAQAAABuYW1lAAAAAAAAAAA0////CAAAAGluc3RhbmNlAAAAAK7///8UAAAAOAAAADgAAAAAAAAFNAAAAAEAAAAEAAAAnP///wgAAAAMAAAAAwAAAGpvYgAEAAAAbmFtZQAAAAAAAAAAjP///wMAAABqb2IAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbmFtZV9fAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX25hbWVfXwAAAAD/////GAEAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAJgAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAKgAAAADAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAB4AAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAEAAAAAAAAABAAAAAAAAAABgAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAEAAAAAAAAABoAAAAAAAAACoAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAeAAAAdXB1cHByb2Nlc3Nfc3RhcnRfdGltZV9zZWNvbmRzAAAAAAAACgAAAA4AAAAYAAAAcHJvbWV0aGV1c25vZGVwcm9tZXRoZXVzAAAAAA4AAAAcAAAAKgAAAGxvY2FsaG9zdDo5MDkwbG9jYWxob3N0OjkwOTFsb2NhbGhvc3Q6OTA5MAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAADQAQAAAAAAACABAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAOz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAwAAANAAAABoAAAABAAAAE7///8UAAAAQAAAAEAAAAAAAAAFPAAAAAEAAAAEAAAAPP///wgAAAAUAAAACAAAAGluc3RhbmNlAAAAAAQAAABuYW1lAAAAAAAAAAA0////CAAAAGluc3RhbmNlAAAAAK7///8UAAAAOAAAADgAAAAAAAAFNAAAAAEAAAAEAAAAnP///wgAAAAMAAAAAwAAAGpvYgAEAAAAbmFtZQAAAAAAAAAAjP///wMAAABqb2IAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbmFtZV9fAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX25hbWVfXwAAAADwAQAAQVJST1cx diff --git a/pkg/util/converter/testdata/prom-series.json b/pkg/util/converter/testdata/prom-series.json new file mode 100644 index 00000000000..a5e0efd1c54 --- /dev/null +++ b/pkg/util/converter/testdata/prom-series.json @@ -0,0 +1,21 @@ +{ + "status" : "success", + "data" : [ + { + "__name__" : "up", + "job" : "prometheus", + "instance" : "localhost:9090" + }, + { + "__name__" : "up", + "job" : "node", + "instance" : "localhost:9091" + }, + { + "__name__" : "process_start_time_seconds", + "job" : "prometheus", + "instance" : "localhost:9090" + } + ] + } + \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-vector-frame.json b/pkg/util/converter/testdata/prom-vector-frame.json new file mode 100644 index 00000000000..8d81e0ba3ca --- /dev/null +++ b/pkg/util/converter/testdata/prom-vector-frame.json @@ -0,0 +1,213 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "up", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "job": "prometheus", + "instance": "localhost:9090" + } + } + ] + }, + "data": { + "values": [ + [ + 1435781451781 + ], + [ + 1 + ] + ] + } + }, + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "up", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "job": "node", + "instance": "localhost:9100" + } + } + ] + }, + "data": { + "values": [ + [ + 1435781451781 + ], + [ + 0 + ] + ] + } + }, + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Value", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "level": "error", + "location": "moon" + } + } + ] + }, + "data": { + "values": [ + [ + 1645029699000 + ], + [ + null + ] + ], + "entities": [ + null, + { + "Inf": [ + 0 + ] + } + ] + } + }, + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Value", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "level": "info", + "location": "moon" + } + } + ] + }, + "data": { + "values": [ + [ + 1645029699000 + ], + [ + null + ] + ], + "entities": [ + null, + { + "NegInf": [ + 0 + ] + } + ] + } + }, + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Value", + "type": "number", + "typeInfo": { + "frame": "float64" + }, + "labels": { + "level": "debug", + "location": "moon" + } + } + ] + }, + "data": { + "values": [ + [ + 1645029699000 + ], + [ + null + ] + ], + "entities": [ + null, + { + "NaN": [ + 0 + ] + } + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-vector-golden.txt b/pkg/util/converter/testdata/prom-vector-golden.txt new file mode 100644 index 00000000000..a1dfe5665b5 --- /dev/null +++ b/pkg/util/converter/testdata/prom-vector-golden.txt @@ -0,0 +1,82 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-----------------------------------+-------------------------------------------------+ +| Name: Time | Name: up | +| Labels: | Labels: instance=localhost:9090, job=prometheus | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+-------------------------------------------------+ +| 2015-07-01 20:10:51.781 +0000 UTC | 1 | ++-----------------------------------+-------------------------------------------------+ + + + +Frame[1] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-----------------------------------+-------------------------------------------+ +| Name: Time | Name: up | +| Labels: | Labels: instance=localhost:9100, job=node | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+-------------------------------------------+ +| 2015-07-01 20:10:51.781 +0000 UTC | 0 | ++-----------------------------------+-------------------------------------------+ + + + +Frame[2] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-------------------------------+------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: level=error, location=moon | +| Type: []time.Time | Type: []float64 | ++-------------------------------+------------------------------------+ +| 2022-02-16 16:41:39 +0000 UTC | +Inf | ++-------------------------------+------------------------------------+ + + + +Frame[3] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-------------------------------+-----------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: level=info, location=moon | +| Type: []time.Time | Type: []float64 | ++-------------------------------+-----------------------------------+ +| 2022-02-16 16:41:39 +0000 UTC | -Inf | ++-------------------------------+-----------------------------------+ + + + +Frame[4] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-------------------------------+------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: level=debug, location=moon | +| Type: []time.Time | Type: []float64 | ++-------------------------------+------------------------------------+ +| 2022-02-16 16:41:39 +0000 UTC | NaN | ++-------------------------------+------------------------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////8AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAoP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADA/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOD+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMQAAAAEAAAAVv///xQAAACMAAAAjAAAAAAAAAOMAAAAAgAAACgAAAAEAAAASP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABo////CAAAADwAAAAwAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkwIiwiam9iIjoicHJvbWV0aGV1cyJ9AAAAAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAABAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAABAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABAS4CQn+vsEwAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAQAAQAAAAACAAAAAAAAwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACg/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMD+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA4P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAxAAAAAQAAABW////FAAAAIwAAACMAAAAAAAAA4wAAAACAAAAKAAAAAQAAABI////CAAAAAwAAAACAAAAdXAAAAQAAABuYW1lAAAAAGj///8IAAAAPAAAADAAAAB7Imluc3RhbmNlIjoibG9jYWxob3N0OjkwOTAiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIAAgAAAHVwAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAACACAABBUlJPVzE= +FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MTAwIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAQEuAkJ/r7BMAAAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MTAwIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAGAIAAEFSUk9XMQ== +FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIwAAAHsibGV2ZWwiOiJlcnJvciIsImxvY2F0aW9uIjoibW9vbiJ9AAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYAAAAAAADwfxAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAjAAAAeyJsZXZlbCI6ImVycm9yIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE= +FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIgAAAHsibGV2ZWwiOiJpbmZvIiwibG9jYXRpb24iOiJtb29uIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYAAAAAAADw/xAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAiAAAAeyJsZXZlbCI6ImluZm8iLCJsb2NhdGlvbiI6Im1vb24ifQAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE= +FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIwAAAHsibGV2ZWwiOiJkZWJ1ZyIsImxvY2F0aW9uIjoibW9vbiJ9AAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYBAAAAAAD4fxAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAjAAAAeyJsZXZlbCI6ImRlYnVnIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE= diff --git a/pkg/util/converter/testdata/prom-vector.json b/pkg/util/converter/testdata/prom-vector.json new file mode 100644 index 00000000000..641301f4521 --- /dev/null +++ b/pkg/util/converter/testdata/prom-vector.json @@ -0,0 +1,36 @@ +{ + "status" : "success", + "data" : { + "resultType" : "vector", + "result" : [ + { + "metric" : { + "__name__" : "up", + "job" : "prometheus", + "instance" : "localhost:9090" + }, + "value": [ 1435781451.781, "1" ] + }, + { + "metric" : { + "__name__" : "up", + "job" : "node", + "instance" : "localhost:9100" + }, + "value" : [ 1435781451.781, "0" ] + }, + { + "metric": { "level": "error", "location": "moon"}, + "value": [1645029699, "+Inf"] + }, + { + "metric": { "level": "info", "location": "moon" }, + "value": [1645029699, "-Inf"] + }, + { + "metric": { "level": "debug", "location": "moon" }, + "value": [1645029699, "NaN"] + } + ] + } + }