From a246381879216be6399b2c21e98c2c8c210c8b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Thu, 31 Mar 2022 17:50:27 +0200 Subject: [PATCH] loki: backend-mode: add stats support (#46526) * loki: backend-mode: add stats support * refactor: rename variable --- pkg/tsdb/loki/framing_test.go | 3 + pkg/tsdb/loki/parse_response.go | 79 +++++- pkg/tsdb/loki/parse_response_test.go | 74 +++++ .../testdata/matrix_with_stats.golden.txt | 252 ++++++++++++++++++ pkg/tsdb/loki/testdata/matrix_with_stats.json | 60 +++++ .../loki/testdata/streams_simple.golden.txt | 220 ++++++++++++++- pkg/tsdb/loki/testdata/streams_simple.json | 28 +- .../loki/backendResultTransformer.test.ts | 3 + .../loki/backendResultTransformer.ts | 4 + 9 files changed, 701 insertions(+), 22 deletions(-) create mode 100644 pkg/tsdb/loki/testdata/matrix_with_stats.golden.txt create mode 100644 pkg/tsdb/loki/testdata/matrix_with_stats.json diff --git a/pkg/tsdb/loki/framing_test.go b/pkg/tsdb/loki/framing_test.go index e6c862a91e7..8cb118dd809 100644 --- a/pkg/tsdb/loki/framing_test.go +++ b/pkg/tsdb/loki/framing_test.go @@ -39,6 +39,9 @@ func TestSuccessResponse(t *testing.T) { {name: "parse a matrix response with Infinity", filepath: "matrix_inf", query: matrixQuery}, {name: "parse a matrix response with very small step value", filepath: "matrix_small_step", query: matrixQuery}, + // loki adds stats to matrix-responses too + {name: "parse a matrix response with stats", filepath: "matrix_with_stats", query: matrixQuery}, + {name: "parse a simple vector response", filepath: "vector_simple", query: vectorQuery}, {name: "parse a vector response with special values", filepath: "vector_special_values", query: vectorQuery}, diff --git a/pkg/tsdb/loki/parse_response.go b/pkg/tsdb/loki/parse_response.go index d56627b6bec..48eae74861e 100644 --- a/pkg/tsdb/loki/parse_response.go +++ b/pkg/tsdb/loki/parse_response.go @@ -6,6 +6,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/loki/pkg/loghttp" + "github.com/grafana/loki/pkg/logqlmodel/stats" ) func parseResponse(value *loghttp.QueryResponse, query *lokiQuery) (data.Frames, error) { @@ -23,19 +24,20 @@ func parseResponse(value *loghttp.QueryResponse, query *lokiQuery) (data.Frames, } 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), nil + return lokiMatrixToDataFrames(res, query, stats), nil case loghttp.Vector: - return lokiVectorToDataFrames(res, query), nil + return lokiVectorToDataFrames(res, query, stats), nil case loghttp.Streams: - return lokiStreamsToDataFrames(res, query), nil + return lokiStreamsToDataFrames(res, query, stats), nil default: return nil, fmt.Errorf("resultType %T not supported{", res) } } -func lokiMatrixToDataFrames(matrix loghttp.Matrix, query *lokiQuery) data.Frames { +func lokiMatrixToDataFrames(matrix loghttp.Matrix, query *lokiQuery, stats []data.QueryStat) data.Frames { frames := data.Frames{} for _, v := range matrix { @@ -56,6 +58,9 @@ func lokiMatrixToDataFrames(matrix loghttp.Matrix, query *lokiQuery) data.Frames valueField := data.NewField("", tags, values) frame := data.NewFrame("", timeField, valueField) + frame.SetMeta(&data.FrameMeta{ + Stats: stats, + }) frames = append(frames, frame) } @@ -63,7 +68,7 @@ func lokiMatrixToDataFrames(matrix loghttp.Matrix, query *lokiQuery) data.Frames return frames } -func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery) data.Frames { +func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery, stats []data.QueryStat) data.Frames { frames := data.Frames{} for _, v := range vector { @@ -78,6 +83,9 @@ func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery) data.Frames valueField := data.NewField("", tags, values) frame := data.NewFrame("", timeField, valueField) + frame.SetMeta(&data.FrameMeta{ + Stats: stats, + }) frames = append(frames, frame) } @@ -85,7 +93,7 @@ func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery) data.Frames return frames } -func lokiStreamsToDataFrames(streams loghttp.Streams, query *lokiQuery) data.Frames { +func lokiStreamsToDataFrames(streams loghttp.Streams, query *lokiQuery, stats []data.QueryStat) data.Frames { frames := data.Frames{} for _, v := range streams { @@ -106,9 +114,68 @@ func lokiStreamsToDataFrames(streams loghttp.Streams, query *lokiQuery) data.Fra valueField := data.NewField("", tags, values) frame := data.NewFrame("", timeField, valueField) + frame.SetMeta(&data.FrameMeta{ + Stats: stats, + }) frames = append(frames, frame) } return frames } + +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 index 7e7309e179a..9639a0e17ee 100644 --- a/pkg/tsdb/loki/parse_response_test.go +++ b/pkg/tsdb/loki/parse_response_test.go @@ -7,6 +7,7 @@ import ( "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" ) @@ -105,4 +106,77 @@ func TestParseResponse(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 := 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/tsdb/loki/testdata/matrix_with_stats.golden.txt b/pkg/tsdb/loki/testdata/matrix_with_stats.golden.txt new file mode 100644 index 00000000000..001125984d6 --- /dev/null +++ b/pkg/tsdb/loki/testdata/matrix_with_stats.golden.txt @@ -0,0 +1,252 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "stats": [ + { + "displayName": "Summary: bytes processed per second", + "unit": "Bps", + "value": 3507022 + }, + { + "displayName": "Summary: lines processed per second", + "value": 24818 + }, + { + "displayName": "Summary: total bytes processed", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Summary: total lines processed", + "value": 55 + }, + { + "displayName": "Summary: exec time", + "unit": "s", + "value": 0.002216125 + }, + { + "displayName": "Store: total chunks ref", + "value": 2 + }, + { + "displayName": "Store: total chunks downloaded", + "value": 3 + }, + { + "displayName": "Store: chunks download time", + "unit": "s", + "value": 0.000390958 + }, + { + "displayName": "Store: head chunk bytes", + "unit": "decbytes", + "value": 4 + }, + { + "displayName": "Store: head chunk lines", + "value": 5 + }, + { + "displayName": "Store: decompressed bytes", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Store: decompressed lines", + "value": 55 + }, + { + "displayName": "Store: compressed bytes", + "unit": "decbytes", + "value": 31432 + }, + { + "displayName": "Store: total duplicates", + "value": 6 + }, + { + "displayName": "Ingester: total reached", + "value": 7 + }, + { + "displayName": "Ingester: total chunks matched", + "value": 8 + }, + { + "displayName": "Ingester: total batches", + "value": 9 + }, + { + "displayName": "Ingester: total lines sent", + "value": 10 + }, + { + "displayName": "Ingester: head chunk bytes", + "unit": "decbytes", + "value": 11 + }, + { + "displayName": "Ingester: head chunk lines", + "value": 12 + }, + { + "displayName": "Ingester: decompressed bytes", + "unit": "decbytes", + "value": 13 + }, + { + "displayName": "Ingester: decompressed lines", + "value": 14 + }, + { + "displayName": "Ingester: compressed bytes", + "unit": "decbytes", + "value": 15 + }, + { + "displayName": "Ingester: total duplicates", + "value": 16 + } + ], + "executedQueryString": "Expr: up(ALERTS)\nStep: 42s" +} +Name: {level="error", location="moon"} +Dimensions: 2 Fields by 2 Rows ++-----------------------------------+------------------------------------+ +| Name: time | Name: value | +| Labels: | Labels: level=error, location=moon | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+------------------------------------+ +| 2021-12-10 08:36:06.989 +0000 UTC | 0.4 | +| 2021-12-10 08:36:46.989 +0000 UTC | 0.2 | ++-----------------------------------+------------------------------------+ + + + +Frame[1] { + "stats": [ + { + "displayName": "Summary: bytes processed per second", + "unit": "Bps", + "value": 3507022 + }, + { + "displayName": "Summary: lines processed per second", + "value": 24818 + }, + { + "displayName": "Summary: total bytes processed", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Summary: total lines processed", + "value": 55 + }, + { + "displayName": "Summary: exec time", + "unit": "s", + "value": 0.002216125 + }, + { + "displayName": "Store: total chunks ref", + "value": 2 + }, + { + "displayName": "Store: total chunks downloaded", + "value": 3 + }, + { + "displayName": "Store: chunks download time", + "unit": "s", + "value": 0.000390958 + }, + { + "displayName": "Store: head chunk bytes", + "unit": "decbytes", + "value": 4 + }, + { + "displayName": "Store: head chunk lines", + "value": 5 + }, + { + "displayName": "Store: decompressed bytes", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Store: decompressed lines", + "value": 55 + }, + { + "displayName": "Store: compressed bytes", + "unit": "decbytes", + "value": 31432 + }, + { + "displayName": "Store: total duplicates", + "value": 6 + }, + { + "displayName": "Ingester: total reached", + "value": 7 + }, + { + "displayName": "Ingester: total chunks matched", + "value": 8 + }, + { + "displayName": "Ingester: total batches", + "value": 9 + }, + { + "displayName": "Ingester: total lines sent", + "value": 10 + }, + { + "displayName": "Ingester: head chunk bytes", + "unit": "decbytes", + "value": 11 + }, + { + "displayName": "Ingester: head chunk lines", + "value": 12 + }, + { + "displayName": "Ingester: decompressed bytes", + "unit": "decbytes", + "value": 13 + }, + { + "displayName": "Ingester: decompressed lines", + "value": 14 + }, + { + "displayName": "Ingester: compressed bytes", + "unit": "decbytes", + "value": 15 + }, + { + "displayName": "Ingester: total duplicates", + "value": 16 + } + ], + "executedQueryString": "Expr: up(ALERTS)\nStep: 42s" +} +Name: {level="info", location="mars"} +Dimensions: 2 Fields by 2 Rows ++-----------------------------------+-----------------------------------+ +| Name: time | Name: value | +| Labels: | Labels: level=info, location=mars | +| Type: []time.Time | Type: []float64 | ++-----------------------------------+-----------------------------------+ +| 2021-12-10 08:36:26.989 +0000 UTC | 0.6 | +| 2021-12-10 08:36:36.989 +0000 UTC | 0.8 | ++-----------------------------------+-----------------------------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////wAgAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANQGAAADAAAAbAAAACgAAAAEAAAA3Pf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAD89///CAAAACwAAAAgAAAAe2xldmVsPSJlcnJvciIsIGxvY2F0aW9uPSJtb29uIn0AAAAABAAAAG5hbWUAAAAAPPj//wgAAABMBgAAQQYAAHsic3RhdHMiOlt7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogYnl0ZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ1bml0IjoiQnBzIiwidmFsdWUiOjM1MDcwMjJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBsaW5lcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInZhbHVlIjoyNDgxOH0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGJ5dGVzIHByb2Nlc3NlZCIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgbGluZXMgcHJvY2Vzc2VkIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogZXhlYyB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDIyMTYxMjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIHJlZiIsInZhbHVlIjoyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyBkb3dubG9hZGVkIiwidmFsdWUiOjN9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY2h1bmtzIGRvd25sb2FkIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMDM5MDk1OH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHVwKEFMRVJUUylcblN0ZXA6IDQycyJ9AAAABAAAAG1ldGEAAAAAAgAAABgBAAAEAAAAAv///xQAAADgAAAA4AAAAAAAAAPgAAAAAwAAAHAAAAAsAAAABAAAAND+//8IAAAAEAAAAAUAAAB2YWx1ZQAAAAQAAABuYW1lAAAAAPT+//8IAAAALAAAACMAAAB7ImxldmVsIjoiZXJyb3IiLCJsb2NhdGlvbiI6Im1vb24ifQAGAAAAbGFiZWxzAAA0////CAAAAEgAAAA8AAAAeyJkaXNwbGF5TmFtZUZyb21EUyI6IntsZXZlbD1cImVycm9yXCIsIGxvY2F0aW9uPVwibW9vblwifSJ9AAAAAAYAAABjb25maWcAAAAAAABW////AAACAAUAAAB2YWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAHgAAACAAAAAAAAACoAAAAACAAAANAAAAAQAAADc////CAAAABAAAAAEAAAAdGltZQAAAAAEAAAAbmFtZQAAAAAIAAwACAAEAAgAAAAIAAAAHAAAABIAAAB7ImludGVydmFsIjo0MjAwMH0AAAYAAABjb25maWcAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAHRpbWUAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAgAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAgAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAQA22OdZXvxZAneWJ31e/FpqZmZmZmdk/mpmZmZmZyT8QAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAPAAAAAAABAABAAAA0AgAAAAAAADAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAADUBgAAAwAAAGwAAAAoAAAABAAAANz3//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAA/Pf//wgAAAAsAAAAIAAAAHtsZXZlbD0iZXJyb3IiLCBsb2NhdGlvbj0ibW9vbiJ9AAAAAAQAAABuYW1lAAAAADz4//8IAAAATAYAAEEGAAB7InN0YXRzIjpbeyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGJ5dGVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidW5pdCI6IkJwcyIsInZhbHVlIjozNTA3MDIyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogbGluZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ2YWx1ZSI6MjQ4MTh9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBieXRlcyBwcm9jZXNzZWQiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGxpbmVzIHByb2Nlc3NlZCIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGV4ZWMgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAyMjE2MTI1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyByZWYiLCJ2YWx1ZSI6Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgZG93bmxvYWRlZCIsInZhbHVlIjozfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNodW5rcyBkb3dubG9hZCB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDAzOTA5NTh9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo0fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjozMTQzMn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjZ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgcmVhY2hlZCIsInZhbHVlIjo3fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGNodW5rcyBtYXRjaGVkIiwidmFsdWUiOjh9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgYmF0Y2hlcyIsInZhbHVlIjo5fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGxpbmVzIHNlbnQiLCJ2YWx1ZSI6MTB9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxMX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjEyfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxM30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6MTR9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxNX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjE2fV0sImV4ZWN1dGVkUXVlcnlTdHJpbmciOiJFeHByOiB1cChBTEVSVFMpXG5TdGVwOiA0MnMifQAAAAQAAABtZXRhAAAAAAIAAAAYAQAABAAAAAL///8UAAAA4AAAAOAAAAAAAAAD4AAAAAMAAABwAAAALAAAAAQAAADQ/v//CAAAABAAAAAFAAAAdmFsdWUAAAAEAAAAbmFtZQAAAAD0/v//CAAAACwAAAAjAAAAeyJsZXZlbCI6ImVycm9yIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAANP///wgAAABIAAAAPAAAAHsiZGlzcGxheU5hbWVGcm9tRFMiOiJ7bGV2ZWw9XCJlcnJvclwiLCBsb2NhdGlvbj1cIm1vb25cIn0ifQAAAAAGAAAAY29uZmlnAAAAAAAAVv///wAAAgAFAAAAdmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAAB4AAAAgAAAAAAAAAqAAAAAAgAAADQAAAAEAAAA3P///wgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAACAAMAAgABAAIAAAACAAAABwAAAASAAAAeyJpbnRlcnZhbCI6NDIwMDB9AAAGAAAAY29uZmlnAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAAB0aW1lAAAAAPAIAABBUlJPVzE= +FRAME=QVJST1cxAAD/////uAgAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANAGAAADAAAAaAAAACgAAAAEAAAA5Pf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAE+P//CAAAACgAAAAfAAAAe2xldmVsPSJpbmZvIiwgbG9jYXRpb249Im1hcnMifQAEAAAAbmFtZQAAAABA+P//CAAAAEwGAABBBgAAeyJzdGF0cyI6W3siZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBieXRlcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInVuaXQiOiJCcHMiLCJ2YWx1ZSI6MzUwNzAyMn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGxpbmVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidmFsdWUiOjI0ODE4fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgYnl0ZXMgcHJvY2Vzc2VkIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBsaW5lcyBwcm9jZXNzZWQiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBleGVjIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMjIxNjEyNX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgcmVmIiwidmFsdWUiOjJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIGRvd25sb2FkZWQiLCJ2YWx1ZSI6M30seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjaHVua3MgZG93bmxvYWQgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAwMzkwOTU4fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6NH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MzE0MzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjo2fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIHJlYWNoZWQiLCJ2YWx1ZSI6N30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBjaHVua3MgbWF0Y2hlZCIsInZhbHVlIjo4fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGJhdGNoZXMiLCJ2YWx1ZSI6OX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBsaW5lcyBzZW50IiwidmFsdWUiOjEwfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTF9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjoxMn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTN9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjE0fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTV9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjoxNn1dLCJleGVjdXRlZFF1ZXJ5U3RyaW5nIjoiRXhwcjogdXAoQUxFUlRTKVxuU3RlcDogNDJzIn0AAAAEAAAAbWV0YQAAAAACAAAAFAEAAAQAAAAG////FAAAANwAAADcAAAAAAAAA9wAAAADAAAAcAAAACwAAAAEAAAA1P7//wgAAAAQAAAABQAAAHZhbHVlAAAABAAAAG5hbWUAAAAA+P7//wgAAAAsAAAAIgAAAHsibGV2ZWwiOiJpbmZvIiwibG9jYXRpb24iOiJtYXJzIn0AAAYAAABsYWJlbHMAADj///8IAAAARAAAADsAAAB7ImRpc3BsYXlOYW1lRnJvbURTIjoie2xldmVsPVwiaW5mb1wiLCBsb2NhdGlvbj1cIm1hcnNcIn0ifQAGAAAAY29uZmlnAAAAAAAAVv///wAAAgAFAAAAdmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAAB4AAAAgAAAAAAAAAqAAAAAAgAAADQAAAAEAAAA3P///wgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAACAAMAAgABAAIAAAACAAAABwAAAASAAAAeyJpbnRlcnZhbCI6NDIwMDB9AAAGAAAAY29uZmlnAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAAB0aW1lAAAAAP////+4AAAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAIAAAAAAAAAAUAAAAAAAAAwQACgAYAAwACAAEAAoAAAAUAAAAWAAAAAIAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAEDVzeHaV78WQLnZNd1XvxYzMzMzMzPjP5qZmZmZmek/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAQAAQAAAMgIAAAAAAAAwAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAA0AYAAAMAAABoAAAAKAAAAAQAAADk9///CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAAT4//8IAAAAKAAAAB8AAAB7bGV2ZWw9ImluZm8iLCBsb2NhdGlvbj0ibWFycyJ9AAQAAABuYW1lAAAAAED4//8IAAAATAYAAEEGAAB7InN0YXRzIjpbeyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGJ5dGVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidW5pdCI6IkJwcyIsInZhbHVlIjozNTA3MDIyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogbGluZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ2YWx1ZSI6MjQ4MTh9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBieXRlcyBwcm9jZXNzZWQiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGxpbmVzIHByb2Nlc3NlZCIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGV4ZWMgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAyMjE2MTI1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyByZWYiLCJ2YWx1ZSI6Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgZG93bmxvYWRlZCIsInZhbHVlIjozfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNodW5rcyBkb3dubG9hZCB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDAzOTA5NTh9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo0fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjozMTQzMn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjZ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgcmVhY2hlZCIsInZhbHVlIjo3fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGNodW5rcyBtYXRjaGVkIiwidmFsdWUiOjh9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgYmF0Y2hlcyIsInZhbHVlIjo5fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGxpbmVzIHNlbnQiLCJ2YWx1ZSI6MTB9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxMX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjEyfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxM30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6MTR9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxNX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjE2fV0sImV4ZWN1dGVkUXVlcnlTdHJpbmciOiJFeHByOiB1cChBTEVSVFMpXG5TdGVwOiA0MnMifQAAAAQAAABtZXRhAAAAAAIAAAAUAQAABAAAAAb///8UAAAA3AAAANwAAAAAAAAD3AAAAAMAAABwAAAALAAAAAQAAADU/v//CAAAABAAAAAFAAAAdmFsdWUAAAAEAAAAbmFtZQAAAAD4/v//CAAAACwAAAAiAAAAeyJsZXZlbCI6ImluZm8iLCJsb2NhdGlvbiI6Im1hcnMifQAABgAAAGxhYmVscwAAOP///wgAAABEAAAAOwAAAHsiZGlzcGxheU5hbWVGcm9tRFMiOiJ7bGV2ZWw9XCJpbmZvXCIsIGxvY2F0aW9uPVwibWFyc1wifSJ9AAYAAABjb25maWcAAAAAAABW////AAACAAUAAAB2YWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAHgAAACAAAAAAAAACoAAAAACAAAANAAAAAQAAADc////CAAAABAAAAAEAAAAdGltZQAAAAAEAAAAbmFtZQAAAAAIAAwACAAEAAgAAAAIAAAAHAAAABIAAAB7ImludGVydmFsIjo0MjAwMH0AAAYAAABjb25maWcAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAHRpbWUAAAAA6AgAAEFSUk9XMQ== diff --git a/pkg/tsdb/loki/testdata/matrix_with_stats.json b/pkg/tsdb/loki/testdata/matrix_with_stats.json new file mode 100644 index 00000000000..609ce7ff170 --- /dev/null +++ b/pkg/tsdb/loki/testdata/matrix_with_stats.json @@ -0,0 +1,60 @@ +{ + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "level": "error", + "location": "moon" + }, + "values": [ + [1639125366.989, "0.4"], + [1639125406.989, "0.2"] + ] + }, + { + "metric": { + "level": "info", + "location": "mars" + }, + "values": [ + [1639125386.989, "0.6"], + [1639125396.989, "0.8"] + ] + } + ], + "stats": { + "summary": { + "bytesProcessedPerSecond": 3507022, + "linesProcessedPerSecond": 24818, + "totalBytesProcessed": 7772, + "totalLinesProcessed": 55, + "execTime": 0.002216125 + }, + "store": { + "totalChunksRef": 2, + "totalChunksDownloaded": 3, + "chunksDownloadTime": 0.000390958, + "headChunkBytes": 4, + "headChunkLines": 5, + "decompressedBytes": 7772, + "decompressedLines": 55, + "compressedBytes": 31432, + "totalDuplicates": 6 + }, + "ingester": { + "totalReached": 7, + "totalChunksMatched": 8, + "totalBatches": 9, + "totalLinesSent": 10, + "headChunkBytes": 11, + "headChunkLines": 12, + "decompressedBytes": 13, + "decompressedLines": 14, + "compressedBytes": 15, + "totalDuplicates": 16 + } + } + } +} diff --git a/pkg/tsdb/loki/testdata/streams_simple.golden.txt b/pkg/tsdb/loki/testdata/streams_simple.golden.txt index 10312ee6f42..76204b3a22f 100644 --- a/pkg/tsdb/loki/testdata/streams_simple.golden.txt +++ b/pkg/tsdb/loki/testdata/streams_simple.golden.txt @@ -1,6 +1,114 @@ 🌟 This was machine generated. Do not edit. 🌟 Frame[0] { + "stats": [ + { + "displayName": "Summary: bytes processed per second", + "unit": "Bps", + "value": 3507022 + }, + { + "displayName": "Summary: lines processed per second", + "value": 24818 + }, + { + "displayName": "Summary: total bytes processed", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Summary: total lines processed", + "value": 55 + }, + { + "displayName": "Summary: exec time", + "unit": "s", + "value": 0.002216125 + }, + { + "displayName": "Store: total chunks ref", + "value": 2 + }, + { + "displayName": "Store: total chunks downloaded", + "value": 3 + }, + { + "displayName": "Store: chunks download time", + "unit": "s", + "value": 0.000390958 + }, + { + "displayName": "Store: head chunk bytes", + "unit": "decbytes", + "value": 4 + }, + { + "displayName": "Store: head chunk lines", + "value": 5 + }, + { + "displayName": "Store: decompressed bytes", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Store: decompressed lines", + "value": 55 + }, + { + "displayName": "Store: compressed bytes", + "unit": "decbytes", + "value": 31432 + }, + { + "displayName": "Store: total duplicates", + "value": 6 + }, + { + "displayName": "Ingester: total reached", + "value": 7 + }, + { + "displayName": "Ingester: total chunks matched", + "value": 8 + }, + { + "displayName": "Ingester: total batches", + "value": 9 + }, + { + "displayName": "Ingester: total lines sent", + "value": 10 + }, + { + "displayName": "Ingester: head chunk bytes", + "unit": "decbytes", + "value": 11 + }, + { + "displayName": "Ingester: head chunk lines", + "value": 12 + }, + { + "displayName": "Ingester: decompressed bytes", + "unit": "decbytes", + "value": 13 + }, + { + "displayName": "Ingester: decompressed lines", + "value": 14 + }, + { + "displayName": "Ingester: compressed bytes", + "unit": "decbytes", + "value": 15 + }, + { + "displayName": "Ingester: total duplicates", + "value": 16 + } + ], "executedQueryString": "Expr: query1" } Name: {level="error", location="moon"} @@ -16,6 +124,114 @@ Dimensions: 3 Fields by 1 Rows Frame[1] { + "stats": [ + { + "displayName": "Summary: bytes processed per second", + "unit": "Bps", + "value": 3507022 + }, + { + "displayName": "Summary: lines processed per second", + "value": 24818 + }, + { + "displayName": "Summary: total bytes processed", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Summary: total lines processed", + "value": 55 + }, + { + "displayName": "Summary: exec time", + "unit": "s", + "value": 0.002216125 + }, + { + "displayName": "Store: total chunks ref", + "value": 2 + }, + { + "displayName": "Store: total chunks downloaded", + "value": 3 + }, + { + "displayName": "Store: chunks download time", + "unit": "s", + "value": 0.000390958 + }, + { + "displayName": "Store: head chunk bytes", + "unit": "decbytes", + "value": 4 + }, + { + "displayName": "Store: head chunk lines", + "value": 5 + }, + { + "displayName": "Store: decompressed bytes", + "unit": "decbytes", + "value": 7772 + }, + { + "displayName": "Store: decompressed lines", + "value": 55 + }, + { + "displayName": "Store: compressed bytes", + "unit": "decbytes", + "value": 31432 + }, + { + "displayName": "Store: total duplicates", + "value": 6 + }, + { + "displayName": "Ingester: total reached", + "value": 7 + }, + { + "displayName": "Ingester: total chunks matched", + "value": 8 + }, + { + "displayName": "Ingester: total batches", + "value": 9 + }, + { + "displayName": "Ingester: total lines sent", + "value": 10 + }, + { + "displayName": "Ingester: head chunk bytes", + "unit": "decbytes", + "value": 11 + }, + { + "displayName": "Ingester: head chunk lines", + "value": 12 + }, + { + "displayName": "Ingester: decompressed bytes", + "unit": "decbytes", + "value": 13 + }, + { + "displayName": "Ingester: decompressed lines", + "value": 14 + }, + { + "displayName": "Ingester: compressed bytes", + "unit": "decbytes", + "value": 15 + }, + { + "displayName": "Ingester: total duplicates", + "value": 16 + } + ], "executedQueryString": "Expr: query1" } Name: {level="info", location="moon"} @@ -33,5 +249,5 @@ Dimensions: 3 Fields by 4 Rows ====== TEST DATA RESPONSE (arrow base64) ====== -FRAME=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 -FRAME=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 +FRAME=QVJST1cxAAD/////AAkAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAMQGAAADAAAAbAAAACgAAAAEAAAAlPf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC09///CAAAACwAAAAgAAAAe2xldmVsPSJlcnJvciIsIGxvY2F0aW9uPSJtb29uIn0AAAAABAAAAG5hbWUAAAAA9Pf//wgAAAA8BgAAMgYAAHsic3RhdHMiOlt7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogYnl0ZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ1bml0IjoiQnBzIiwidmFsdWUiOjM1MDcwMjJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBsaW5lcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInZhbHVlIjoyNDgxOH0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGJ5dGVzIHByb2Nlc3NlZCIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgbGluZXMgcHJvY2Vzc2VkIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogZXhlYyB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDIyMTYxMjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIHJlZiIsInZhbHVlIjoyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyBkb3dubG9hZGVkIiwidmFsdWUiOjN9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY2h1bmtzIGRvd25sb2FkIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMDM5MDk1OH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHF1ZXJ5MSJ9AAAEAAAAbWV0YQAAAAADAAAAmAEAAIQAAAAEAAAAhv7//xQAAABgAAAAYAAAAAAAAAVcAAAAAgAAACwAAAAEAAAAeP7//wgAAAAQAAAABAAAAHRzTnMAAAAABAAAAG5hbWUAAAAAnP7//wgAAAAMAAAAAgAAAHt9AAAGAAAAbGFiZWxzAAAAAAAABP///wQAAAB0c05zAAAAAAL///8UAAAA4AAAAOQAAAAAAAAF4AAAAAMAAABwAAAALAAAAAQAAAD4/v//CAAAABAAAAAFAAAAdmFsdWUAAAAEAAAAbmFtZQAAAAAc////CAAAACwAAAAjAAAAeyJsZXZlbCI6ImVycm9yIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAAXP///wgAAABIAAAAPAAAAHsiZGlzcGxheU5hbWVGcm9tRFMiOiJ7bGV2ZWw9XCJlcnJvclwiLCBsb2NhdGlvbj1cIm1vb25cIn0ifQAAAAAGAAAAY29uZmlnAAAAAAAABAAEAAQAAAAFAAAAdmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAAB0aW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAHRpbWUAAAAAAAAAAP////8IAQAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAQAAAAAAAAAAUAAAAAAAAAwQACgAYAAwACAAEAAoAAAAUAAAAmAAAAAEAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAgAAAAAAAAAKAAAAAAAAAATAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAABS4ukpS1BYAAAAAEAAAAGxvZyBsaW5lIGVycm9yIDEAAAAAEwAAADE2NDUwMzAyNDQ4MTA3NTcxMjAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAAQCQAAAAAAABABAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAxAYAAAMAAABsAAAAKAAAAAQAAACU9///CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAALT3//8IAAAALAAAACAAAAB7bGV2ZWw9ImVycm9yIiwgbG9jYXRpb249Im1vb24ifQAAAAAEAAAAbmFtZQAAAAD09///CAAAADwGAAAyBgAAeyJzdGF0cyI6W3siZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBieXRlcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInVuaXQiOiJCcHMiLCJ2YWx1ZSI6MzUwNzAyMn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGxpbmVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidmFsdWUiOjI0ODE4fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgYnl0ZXMgcHJvY2Vzc2VkIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBsaW5lcyBwcm9jZXNzZWQiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBleGVjIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMjIxNjEyNX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgcmVmIiwidmFsdWUiOjJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIGRvd25sb2FkZWQiLCJ2YWx1ZSI6M30seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjaHVua3MgZG93bmxvYWQgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAwMzkwOTU4fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6NH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MzE0MzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjo2fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIHJlYWNoZWQiLCJ2YWx1ZSI6N30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBjaHVua3MgbWF0Y2hlZCIsInZhbHVlIjo4fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGJhdGNoZXMiLCJ2YWx1ZSI6OX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBsaW5lcyBzZW50IiwidmFsdWUiOjEwfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTF9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjoxMn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTN9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjE0fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTV9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjoxNn1dLCJleGVjdXRlZFF1ZXJ5U3RyaW5nIjoiRXhwcjogcXVlcnkxIn0AAAQAAABtZXRhAAAAAAMAAACYAQAAhAAAAAQAAACG/v//FAAAAGAAAABgAAAAAAAABVwAAAACAAAALAAAAAQAAAB4/v//CAAAABAAAAAEAAAAdHNOcwAAAAAEAAAAbmFtZQAAAACc/v//CAAAAAwAAAACAAAAe30AAAYAAABsYWJlbHMAAAAAAAAE////BAAAAHRzTnMAAAAAAv///xQAAADgAAAA5AAAAAAAAAXgAAAAAwAAAHAAAAAsAAAABAAAAPj+//8IAAAAEAAAAAUAAAB2YWx1ZQAAAAQAAABuYW1lAAAAABz///8IAAAALAAAACMAAAB7ImxldmVsIjoiZXJyb3IiLCJsb2NhdGlvbiI6Im1vb24ifQAGAAAAbGFiZWxzAABc////CAAAAEgAAAA8AAAAeyJkaXNwbGF5TmFtZUZyb21EUyI6IntsZXZlbD1cImVycm9yXCIsIGxvY2F0aW9uPVwibW9vblwifSJ9AAAAAAYAAABjb25maWcAAAAAAAAEAAQABAAAAAUAAAB2YWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAAAAoCQAAQVJST1cx +FRAME=QVJST1cxAAD/////+AgAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAMAGAAADAAAAaAAAACgAAAAEAAAAnPf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC89///CAAAACgAAAAfAAAAe2xldmVsPSJpbmZvIiwgbG9jYXRpb249Im1vb24ifQAEAAAAbmFtZQAAAAD49///CAAAADwGAAAyBgAAeyJzdGF0cyI6W3siZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBieXRlcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInVuaXQiOiJCcHMiLCJ2YWx1ZSI6MzUwNzAyMn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGxpbmVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidmFsdWUiOjI0ODE4fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgYnl0ZXMgcHJvY2Vzc2VkIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBsaW5lcyBwcm9jZXNzZWQiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBleGVjIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMjIxNjEyNX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgcmVmIiwidmFsdWUiOjJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIGRvd25sb2FkZWQiLCJ2YWx1ZSI6M30seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjaHVua3MgZG93bmxvYWQgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAwMzkwOTU4fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6NH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MzE0MzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjo2fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIHJlYWNoZWQiLCJ2YWx1ZSI6N30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBjaHVua3MgbWF0Y2hlZCIsInZhbHVlIjo4fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGJhdGNoZXMiLCJ2YWx1ZSI6OX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBsaW5lcyBzZW50IiwidmFsdWUiOjEwfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTF9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjoxMn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTN9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjE0fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTV9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjoxNn1dLCJleGVjdXRlZFF1ZXJ5U3RyaW5nIjoiRXhwcjogcXVlcnkxIn0AAAQAAABtZXRhAAAAAAMAAACUAQAA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IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHF1ZXJ5MSJ9AAAEAAAAbWV0YQAAAAADAAAAlAEAAIQAAAAEAAAAiv7//xQAAABgAAAAYAAAAAAAAAVcAAAAAgAAACwAAAAEAAAAfP7//wgAAAAQAAAABAAAAHRzTnMAAAAABAAAAG5hbWUAAAAAoP7//wgAAAAMAAAAAgAAAHt9AAAGAAAAbGFiZWxzAAAAAAAACP///wQAAAB0c05zAAAAAAb///8UAAAA3AAAAOAAAAAAAAAF3AAAAAMAAABwAAAALAAAAAQAAAD8/v//CAAAABAAAAAFAAAAdmFsdWUAAAAEAAAAbmFtZQAAAAAg////CAAAACwAAAAiAAAAeyJsZXZlbCI6ImluZm8iLCJsb2NhdGlvbiI6Im1vb24ifQAABgAAAGxhYmVscwAAYP///wgAAABEAAAAOwAAAHsiZGlzcGxheU5hbWVGcm9tRFMiOiJ7bGV2ZWw9XCJpbmZvXCIsIGxvY2F0aW9uPVwibW9vblwifSJ9AAYAAABjb25maWcAAAAAAAAEAAQABAAAAAUAAAB2YWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAAAAgCQAAQVJST1cx diff --git a/pkg/tsdb/loki/testdata/streams_simple.json b/pkg/tsdb/loki/testdata/streams_simple.json index 87fb82a3952..8754d444ad0 100644 --- a/pkg/tsdb/loki/testdata/streams_simple.json +++ b/pkg/tsdb/loki/testdata/streams_simple.json @@ -50,26 +50,26 @@ }, "store": { "totalChunksRef": 2, - "totalChunksDownloaded": 2, + "totalChunksDownloaded": 3, "chunksDownloadTime": 0.000390958, - "headChunkBytes": 0, - "headChunkLines": 0, + "headChunkBytes": 4, + "headChunkLines": 5, "decompressedBytes": 7772, "decompressedLines": 55, "compressedBytes": 31432, - "totalDuplicates": 0 + "totalDuplicates": 6 }, "ingester": { - "totalReached": 0, - "totalChunksMatched": 0, - "totalBatches": 0, - "totalLinesSent": 0, - "headChunkBytes": 0, - "headChunkLines": 0, - "decompressedBytes": 0, - "decompressedLines": 0, - "compressedBytes": 0, - "totalDuplicates": 0 + "totalReached": 7, + "totalChunksMatched": 8, + "totalBatches": 9, + "totalLinesSent": 10, + "headChunkBytes": 11, + "headChunkLines": 12, + "decompressedBytes": 13, + "decompressedLines": 14, + "compressedBytes": 15, + "totalDuplicates": 16 } } } diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts index 4364286ccff..6e16b129682 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts @@ -76,6 +76,9 @@ describe('loki backendResultTransformer', () => { executedQueryString: 'something1', preferredVisualisationType: 'logs', searchWords: ['thing1'], + custom: { + lokiQueryStatKey: 'Summary: total bytes processed', + }, }; expectedFrame.fields[2].type = FieldType.time; expectedFrame.fields.push({ diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.ts b/public/app/plugins/datasource/loki/backendResultTransformer.ts index 6d6e73b5644..2423fc81c93 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.ts @@ -23,6 +23,10 @@ function processStreamFrame(frame: DataFrame, query: LokiQuery | undefined): Dat const meta: QueryResultMeta = { preferredVisualisationType: 'logs', searchWords: query !== undefined ? getHighlighterExpressionsFromQuery(formatQuery(query.expr)) : undefined, + custom: { + // used by logs_model + lokiQueryStatKey: 'Summary: total bytes processed', + }, }; const newFrame = setFrameMeta(frame, meta); const newFields = frame.fields.map((field) => {