From 46b40b6e82417661078be5f1c4a9d802e440d9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Thu, 5 May 2022 08:47:40 +0200 Subject: [PATCH] Loki: backend: use streaming JSON parser (#47656) * converter: remove __name__ customization because Loki does not do that Loki does not handle __name__ in a special way. for Prometheus, the caller can implement the formatting by themselves * converter: change labels-formatting the labels.String() method does not handle strange values well * loki: backend: use streaming-json parser * more idiomatic code Co-authored-by: Todd Treece <360020+toddtreece@users.noreply.github.com> * simpler row-length check * simpler code Co-authored-by: Todd Treece <360020+toddtreece@users.noreply.github.com> --- pkg/tsdb/loki/api.go | 16 +- pkg/tsdb/loki/frame.go | 112 ++++++++-- pkg/tsdb/loki/frame_test.go | 114 ++++++++-- pkg/tsdb/loki/loki.go | 13 +- pkg/tsdb/loki/parse_response.go | 206 ------------------ pkg/tsdb/loki/parse_response_test.go | 183 ---------------- pkg/util/converter/prom.go | 34 ++- .../testdata/loki-streams-a-frame.json | 42 ++-- .../testdata/loki-streams-a-golden.txt | 26 +-- .../testdata/loki-streams-b-frame.json | 40 ++-- .../testdata/loki-streams-b-golden.txt | 24 +- .../converter/testdata/prom-matrix-frame.json | 8 +- .../converter/testdata/prom-matrix-golden.txt | 40 ++-- .../converter/testdata/prom-vector-frame.json | 8 +- .../converter/testdata/prom-vector-golden.txt | 32 +-- .../loki/backendResultTransformer.test.ts | 2 +- 16 files changed, 348 insertions(+), 552 deletions(-) delete mode 100644 pkg/tsdb/loki/parse_response.go delete mode 100644 pkg/tsdb/loki/parse_response_test.go diff --git a/pkg/tsdb/loki/api.go b/pkg/tsdb/loki/api.go index d1d1eb6f813..bca3eec28c6 100644 --- a/pkg/tsdb/loki/api.go +++ b/pkg/tsdb/loki/api.go @@ -10,8 +10,9 @@ import ( "net/url" "strconv" + "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana/pkg/infra/log" - "github.com/grafana/loki/pkg/loghttp" + "github.com/grafana/grafana/pkg/util/converter" jsoniter "github.com/json-iterator/go" ) @@ -135,7 +136,7 @@ func makeLokiError(body io.ReadCloser) error { return fmt.Errorf("%v", errorMessage) } -func (api *LokiAPI) DataQuery(ctx context.Context, query lokiQuery) (*loghttp.QueryResponse, error) { +func (api *LokiAPI) DataQuery(ctx context.Context, query lokiQuery) (data.Frames, error) { req, err := makeDataRequest(ctx, api.url, query) if err != nil { return nil, err @@ -156,13 +157,14 @@ func (api *LokiAPI) DataQuery(ctx context.Context, query lokiQuery) (*loghttp.Qu return nil, makeLokiError(resp.Body) } - var response loghttp.QueryResponse - err = jsoniter.NewDecoder(resp.Body).Decode(&response) - if err != nil { - return nil, err + iter := jsoniter.Parse(jsoniter.ConfigDefault, resp.Body, 1024) + res := converter.ReadPrometheusStyleResult(iter) + + if res.Error != nil { + return nil, res.Error } - return &response, nil + return res.Frames, nil } func makeRawRequest(ctx context.Context, lokiDsUrl string, resourceURL string) (*http.Request, error) { diff --git a/pkg/tsdb/loki/frame.go b/pkg/tsdb/loki/frame.go index ebfe4247ee1..10affc4dede 100644 --- a/pkg/tsdb/loki/frame.go +++ b/pkg/tsdb/loki/frame.go @@ -6,7 +6,6 @@ import ( "hash/fnv" "sort" "strings" - "time" "github.com/grafana/grafana-plugin-sdk-go/data" ) @@ -57,6 +56,9 @@ func adjustMetricFrame(frame *data.Frame, query *lokiQuery) error { frame.Meta = &data.FrameMeta{} } + frame.Meta.Stats = parseStats(frame.Meta.Custom) + frame.Meta.Custom = nil + if isMetricRange { frame.Meta.ExecutedQueryString = "Expr: " + query.Expr + "\n" + "Step: " + query.Step.String() } else { @@ -81,53 +83,55 @@ func adjustMetricFrame(frame *data.Frame, query *lokiQuery) error { func adjustLogsFrame(frame *data.Frame, query *lokiQuery) error { // we check if the fields are of correct type and length fields := frame.Fields - if len(fields) != 3 { + if len(fields) != 4 { return fmt.Errorf("invalid fields in logs frame") } labelsField := fields[0] timeField := fields[1] lineField := fields[2] + stringTimeField := fields[3] - if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeJSON) { + if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeJSON) || (stringTimeField.Type() != data.FieldTypeString) { return fmt.Errorf("invalid fields in logs frame") } - if (timeField.Len() != lineField.Len()) || (timeField.Len() != labelsField.Len()) { + if (timeField.Len() != lineField.Len()) || (timeField.Len() != labelsField.Len()) || (timeField.Len() != stringTimeField.Len()) { return fmt.Errorf("invalid fields in logs frame") } + // this returns an error when the length of fields do not match + _, err := frame.RowLen() + if err != nil { + return err + } + + labelsField.Name = "labels" + stringTimeField.Name = "tsNs" + if frame.Meta == nil { frame.Meta = &data.FrameMeta{} } + frame.Meta.Stats = parseStats(frame.Meta.Custom) + frame.Meta.Custom = nil + frame.Meta.ExecutedQueryString = "Expr: " + query.Expr // we need to send to the browser the nanosecond-precision timestamp too. // usually timestamps become javascript-date-objects in the browser automatically, which only // have millisecond-precision. - // so we send a separate timestamp-as-string field too. - stringTimeField := makeStringTimeField(timeField) + // so we send a separate timestamp-as-string field too. it is provided by the + // loki-json-parser-code idField, err := makeIdField(stringTimeField, lineField, labelsField, frame.RefID) if err != nil { return err } - frame.Fields = append(frame.Fields, stringTimeField, idField) + frame.Fields = append(frame.Fields, idField) return nil } -func makeStringTimeField(timeField *data.Field) *data.Field { - length := timeField.Len() - stringTimestamps := make([]string, length) - - for i := 0; i < length; i++ { - nsNumber := timeField.At(i).(time.Time).UnixNano() - stringTimestamps[i] = fmt.Sprintf("%d", nsNumber) - } - return data.NewField("tsNs", timeField.Labels.Copy(), stringTimestamps) -} - func calculateCheckSum(time string, line string, labels []byte) (string, error) { input := []byte(line + "_") input = append(input, labels...) @@ -211,3 +215,75 @@ func getFrameLabels(frame *data.Frame) map[string]string { return labels } + +func parseStats(frameMetaCustom interface{}) []data.QueryStat { + customMap, ok := frameMetaCustom.(map[string]interface{}) + if !ok { + return nil + } + rawStats, ok := customMap["stats"].(map[string]interface{}) + if !ok { + return nil + } + + var stats []data.QueryStat + + summary, ok := rawStats["summary"].(map[string]interface{}) + if ok { + stats = append(stats, + makeStat("Summary: bytes processed per second", summary["bytesProcessedPerSecond"], "Bps"), + makeStat("Summary: lines processed per second", summary["linesProcessedPerSecond"], ""), + makeStat("Summary: total bytes processed", summary["totalBytesProcessed"], "decbytes"), + makeStat("Summary: total lines processed", summary["totalLinesProcessed"], ""), + makeStat("Summary: exec time", summary["execTime"], "s")) + } + + store, ok := rawStats["store"].(map[string]interface{}) + if ok { + stats = append(stats, + makeStat("Store: total chunks ref", store["totalChunksRef"], ""), + makeStat("Store: total chunks downloaded", store["totalChunksDownloaded"], ""), + makeStat("Store: chunks download time", store["chunksDownloadTime"], "s"), + makeStat("Store: head chunk bytes", store["headChunkBytes"], "decbytes"), + makeStat("Store: head chunk lines", store["headChunkLines"], ""), + makeStat("Store: decompressed bytes", store["decompressedBytes"], "decbytes"), + makeStat("Store: decompressed lines", store["decompressedLines"], ""), + makeStat("Store: compressed bytes", store["compressedBytes"], "decbytes"), + makeStat("Store: total duplicates", store["totalDuplicates"], "")) + } + + ingester, ok := rawStats["ingester"].(map[string]interface{}) + if ok { + stats = append(stats, + makeStat("Ingester: total reached", ingester["totalReached"], ""), + makeStat("Ingester: total chunks matched", ingester["totalChunksMatched"], ""), + makeStat("Ingester: total batches", ingester["totalBatches"], ""), + makeStat("Ingester: total lines sent", ingester["totalLinesSent"], ""), + makeStat("Ingester: head chunk bytes", ingester["headChunkBytes"], "decbytes"), + makeStat("Ingester: head chunk lines", ingester["headChunkLines"], ""), + makeStat("Ingester: decompressed bytes", ingester["decompressedBytes"], "decbytes"), + makeStat("Ingester: decompressed lines", ingester["decompressedLines"], ""), + makeStat("Ingester: compressed bytes", ingester["compressedBytes"], "decbytes"), + makeStat("Ingester: total duplicates", ingester["totalDuplicates"], "")) + } + + return stats +} + +func makeStat(name string, interfaceValue interface{}, unit string) data.QueryStat { + var value float64 + switch v := interfaceValue.(type) { + case float64: + value = v + case int: + value = float64(v) + } + + return data.QueryStat{ + FieldConfig: data.FieldConfig{ + DisplayName: name, + Unit: unit, + }, + Value: value, + } +} diff --git a/pkg/tsdb/loki/frame_test.go b/pkg/tsdb/loki/frame_test.go index f4da77bb71a..430db3b1330 100644 --- a/pkg/tsdb/loki/frame_test.go +++ b/pkg/tsdb/loki/frame_test.go @@ -2,6 +2,7 @@ package loki import ( "encoding/json" + "strconv" "testing" "time" @@ -39,20 +40,30 @@ func TestFormatName(t *testing.T) { func TestAdjustFrame(t *testing.T) { t.Run("logs-frame metadata should be set correctly", func(t *testing.T) { + time1 := time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC) + time2 := time.Date(2022, 1, 2, 3, 5, 5, 6, time.UTC) + time3 := time.Date(2022, 1, 2, 3, 5, 5, 6, time.UTC) + time4 := time.Date(2022, 1, 2, 3, 6, 5, 6, time.UTC) + + timeNs1 := strconv.FormatInt(time1.UnixNano(), 10) + timeNs2 := strconv.FormatInt(time2.UnixNano(), 10) + timeNs3 := strconv.FormatInt(time3.UnixNano(), 10) + timeNs4 := strconv.FormatInt(time4.UnixNano(), 10) + frame := data.NewFrame("", - data.NewField("labels", nil, []json.RawMessage{ + data.NewField("__labels", nil, []json.RawMessage{ json.RawMessage(`{"level":"info"}`), json.RawMessage(`{"level":"error"}`), json.RawMessage(`{"level":"error"}`), json.RawMessage(`{"level":"info"}`), }), - data.NewField("time", nil, []time.Time{ - time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC), - time.Date(2022, 1, 2, 3, 5, 5, 6, time.UTC), - time.Date(2022, 1, 2, 3, 5, 5, 6, time.UTC), - time.Date(2022, 1, 2, 3, 6, 5, 6, time.UTC), + data.NewField("Time", nil, []time.Time{ + time1, time2, time3, time4, + }), + data.NewField("Line", nil, []string{"line1", "line2", "line2", "line3"}), + data.NewField("TS", nil, []string{ + timeNs1, timeNs2, timeNs3, timeNs4, }), - data.NewField("line", nil, []string{"line1", "line2", "line2", "line3"}), ) frame.RefID = "A" @@ -68,14 +79,6 @@ func TestAdjustFrame(t *testing.T) { fields := frame.Fields require.Equal(t, 5, len(fields)) - tsNsField := fields[3] - require.Equal(t, "tsNs", tsNsField.Name) - require.Equal(t, data.FieldTypeString, tsNsField.Type()) - require.Equal(t, 4, tsNsField.Len()) - require.Equal(t, "1641092645000000006", tsNsField.At(0)) - require.Equal(t, "1641092705000000006", tsNsField.At(1)) - require.Equal(t, "1641092705000000006", tsNsField.At(2)) - require.Equal(t, "1641092765000000006", tsNsField.At(3)) idField := fields[4] require.Equal(t, "id", idField.Name) @@ -136,4 +139,85 @@ func TestAdjustFrame(t *testing.T) { require.NotNil(t, timeFieldConfig) require.Equal(t, float64(42000), timeFieldConfig.Interval) }) + + t.Run("should parse response stats", func(t *testing.T) { + stats := map[string]interface{}{ + "summary": map[string]interface{}{ + "bytesProcessedPerSecond": 1, + "linesProcessedPerSecond": 2, + "totalBytesProcessed": 3, + "totalLinesProcessed": 4, + "execTime": 5.5, + }, + + "store": map[string]interface{}{ + "totalChunksRef": 6, + "totalChunksDownloaded": 7, + "chunksDownloadTime": 8.8, + "headChunkBytes": 9, + "headChunkLines": 10, + "decompressedBytes": 11, + "decompressedLines": 12, + "compressedBytes": 13, + "totalDuplicates": 14, + }, + + "ingester": map[string]interface{}{ + "totalReached": 15, + "totalChunksMatched": 16, + "totalBatches": 17, + "totalLinesSent": 18, + "headChunkBytes": 19, + "headChunkLines": 20, + "decompressedBytes": 21, + "decompressedLines": 22, + "compressedBytes": 23, + "totalDuplicates": 24, + }, + } + + meta := data.FrameMeta{ + Custom: map[string]interface{}{ + "stats": stats, + }, + } + + expected := []data.QueryStat{ + {FieldConfig: data.FieldConfig{DisplayName: "Summary: bytes processed per second", Unit: "Bps"}, Value: 1}, + {FieldConfig: data.FieldConfig{DisplayName: "Summary: lines processed per second", Unit: ""}, Value: 2}, + {FieldConfig: data.FieldConfig{DisplayName: "Summary: total bytes processed", Unit: "decbytes"}, Value: 3}, + {FieldConfig: data.FieldConfig{DisplayName: "Summary: total lines processed", Unit: ""}, Value: 4}, + {FieldConfig: data.FieldConfig{DisplayName: "Summary: exec time", Unit: "s"}, Value: 5.5}, + + {FieldConfig: data.FieldConfig{DisplayName: "Store: total chunks ref", Unit: ""}, Value: 6}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: total chunks downloaded", Unit: ""}, Value: 7}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: chunks download time", Unit: "s"}, Value: 8.8}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: head chunk bytes", Unit: "decbytes"}, Value: 9}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: head chunk lines", Unit: ""}, Value: 10}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: decompressed bytes", Unit: "decbytes"}, Value: 11}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: decompressed lines", Unit: ""}, Value: 12}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: compressed bytes", Unit: "decbytes"}, Value: 13}, + {FieldConfig: data.FieldConfig{DisplayName: "Store: total duplicates", Unit: ""}, Value: 14}, + + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total reached", Unit: ""}, Value: 15}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total chunks matched", Unit: ""}, Value: 16}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total batches", Unit: ""}, Value: 17}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total lines sent", Unit: ""}, Value: 18}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: head chunk bytes", Unit: "decbytes"}, Value: 19}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: head chunk lines", Unit: ""}, Value: 20}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: decompressed bytes", Unit: "decbytes"}, Value: 21}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: decompressed lines", Unit: ""}, Value: 22}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: compressed bytes", Unit: "decbytes"}, Value: 23}, + {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total duplicates", Unit: ""}, Value: 24}, + } + + result := parseStats(meta.Custom) + + // NOTE: i compare it item-by-item otherwise the test-fail-error-message is very hard to read + require.Len(t, result, len(expected)) + + for i := 0; i < len(result); i++ { + require.Equal(t, expected[i], result[i]) + } + }) } diff --git a/pkg/tsdb/loki/loki.go b/pkg/tsdb/loki/loki.go index 4404d86d961..e8b0b1f9484 100644 --- a/pkg/tsdb/loki/loki.go +++ b/pkg/tsdb/loki/loki.go @@ -166,12 +166,21 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) // we extracted this part of the functionality to make it easy to unit-test it func runQuery(ctx context.Context, api *LokiAPI, query *lokiQuery) (data.Frames, error) { - value, err := api.DataQuery(ctx, *query) + frames, err := api.DataQuery(ctx, *query) if err != nil { return data.Frames{}, err } - return parseResponse(value, query) + for _, frame := range frames { + if err = adjustFrame(frame, query); err != nil { + return data.Frames{}, err + } + if err != nil { + return data.Frames{}, err + } + } + + return frames, nil } func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { diff --git a/pkg/tsdb/loki/parse_response.go b/pkg/tsdb/loki/parse_response.go deleted file mode 100644 index 4665709912e..00000000000 --- a/pkg/tsdb/loki/parse_response.go +++ /dev/null @@ -1,206 +0,0 @@ -package loki - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/grafana/loki/pkg/loghttp" - "github.com/grafana/loki/pkg/logqlmodel/stats" - jsoniter "github.com/json-iterator/go" -) - -func parseResponse(value *loghttp.QueryResponse, query *lokiQuery) (data.Frames, error) { - frames, err := lokiResponseToDataFrames(value, query) - - if err != nil { - return nil, err - } - - for _, frame := range frames { - err = adjustFrame(frame, query) - if err != nil { - return nil, err - } - } - - return frames, nil -} - -func lokiResponseToDataFrames(value *loghttp.QueryResponse, query *lokiQuery) (data.Frames, error) { - stats := parseStats(value.Data.Statistics) - switch res := value.Data.Result.(type) { - case loghttp.Matrix: - return lokiMatrixToDataFrames(res, query, stats), nil - case loghttp.Vector: - return lokiVectorToDataFrames(res, query, stats), nil - case loghttp.Streams: - return lokiStreamsToDataFrames(res, query, stats) - default: - return nil, fmt.Errorf("resultType %T not supported{", res) - } -} - -func lokiMatrixToDataFrames(matrix loghttp.Matrix, query *lokiQuery, stats []data.QueryStat) data.Frames { - frames := data.Frames{} - - for i, v := range matrix { - tags := make(map[string]string, len(v.Metric)) - timeVector := make([]time.Time, 0, len(v.Values)) - values := make([]float64, 0, len(v.Values)) - - for k, v := range v.Metric { - tags[string(k)] = string(v) - } - - for _, k := range v.Values { - timeVector = append(timeVector, k.Timestamp.Time().UTC()) - values = append(values, float64(k.Value)) - } - - timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, timeVector) - valueField := data.NewField(data.TimeSeriesValueFieldName, tags, values) - - frame := data.NewFrame("", timeField, valueField) - frame.SetMeta(&data.FrameMeta{ - Type: data.FrameTypeTimeSeriesMany, - }) - - // only add the stats to the first dataframe - if i == 0 { - frame.Meta.Stats = stats - } - - frames = append(frames, frame) - } - - return frames -} - -func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery, stats []data.QueryStat) data.Frames { - frames := data.Frames{} - - for i, v := range vector { - tags := make(map[string]string, len(v.Metric)) - timeVector := []time.Time{v.Timestamp.Time().UTC()} - values := []float64{float64(v.Value)} - - for k, v := range v.Metric { - tags[string(k)] = string(v) - } - timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, timeVector) - valueField := data.NewField(data.TimeSeriesValueFieldName, tags, values) - - frame := data.NewFrame("", timeField, valueField) - frame.SetMeta(&data.FrameMeta{ - Type: data.FrameTypeTimeSeriesMany, - }) - - // only add the stats to the first dataframe - if i == 0 { - frame.Meta.Stats = stats - } - - frames = append(frames, frame) - } - - return frames -} - -// we serialize the labels as an ordered list of pairs -func labelsToRawJson(labels data.Labels) (json.RawMessage, error) { - // data.Labels when converted to JSON keep the fields sorted - bytes, err := jsoniter.Marshal(labels) - if err != nil { - return nil, err - } - - return json.RawMessage(bytes), nil -} - -func lokiStreamsToDataFrames(streams loghttp.Streams, query *lokiQuery, stats []data.QueryStat) (data.Frames, error) { - var timeVector []time.Time - var values []string - var labelsVector []json.RawMessage - - for _, v := range streams { - labelsJson, err := labelsToRawJson(v.Labels.Map()) - if err != nil { - return nil, err - } - - for _, k := range v.Entries { - timeVector = append(timeVector, k.Timestamp.UTC()) - values = append(values, k.Line) - labelsVector = append(labelsVector, labelsJson) - } - } - - timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, timeVector) - valueField := data.NewField("Line", nil, values) - labelsField := data.NewField("labels", nil, labelsVector) - - frame := data.NewFrame("", labelsField, timeField, valueField) - frame.SetMeta(&data.FrameMeta{ - Stats: stats, - }) - - return data.Frames{frame}, nil -} - -func parseStats(result stats.Result) []data.QueryStat { - data := []data.QueryStat{ - makeStat("Summary: bytes processed per second", float64(result.Summary.BytesProcessedPerSecond), "Bps"), - makeStat("Summary: lines processed per second", float64(result.Summary.LinesProcessedPerSecond), ""), - makeStat("Summary: total bytes processed", float64(result.Summary.TotalBytesProcessed), "decbytes"), - makeStat("Summary: total lines processed", float64(result.Summary.TotalLinesProcessed), ""), - makeStat("Summary: exec time", result.Summary.ExecTime, "s"), - makeStat("Store: total chunks ref", float64(result.Store.TotalChunksRef), ""), - makeStat("Store: total chunks downloaded", float64(result.Store.TotalChunksDownloaded), ""), - makeStat("Store: chunks download time", result.Store.ChunksDownloadTime, "s"), - makeStat("Store: head chunk bytes", float64(result.Store.HeadChunkBytes), "decbytes"), - makeStat("Store: head chunk lines", float64(result.Store.HeadChunkLines), ""), - makeStat("Store: decompressed bytes", float64(result.Store.DecompressedBytes), "decbytes"), - makeStat("Store: decompressed lines", float64(result.Store.DecompressedLines), ""), - makeStat("Store: compressed bytes", float64(result.Store.CompressedBytes), "decbytes"), - makeStat("Store: total duplicates", float64(result.Store.TotalDuplicates), ""), - makeStat("Ingester: total reached", float64(result.Ingester.TotalReached), ""), - makeStat("Ingester: total chunks matched", float64(result.Ingester.TotalChunksMatched), ""), - makeStat("Ingester: total batches", float64(result.Ingester.TotalBatches), ""), - makeStat("Ingester: total lines sent", float64(result.Ingester.TotalLinesSent), ""), - makeStat("Ingester: head chunk bytes", float64(result.Ingester.HeadChunkBytes), "decbytes"), - makeStat("Ingester: head chunk lines", float64(result.Ingester.HeadChunkLines), ""), - makeStat("Ingester: decompressed bytes", float64(result.Ingester.DecompressedBytes), "decbytes"), - makeStat("Ingester: decompressed lines", float64(result.Ingester.DecompressedLines), ""), - makeStat("Ingester: compressed bytes", float64(result.Ingester.CompressedBytes), "decbytes"), - makeStat("Ingester: total duplicates", float64(result.Ingester.TotalDuplicates), ""), - } - - // it is not possible to know whether the given statistics was missing, or - // it's value was zero. - // we do a heuristic here, if every stat-value is zero, we assume we got no stats-data - allStatsZero := true - for _, stat := range data { - if stat.Value > 0 { - allStatsZero = false - break - } - } - - if allStatsZero { - return nil - } - - return data -} - -func makeStat(name string, value float64, unit string) data.QueryStat { - return data.QueryStat{ - FieldConfig: data.FieldConfig{ - DisplayName: name, - Unit: unit, - }, - Value: value, - } -} diff --git a/pkg/tsdb/loki/parse_response_test.go b/pkg/tsdb/loki/parse_response_test.go deleted file mode 100644 index 07166a45bbd..00000000000 --- a/pkg/tsdb/loki/parse_response_test.go +++ /dev/null @@ -1,183 +0,0 @@ -package loki - -import ( - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/grafana/loki/pkg/loghttp" - "github.com/grafana/loki/pkg/logqlmodel/stats" - p "github.com/prometheus/common/model" - "github.com/stretchr/testify/require" -) - -func TestParseResponse(t *testing.T) { - t.Run("value is not of supported type", func(t *testing.T) { - value := loghttp.QueryResponse{ - Data: loghttp.QueryResponseData{ - Result: loghttp.Scalar{}, - }, - } - res, err := parseResponse(&value, nil) - require.Equal(t, len(res), 0) - require.Error(t, err) - }) - - t.Run("response should be parsed normally", func(t *testing.T) { - values := []p.SamplePair{ - {Value: 1, Timestamp: 1000}, - {Value: 2, Timestamp: 2000}, - {Value: 3, Timestamp: 3000}, - {Value: 4, Timestamp: 4000}, - {Value: 5, Timestamp: 5000}, - } - value := loghttp.QueryResponse{ - Data: loghttp.QueryResponseData{ - Result: loghttp.Matrix{ - p.SampleStream{ - Metric: p.Metric{"app": "Application", "tag2": "tag2"}, - Values: values, - }, - }, - }, - } - - query := &lokiQuery{ - Expr: "up(ALERTS)", - QueryType: QueryTypeRange, - LegendFormat: "legend {{app}}", - Step: time.Second * 42, - } - frame, err := parseResponse(&value, query) - require.NoError(t, err) - - labels, err := data.LabelsFromString("app=Application, tag2=tag2") - require.NoError(t, err) - field1 := data.NewField("Time", nil, []time.Time{ - time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - time.Date(1970, 1, 1, 0, 0, 2, 0, time.UTC), - time.Date(1970, 1, 1, 0, 0, 3, 0, time.UTC), - time.Date(1970, 1, 1, 0, 0, 4, 0, time.UTC), - time.Date(1970, 1, 1, 0, 0, 5, 0, time.UTC), - }) - field1.Config = &data.FieldConfig{Interval: float64(42000)} - field2 := data.NewField("Value", labels, []float64{1, 2, 3, 4, 5}) - field2.SetConfig(&data.FieldConfig{DisplayNameFromDS: "legend Application"}) - testFrame := data.NewFrame("legend Application", field1, field2) - testFrame.SetMeta(&data.FrameMeta{ - ExecutedQueryString: "Expr: up(ALERTS)\nStep: 42s", - Type: data.FrameTypeTimeSeriesMany, - }) - - if diff := cmp.Diff(testFrame, frame[0], data.FrameTestCompareOptions()...); diff != "" { - t.Errorf("Result mismatch (-want +got):\n%s", diff) - } - }) - - t.Run("should set interval-attribute in response", func(t *testing.T) { - values := []p.SamplePair{ - {Value: 1, Timestamp: 1000}, - } - value := loghttp.QueryResponse{ - Data: loghttp.QueryResponseData{ - Result: loghttp.Matrix{ - p.SampleStream{ - Values: values, - }, - }, - }, - } - - query := &lokiQuery{ - Step: time.Second * 42, - QueryType: QueryTypeRange, - } - - frames, err := parseResponse(&value, query) - require.NoError(t, err) - - // to keep the test simple, we assume the - // first field is the time-field - timeField := frames[0].Fields[0] - require.NotNil(t, timeField) - require.Equal(t, data.FieldTypeTime, timeField.Type()) - - timeFieldConfig := timeField.Config - require.NotNil(t, timeFieldConfig) - require.Equal(t, float64(42000), timeFieldConfig.Interval) - }) - - t.Run("should parse response stats", func(t *testing.T) { - stats := stats.Result{ - Summary: stats.Summary{ - BytesProcessedPerSecond: 1, - LinesProcessedPerSecond: 2, - TotalBytesProcessed: 3, - TotalLinesProcessed: 4, - ExecTime: 5.5, - }, - Store: stats.Store{ - TotalChunksRef: 6, - TotalChunksDownloaded: 7, - ChunksDownloadTime: 8.8, - HeadChunkBytes: 9, - HeadChunkLines: 10, - DecompressedBytes: 11, - DecompressedLines: 12, - CompressedBytes: 13, - TotalDuplicates: 14, - }, - Ingester: stats.Ingester{ - TotalReached: 15, - TotalChunksMatched: 16, - TotalBatches: 17, - TotalLinesSent: 18, - HeadChunkBytes: 19, - HeadChunkLines: 20, - DecompressedBytes: 21, - DecompressedLines: 22, - CompressedBytes: 23, - TotalDuplicates: 24, - }, - } - - expected := []data.QueryStat{ - {FieldConfig: data.FieldConfig{DisplayName: "Summary: bytes processed per second", Unit: "Bps"}, Value: 1}, - {FieldConfig: data.FieldConfig{DisplayName: "Summary: lines processed per second", Unit: ""}, Value: 2}, - {FieldConfig: data.FieldConfig{DisplayName: "Summary: total bytes processed", Unit: "decbytes"}, Value: 3}, - {FieldConfig: data.FieldConfig{DisplayName: "Summary: total lines processed", Unit: ""}, Value: 4}, - {FieldConfig: data.FieldConfig{DisplayName: "Summary: exec time", Unit: "s"}, Value: 5.5}, - - {FieldConfig: data.FieldConfig{DisplayName: "Store: total chunks ref", Unit: ""}, Value: 6}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: total chunks downloaded", Unit: ""}, Value: 7}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: chunks download time", Unit: "s"}, Value: 8.8}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: head chunk bytes", Unit: "decbytes"}, Value: 9}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: head chunk lines", Unit: ""}, Value: 10}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: decompressed bytes", Unit: "decbytes"}, Value: 11}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: decompressed lines", Unit: ""}, Value: 12}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: compressed bytes", Unit: "decbytes"}, Value: 13}, - {FieldConfig: data.FieldConfig{DisplayName: "Store: total duplicates", Unit: ""}, Value: 14}, - - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total reached", Unit: ""}, Value: 15}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total chunks matched", Unit: ""}, Value: 16}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total batches", Unit: ""}, Value: 17}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total lines sent", Unit: ""}, Value: 18}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: head chunk bytes", Unit: "decbytes"}, Value: 19}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: head chunk lines", Unit: ""}, Value: 20}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: decompressed bytes", Unit: "decbytes"}, Value: 21}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: decompressed lines", Unit: ""}, Value: 22}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: compressed bytes", Unit: "decbytes"}, Value: 23}, - {FieldConfig: data.FieldConfig{DisplayName: "Ingester: total duplicates", Unit: ""}, Value: 24}, - } - - result := parseStats((stats)) - - // NOTE: i compare it item-by-item otherwise the test-fail-error-message is very hard to read - require.Len(t, result, len(expected)) - - for i := 0; i < len(result); i++ { - require.Equal(t, expected[i], result[i]) - } - }) -} diff --git a/pkg/util/converter/prom.go b/pkg/util/converter/prom.go index 43a7ff3e964..dcde552106c 100644 --- a/pkg/util/converter/prom.go +++ b/pkg/util/converter/prom.go @@ -1,6 +1,7 @@ package converter import ( + "encoding/json" "fmt" "strconv" "time" @@ -349,6 +350,7 @@ func readMatrixOrVector(iter *jsoniter.Iterator) *backend.DataResponse { timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeField.Name = data.TimeSeriesTimeFieldName valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0) + valueField.Name = data.TimeSeriesValueFieldName valueField.Labels = data.Labels{} for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { @@ -375,14 +377,6 @@ func readMatrixOrVector(iter *jsoniter.Iterator) *backend.DataResponse { } } - 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, @@ -408,7 +402,7 @@ func readTimeValuePair(iter *jsoniter.Iterator) (time.Time, float64, error) { func readStream(iter *jsoniter.Iterator) *backend.DataResponse { rsp := &backend.DataResponse{} - labelsField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + labelsField := data.NewFieldFromFieldType(data.FieldTypeJSON, 0) labelsField.Name = "__labels" // avoid automatically spreading this by labels timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) @@ -422,14 +416,20 @@ func readStream(iter *jsoniter.Iterator) *backend.DataResponse { tsField.Name = "TS" labels := data.Labels{} - labelString := labels.String() + labelJson, err := labelsToRawJson(labels) + if err != nil { + return &backend.DataResponse{Error: err} + } for iter.ReadArray() { for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() { switch l1Field { case "stream": iter.ReadVal(&labels) - labelString = labels.String() + labelJson, err = labelsToRawJson(labels) + if err != nil { + return &backend.DataResponse{Error: err} + } case "values": for iter.ReadArray() { @@ -441,7 +441,7 @@ func readStream(iter *jsoniter.Iterator) *backend.DataResponse { t := timeFromLokiString(ts) - labelsField.Append(labelString) + labelsField.Append(labelJson) timeField.Append(t) lineField.Append(line) tsField.Append(ts) @@ -477,3 +477,13 @@ func timeFromLokiString(str string) time.Time { ns, _ := strconv.ParseInt(str[10:], 10, 64) return time.Unix(ss, ns).UTC() } + +func labelsToRawJson(labels data.Labels) (json.RawMessage, error) { + // data.Labels when converted to JSON keep the fields sorted + bytes, err := jsoniter.Marshal(labels) + if err != nil { + return nil, err + } + + return json.RawMessage(bytes), nil +} diff --git a/pkg/util/converter/testdata/loki-streams-a-frame.json b/pkg/util/converter/testdata/loki-streams-a-frame.json index bd5df94989e..622d46826a1 100644 --- a/pkg/util/converter/testdata/loki-streams-a-frame.json +++ b/pkg/util/converter/testdata/loki-streams-a-frame.json @@ -5,17 +5,28 @@ "meta": { "custom": { "stats": { - "ingester": { - "totalChunksMatched": 0, - "totalBatches": 0, - "totalLinesSent": 0, + "store": { "headChunkBytes": 0, "headChunkLines": 0, + "compressedBytes": 31432, + "decompressedBytes": 7772, + "decompressedLines": 55, + "totalDuplicates": 0, + "totalChunksRef": 2, + "totalChunksDownloaded": 2, + "chunksDownloadTime": 0.000390958 + }, + "ingester": { + "totalReached": 0, + "headChunkBytes": 0, + "totalDuplicates": 0, + "headChunkLines": 0, + "decompressedBytes": 0, "decompressedLines": 0, "compressedBytes": 0, - "totalReached": 0, - "totalDuplicates": 0, - "decompressedBytes": 0 + "totalChunksMatched": 0, + "totalBatches": 0, + "totalLinesSent": 0 }, "summary": { "bytesProcessedPerSecond": 3507022, @@ -23,17 +34,6 @@ "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 } } } @@ -41,9 +41,9 @@ "fields": [ { "name": "__labels", - "type": "string", + "type": "other", "typeInfo": { - "frame": "string" + "frame": "json.RawMessage" } }, { @@ -72,7 +72,7 @@ "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🌙" + {"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 diff --git a/pkg/util/converter/testdata/loki-streams-a-golden.txt b/pkg/util/converter/testdata/loki-streams-a-golden.txt index 727f13947ae..9d1fdaa4caf 100644 --- a/pkg/util/converter/testdata/loki-streams-a-golden.txt +++ b/pkg/util/converter/testdata/loki-streams-a-golden.txt @@ -38,19 +38,19 @@ Frame[0] { } 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 | -+------------------------------+-----------------------------------------+------------------+---------------------+ ++---------------------------------------+-----------------------------------------+------------------+---------------------+ +| Name: __labels | Name: Time | Name: Line | Name: TS | +| Labels: | Labels: | Labels: | Labels: | +| Type: []json.RawMessage | 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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 +FRAME=QVJST1cxAAD/////oAQAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANACAAADAAAATAAAACgAAAAEAAAA9Pv//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAU/P//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAADT8//8IAAAAaAIAAFwCAAB7ImN1c3RvbSI6eyJzdGF0cyI6eyJpbmdlc3RlciI6eyJjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZEJ5dGVzIjowLCJkZWNvbXByZXNzZWRMaW5lcyI6MCwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbEJhdGNoZXMiOjAsInRvdGFsQ2h1bmtzTWF0Y2hlZCI6MCwidG90YWxEdXBsaWNhdGVzIjowLCJ0b3RhbExpbmVzU2VudCI6MCwidG90YWxSZWFjaGVkIjowfSwic3RvcmUiOnsiY2h1bmtzRG93bmxvYWRUaW1lIjowLjAwMDM5MDk1OCwiY29tcHJlc3NlZEJ5dGVzIjozMTQzMiwiZGVjb21wcmVzc2VkQnl0ZXMiOjc3NzIsImRlY29tcHJlc3NlZExpbmVzIjo1NSwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbENodW5rc0Rvd25sb2FkZWQiOjIsInRvdGFsQ2h1bmtzUmVmIjoyLCJ0b3RhbER1cGxpY2F0ZXMiOjB9LCJzdW1tYXJ5Ijp7ImJ5dGVzUHJvY2Vzc2VkUGVyU2Vjb25kIjozNTA3MDIyLCJleGVjVGltZSI6MC4wMDIyMTYxMjUsImxpbmVzUHJvY2Vzc2VkUGVyU2Vjb25kIjoyNDgxOCwidG90YWxCeXRlc1Byb2Nlc3NlZCI6Nzc3MiwidG90YWxMaW5lc1Byb2Nlc3NlZCI6NTV9fX19AAAAAAQAAABtZXRhAAAAAAQAAAAsAQAAtAAAAFgAAAAEAAAA9v7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAADk/v//CAAAAAwAAAACAAAAVFMAAAQAAABuYW1lAAAAAAAAAADU/v//AgAAAFRTAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAo////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABEgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbGFiZWxzAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX2xhYmVscwAAAAAAAAAA/////0gBAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAABQAgAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAADIAAAABgAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAIAAAAAAAAADlAAAAAAAAAAgBAAAAAAAAAAAAAAAAAAAIAQAAAAAAADAAAAAAAAAAOAEAAAAAAAAAAAAAAAAAADgBAAAAAAAAHAAAAAAAAABYAQAAAAAAAFsAAAAAAAAAuAEAAAAAAAAAAAAAAAAAALgBAAAAAAAAHAAAAAAAAADYAQAAAAAAAHIAAAAAAAAAAAAAAAQAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAACcAAABNAAAAcwAAAJkAAAC/AAAA5QAAAAAAAAB7ImxldmVsIjoiZXJyb3IiLCJsb2NhdGlvbiI6Im1vb27wn4yZIn17ImxldmVsIjoiaW5mbyIsImxvY2F0aW9uIjoibW9vbvCfjJkifXsibGV2ZWwiOiJpbmZvIiwibG9jYXRpb24iOiJtb29u8J+MmSJ9eyJsZXZlbCI6ImluZm8iLCJsb2NhdGlvbiI6Im1vb27wn4yZIn17ImxldmVsIjoiaW5mbyIsImxvY2F0aW9uIjoibW9vbvCfjJkifXsibGV2ZWwiOiJpbmZvIiwibG9jYXRpb24iOiJtb29u8J+MmSJ9AAAAABS4ukpS1BYAetw+S1LUFgAkJhJLUtQWACQmEktS1BYApibmSlLUFgAn3I9KUtQWAAAAABAAAAAfAAAALgAAAD0AAABMAAAAWwAAAAAAAABsb2cgbGluZSBlcnJvciAxbG9nIGxpbmUgaW5mbyAxbG9nIGxpbmUgaW5mbyAybG9nIGxpbmUgaW5mbyAybG9nIGxpbmUgaW5mbyAzbG9nIGxpbmUgaW5mbyA0AAAAAAAAAAAAEwAAACYAAAA5AAAATAAAAF8AAAByAAAAAAAAADE2NDUwMzAyNDQ4MTA3NTcxMjAxNjQ1MDMwMjQ3MDI3NzM1MDQwMTY0NTAzMDI0NjI3NzU4Nzk2ODE2NDUwMzAyNDYyNzc1ODc5NjgxNjQ1MDMwMjQ1NTM5NDIzNzQ0MTY0NTAzMDI0NDA5MTcwMDk5MgAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAACwBAAAAAAAAFABAAAAAAAAUAIAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAA0AIAAAMAAABMAAAAKAAAAAQAAAD0+///CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAABT8//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAANPz//wgAAABoAgAAXAIAAHsiY3VzdG9tIjp7InN0YXRzIjp7ImluZ2VzdGVyIjp7ImNvbXByZXNzZWRCeXRlcyI6MCwiZGVjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZExpbmVzIjowLCJoZWFkQ2h1bmtCeXRlcyI6MCwiaGVhZENodW5rTGluZXMiOjAsInRvdGFsQmF0Y2hlcyI6MCwidG90YWxDaHVua3NNYXRjaGVkIjowLCJ0b3RhbER1cGxpY2F0ZXMiOjAsInRvdGFsTGluZXNTZW50IjowLCJ0b3RhbFJlYWNoZWQiOjB9LCJzdG9yZSI6eyJjaHVua3NEb3dubG9hZFRpbWUiOjAuMDAwMzkwOTU4LCJjb21wcmVzc2VkQnl0ZXMiOjMxNDMyLCJkZWNvbXByZXNzZWRCeXRlcyI6Nzc3MiwiZGVjb21wcmVzc2VkTGluZXMiOjU1LCJoZWFkQ2h1bmtCeXRlcyI6MCwiaGVhZENodW5rTGluZXMiOjAsInRvdGFsQ2h1bmtzRG93bmxvYWRlZCI6MiwidG90YWxDaHVua3NSZWYiOjIsInRvdGFsRHVwbGljYXRlcyI6MH0sInN1bW1hcnkiOnsiYnl0ZXNQcm9jZXNzZWRQZXJTZWNvbmQiOjM1MDcwMjIsImV4ZWNUaW1lIjowLjAwMjIxNjEyNSwibGluZXNQcm9jZXNzZWRQZXJTZWNvbmQiOjI0ODE4LCJ0b3RhbEJ5dGVzUHJvY2Vzc2VkIjo3NzcyLCJ0b3RhbExpbmVzUHJvY2Vzc2VkIjo1NX19fX0AAAAABAAAAG1ldGEAAAAABAAAACwBAAC0AAAAWAAAAAQAAAD2/v//FAAAADgAAAA4AAAAAAAABTQAAAABAAAABAAAAOT+//8IAAAADAAAAAIAAABUUwAABAAAAG5hbWUAAAAAAAAAANT+//8CAAAAVFMAAEb///8UAAAAPAAAADwAAAAAAAAFOAAAAAEAAAAEAAAANP///wgAAAAQAAAABAAAAExpbmUAAAAABAAAAG5hbWUAAAAAAAAAACj///8EAAAATGluZQAAAACe////FAAAADwAAABEAAAAAAAACkQAAAABAAAABAAAAIz///8IAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAASAAAAEwAAAAAAAAESAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABQAAAAIAAAAX19sYWJlbHMAAAAABAAAAG5hbWUAAAAAAAAAAAQABAAEAAAACAAAAF9fbGFiZWxzAAAAAMgEAABBUlJPVzE= diff --git a/pkg/util/converter/testdata/loki-streams-b-frame.json b/pkg/util/converter/testdata/loki-streams-b-frame.json index 28ef33d2768..7c8c7dd3610 100644 --- a/pkg/util/converter/testdata/loki-streams-b-frame.json +++ b/pkg/util/converter/testdata/loki-streams-b-frame.json @@ -6,34 +6,34 @@ "custom": { "stats": { "summary": { - "execTime": 0.002216125, "bytesProcessedPerSecond": 3507022, "linesProcessedPerSecond": 24818, "totalBytesProcessed": 7772, - "totalLinesProcessed": 55 + "totalLinesProcessed": 55, + "execTime": 0.002216125 }, "store": { - "headChunkBytes": 0, - "decompressedLines": 55, - "compressedBytes": 31432, - "totalDuplicates": 0, - "totalChunksDownloaded": 2, + "totalChunksRef": 2, "chunksDownloadTime": 0.000390958, "headChunkLines": 0, + "decompressedLines": 55, + "totalDuplicates": 0, + "totalChunksDownloaded": 2, + "headChunkBytes": 0, "decompressedBytes": 7772, - "totalChunksRef": 2 + "compressedBytes": 31432 }, "ingester": { - "headChunkBytes": 0, - "decompressedBytes": 0, - "totalBatches": 0, - "totalLinesSent": 0, - "headChunkLines": 0, - "decompressedLines": 0, - "compressedBytes": 0, - "totalDuplicates": 0, "totalReached": 0, - "totalChunksMatched": 0 + "totalChunksMatched": 0, + "totalLinesSent": 0, + "headChunkBytes": 0, + "decompressedLines": 0, + "totalBatches": 0, + "headChunkLines": 0, + "decompressedBytes": 0, + "compressedBytes": 0, + "totalDuplicates": 0 } } } @@ -41,9 +41,9 @@ "fields": [ { "name": "__labels", - "type": "string", + "type": "other", "typeInfo": { - "frame": "string" + "frame": "json.RawMessage" } }, { @@ -72,7 +72,7 @@ "data": { "values": [ [ - "level=error, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon" + {"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 diff --git a/pkg/util/converter/testdata/loki-streams-b-golden.txt b/pkg/util/converter/testdata/loki-streams-b-golden.txt index c5291a2e1a5..d8b09e5d00a 100644 --- a/pkg/util/converter/testdata/loki-streams-b-golden.txt +++ b/pkg/util/converter/testdata/loki-streams-b-golden.txt @@ -38,18 +38,18 @@ Frame[0] { } 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 | -+----------------------------+-----------------------------------------+------------------+---------------------+ ++-------------------------------------+-----------------------------------------+------------------+---------------------+ +| Name: __labels | Name: Time | Name: Line | Name: TS | +| Labels: | Labels: | Labels: | Labels: | +| Type: []json.RawMessage | 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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 +FRAME=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 diff --git a/pkg/util/converter/testdata/prom-matrix-frame.json b/pkg/util/converter/testdata/prom-matrix-frame.json index af91613cb20..11484d37e8a 100644 --- a/pkg/util/converter/testdata/prom-matrix-frame.json +++ b/pkg/util/converter/testdata/prom-matrix-frame.json @@ -14,14 +14,15 @@ } }, { - "name": "up", + "name": "Value", "type": "number", "typeInfo": { "frame": "float64" }, "labels": { "job": "prometheus", - "instance": "localhost:9090" + "instance": "localhost:9090", + "__name__": "up" } } ] @@ -51,12 +52,13 @@ } }, { - "name": "up", + "name": "Value", "type": "number", "typeInfo": { "frame": "float64" }, "labels": { + "__name__": "up", "job": "node", "instance": "localhost:9091" } diff --git a/pkg/util/converter/testdata/prom-matrix-golden.txt b/pkg/util/converter/testdata/prom-matrix-golden.txt index 83088450f9d..c9cf2dc5e93 100644 --- a/pkg/util/converter/testdata/prom-matrix-golden.txt +++ b/pkg/util/converter/testdata/prom-matrix-golden.txt @@ -5,15 +5,15 @@ Frame[0] { } 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 | -+-----------------------------------+-------------------------------------------------+ ++-----------------------------------+--------------------------------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: __name__=up, 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 | ++-----------------------------------+--------------------------------------------------------------+ @@ -22,17 +22,17 @@ Frame[1] { } 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 | -+-----------------------------------+-------------------------------------------+ ++-----------------------------------+--------------------------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: __name__=up, 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 +FRAME=QVJST1cxAAD/////CAIAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAjP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAMz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAANgAAAAEAAAAQv///xQAAACgAAAAoAAAAAAAAAOgAAAAAgAAACwAAAAEAAAANP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAWP///wgAAABMAAAAQAAAAHsiX19uYW1lX18iOiJ1cCIsImluc3RhbmNlIjoibG9jYWxob3N0OjkwOTAiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAAAAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAADAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAABAuc2smuvsE0CP3yqe6+wTQGXxqKHr7BMAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8QAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAABAABAAAAGAIAAAAAAADAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAjP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAMz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAANgAAAAEAAAAQv///xQAAACgAAAAoAAAAAAAAAOgAAAAAgAAACwAAAAEAAAANP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAWP///wgAAABMAAAAQAAAAHsiX19uYW1lX18iOiJ1cCIsImluc3RhbmNlIjoibG9jYWxob3N0OjkwOTAiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAADACAABBUlJPVzE= +FRAME=QVJST1cxAAD/////AAIAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAlP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC0/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANT+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAANAAAAAEAAAASv///xQAAACYAAAAmAAAAAAAAAOYAAAAAgAAACwAAAAEAAAAPP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAYP///wgAAABEAAAAOgAAAHsiX19uYW1lX18iOiJ1cCIsImluc3RhbmNlIjoibG9jYWxob3N0OjkwOTEiLCJqb2IiOiJub2RlIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAwAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAgAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAQLnNrJrr7BNAj98qnuvsE0Bl8aih6+wTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADgAAAAAAAQAAQAAABACAAAAAAAAwAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAACMAAAAAwAAAEwAAAAoAAAABAAAAJT+//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAAtP7//wgAAAAMAAAAAAAAAAAAAAAEAAAAbmFtZQAAAADU/v//CAAAACQAAAAaAAAAeyJ0eXBlIjoidGltZXNlcmllcy1tYW55In0AAAQAAABtZXRhAAAAAAIAAADQAAAABAAAAEr///8UAAAAmAAAAJgAAAAAAAADmAAAAAIAAAAsAAAABAAAADz///8IAAAAEAAAAAUAAABWYWx1ZQAAAAQAAABuYW1lAAAAAGD///8IAAAARAAAADoAAAB7Il9fbmFtZV9fIjoidXAiLCJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkxIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgAFAAAAVmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAKAIAAEFSUk9XMQ== diff --git a/pkg/util/converter/testdata/prom-vector-frame.json b/pkg/util/converter/testdata/prom-vector-frame.json index 8d81e0ba3ca..eaff88b9a5a 100644 --- a/pkg/util/converter/testdata/prom-vector-frame.json +++ b/pkg/util/converter/testdata/prom-vector-frame.json @@ -14,12 +14,13 @@ } }, { - "name": "up", + "name": "Value", "type": "number", "typeInfo": { "frame": "float64" }, "labels": { + "__name__": "up", "job": "prometheus", "instance": "localhost:9090" } @@ -51,14 +52,15 @@ } }, { - "name": "up", + "name": "Value", "type": "number", "typeInfo": { "frame": "float64" }, "labels": { "job": "node", - "instance": "localhost:9100" + "instance": "localhost:9100", + "__name__": "up" } } ] diff --git a/pkg/util/converter/testdata/prom-vector-golden.txt b/pkg/util/converter/testdata/prom-vector-golden.txt index a1dfe5665b5..0c4c0d3150e 100644 --- a/pkg/util/converter/testdata/prom-vector-golden.txt +++ b/pkg/util/converter/testdata/prom-vector-golden.txt @@ -5,13 +5,13 @@ Frame[0] { } 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 | -+-----------------------------------+-------------------------------------------------+ ++-----------------------------------+--------------------------------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: __name__=up, instance=localhost:9090, job=prometheus | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+--------------------------------------------------------------+ +| 2015-07-01 20:10:51.781 +0000 UTC | 1 | ++-----------------------------------+--------------------------------------------------------------+ @@ -20,13 +20,13 @@ Frame[1] { } 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 | -+-----------------------------------+-------------------------------------------+ ++-----------------------------------+--------------------------------------------------------+ +| Name: Time | Name: Value | +| Labels: | Labels: __name__=up, instance=localhost:9100, job=node | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+--------------------------------------------------------+ +| 2015-07-01 20:10:51.781 +0000 UTC | 0 | ++-----------------------------------+--------------------------------------------------------+ @@ -75,8 +75,8 @@ Dimensions: 2 Fields by 1 Rows ====== 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/////CAIAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAjP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAMz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAANgAAAAEAAAAQv///xQAAACgAAAAoAAAAAAAAAOgAAAAAgAAACwAAAAEAAAANP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAWP///wgAAABMAAAAQAAAAHsiX19uYW1lX18iOiJ1cCIsImluc3RhbmNlIjoibG9jYWxob3N0OjkwOTAiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAAAAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAABAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAABAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABAS4CQn+vsEwAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADgAAAAAAAQAAQAAABgCAAAAAAAAwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAACMAAAAAwAAAEwAAAAoAAAABAAAAIz+//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAArP7//wgAAAAMAAAAAAAAAAAAAAAEAAAAbmFtZQAAAADM/v//CAAAACQAAAAaAAAAeyJ0eXBlIjoidGltZXNlcmllcy1tYW55In0AAAQAAABtZXRhAAAAAAIAAADYAAAABAAAAEL///8UAAAAoAAAAKAAAAAAAAADoAAAAAIAAAAsAAAABAAAADT///8IAAAAEAAAAAUAAABWYWx1ZQAAAAQAAABuYW1lAAAAAFj///8IAAAATAAAAEAAAAB7Il9fbmFtZV9fIjoidXAiLCJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkwIiwiam9iIjoicHJvbWV0aGV1cyJ9AAAAAAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAwAgAAQVJST1cx +FRAME=QVJST1cxAAD/////AAIAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAlP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC0/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANT+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAANAAAAAEAAAASv///xQAAACYAAAAmAAAAAAAAAOYAAAAAgAAACwAAAAEAAAAPP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAYP///wgAAABEAAAAOgAAAHsiX19uYW1lX18iOiJ1cCIsImluc3RhbmNlIjoibG9jYWxob3N0OjkxMDAiLCJqb2IiOiJub2RlIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAQEuAkJ/r7BMAAAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAAQAgAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACU/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAALT+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA1P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAA0AAAAAQAAABK////FAAAAJgAAACYAAAAAAAAA5gAAAACAAAALAAAAAQAAAA8////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAABg////CAAAAEQAAAA6AAAAeyJfX25hbWVfXyI6InVwIiwiaW5zdGFuY2UiOiJsb2NhbGhvc3Q6OTEwMCIsImpvYiI6Im5vZGUifQAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAACgCAABBUlJPVzE= 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/public/app/plugins/datasource/loki/backendResultTransformer.test.ts b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts index 6179df79462..2d01b584b63 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts @@ -31,7 +31,7 @@ const inputFrame: DataFrame = { json: true, }, }, - values: new ArrayVector([`[["level", "info"],["code", "41🌙"]]`, `[["level", "error"],["code", "41🌙"]]`]), + values: new ArrayVector(['{ "level": "info", "code": "41🌙" }', '{ "level": "error", "code": "41🌙" }']), }, { name: 'tsNs',