diff --git a/pkg/tsdb/loki/frame.go b/pkg/tsdb/loki/frame.go index 5593c59ae57..ebfe4247ee1 100644 --- a/pkg/tsdb/loki/frame.go +++ b/pkg/tsdb/loki/frame.go @@ -1,6 +1,7 @@ package loki import ( + "encoding/json" "fmt" "hash/fnv" "sort" @@ -88,12 +89,12 @@ func adjustLogsFrame(frame *data.Frame, query *lokiQuery) error { timeField := fields[1] lineField := fields[2] - if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeString) { - return fmt.Errorf("invalid fields in metric frame") + if (timeField.Type() != data.FieldTypeTime) || (lineField.Type() != data.FieldTypeString) || (labelsField.Type() != data.FieldTypeJSON) { + return fmt.Errorf("invalid fields in logs frame") } if (timeField.Len() != lineField.Len()) || (timeField.Len() != labelsField.Len()) { - return fmt.Errorf("invalid fields in metric frame") + return fmt.Errorf("invalid fields in logs frame") } if frame.Meta == nil { @@ -127,8 +128,9 @@ func makeStringTimeField(timeField *data.Field) *data.Field { return data.NewField("tsNs", timeField.Labels.Copy(), stringTimestamps) } -func calculateCheckSum(time string, line string, labels string) (string, error) { - input := []byte(line + "_" + labels) +func calculateCheckSum(time string, line string, labels []byte) (string, error) { + input := []byte(line + "_") + input = append(input, labels...) hash := fnv.New32() _, err := hash.Write(input) if err != nil { @@ -147,7 +149,7 @@ func makeIdField(stringTimeField *data.Field, lineField *data.Field, labelsField for i := 0; i < length; i++ { time := stringTimeField.At(i).(string) line := lineField.At(i).(string) - labels := labelsField.At(i).(string) + labels := labelsField.At(i).(json.RawMessage) sum, err := calculateCheckSum(time, line, labels) if err != nil { diff --git a/pkg/tsdb/loki/frame_test.go b/pkg/tsdb/loki/frame_test.go index 0e4bf3ebcfc..f4da77bb71a 100644 --- a/pkg/tsdb/loki/frame_test.go +++ b/pkg/tsdb/loki/frame_test.go @@ -1,6 +1,7 @@ package loki import ( + "encoding/json" "testing" "time" @@ -39,11 +40,11 @@ func TestFormatName(t *testing.T) { func TestAdjustFrame(t *testing.T) { t.Run("logs-frame metadata should be set correctly", func(t *testing.T) { frame := data.NewFrame("", - data.NewField("labels", nil, []string{ - `{"level":"info"}`, - `{"level":"error"}`, - `{"level":"error"}`, - `{"level":"info"}`, + 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), @@ -86,7 +87,7 @@ func TestAdjustFrame(t *testing.T) { require.Equal(t, "1641092765000000006_948c1a7d_A", idField.At(3)) }) - t.Run("logs-frame id and string-time fields should be created", func(t *testing.T) { + t.Run("naming inside metric fields should be correct", func(t *testing.T) { field1 := data.NewField("", nil, make([]time.Time, 0)) field2 := data.NewField("", nil, make([]float64, 0)) field2.Labels = data.Labels{"app": "Application", "tag2": "tag2"} diff --git a/pkg/tsdb/loki/parse_response.go b/pkg/tsdb/loki/parse_response.go index c58c0838577..4665709912e 100644 --- a/pkg/tsdb/loki/parse_response.go +++ b/pkg/tsdb/loki/parse_response.go @@ -1,8 +1,8 @@ package loki import ( + "encoding/json" "fmt" - "sort" "time" "github.com/grafana/grafana-plugin-sdk-go/data" @@ -109,35 +109,23 @@ func lokiVectorToDataFrames(vector loghttp.Vector, query *lokiQuery, stats []dat } // we serialize the labels as an ordered list of pairs -func labelsToString(labels data.Labels) (string, error) { - keys := make([]string, 0, len(labels)) - for k := range labels { - keys = append(keys, k) - } - sort.Strings(keys) - - labelArray := make([][2]string, 0, len(labels)) - - for _, k := range keys { - pair := [2]string{k, labels[k]} - labelArray = append(labelArray, pair) - } - - bytes, err := jsoniter.Marshal(labelArray) +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 "", err + return nil, err } - return string(bytes), nil + 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 []string + var labelsVector []json.RawMessage for _, v := range streams { - labelsText, err := labelsToString(v.Labels.Map()) + labelsJson, err := labelsToRawJson(v.Labels.Map()) if err != nil { return nil, err } @@ -145,17 +133,13 @@ func lokiStreamsToDataFrames(streams loghttp.Streams, query *lokiQuery, stats [] for _, k := range v.Entries { timeVector = append(timeVector, k.Timestamp.UTC()) values = append(values, k.Line) - labelsVector = append(labelsVector, labelsText) + labelsVector = append(labelsVector, labelsJson) } } timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, timeVector) valueField := data.NewField("Line", nil, values) labelsField := data.NewField("labels", nil, labelsVector) - labelsField.Config = &data.FieldConfig{ - // we should have a native json-field-type - Custom: map[string]interface{}{"json": true}, - } frame := data.NewFrame("", labelsField, timeField, valueField) frame.SetMeta(&data.FrameMeta{ diff --git a/pkg/tsdb/loki/testdata/streams_simple.golden.txt b/pkg/tsdb/loki/testdata/streams_simple.golden.txt index d59775228d8..9cc8eec9918 100644 --- a/pkg/tsdb/loki/testdata/streams_simple.golden.txt +++ b/pkg/tsdb/loki/testdata/streams_simple.golden.txt @@ -113,19 +113,19 @@ Frame[0] { } Name: Dimensions: 5 Fields by 6 Rows -+-------------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ -| Name: labels | Name: Time | Name: Line | Name: tsNs | Name: id | -| Labels: | Labels: | Labels: | Labels: | Labels: | -| Type: []string | Type: []time.Time | Type: []string | Type: []string | Type: []string | -+-------------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ -| [["code","one\","],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | 1645030244810757120_f5088206_ | -| [["code","\",two"],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | 1645030247027735040_46b225a4_ | -| [["code","\",two"],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | 1645030246277587968_c2a9f32b_ | -| [["code","\",two"],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | 1645030246277587968_c2a9f32b_1_ | -| [["code","\",two"],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 | 1645030245539423744_86502e6_ | -| [["code","\",two"],["location","moon๐ŸŒ™"]] | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 | 1645030244091700992_c6f5b60d_ | -+-------------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ ++---------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ +| Name: labels | Name: Time | Name: Line | Name: tsNs | Name: id | +| Labels: | Labels: | Labels: | Labels: | Labels: | +| Type: []json.RawMessage | Type: []time.Time | Type: []string | Type: []string | Type: []string | ++---------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ +| {"code":"one\",","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 | 1645030244810757120_1d8c2178_ | +| {"code":"\",two","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 | 1645030247027735040_87a7aed2_ | +| {"code":"\",two","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | 1645030246277587968_318d05c9_ | +| {"code":"\",two","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 | 1645030246277587968_318d05c9_1_ | +| {"code":"\",two","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 | 1645030245539423744_fd17f65c_ | +| {"code":"\",two","location":"moon๐ŸŒ™"} | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 | 1645030244091700992_62ae07f3_ | ++---------------------------------------+-----------------------------------------+------------------+---------------------+---------------------------------+ ====== TEST DATA RESPONSE (arrow base64) ====== -FRAME=QVJST1cxAAD/////KAkAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAKQGAAADAAAATAAAACgAAAAEAAAAePf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAACY9///CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAALj3//8IAAAAPAYAADIGAAB7InN0YXRzIjpbeyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGJ5dGVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidW5pdCI6IkJwcyIsInZhbHVlIjozNTA3MDIyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogbGluZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ2YWx1ZSI6MjQ4MTh9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBieXRlcyBwcm9jZXNzZWQiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGxpbmVzIHByb2Nlc3NlZCIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGV4ZWMgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAyMjE2MTI1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyByZWYiLCJ2YWx1ZSI6Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgZG93bmxvYWRlZCIsInZhbHVlIjozfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNodW5rcyBkb3dubG9hZCB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDAzOTA5NTh9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo0fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjozMTQzMn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjZ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgcmVhY2hlZCIsInZhbHVlIjo3fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGNodW5rcyBtYXRjaGVkIiwidmFsdWUiOjh9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgYmF0Y2hlcyIsInZhbHVlIjo5fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGxpbmVzIHNlbnQiLCJ2YWx1ZSI6MTB9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxMX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjEyfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxM30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6MTR9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxNX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjE2fV0sImV4ZWN1dGVkUXVlcnlTdHJpbmciOiJFeHByOiBxdWVyeTEifQAABAAAAG1ldGEAAAAABQAAAKwBAAA0AQAA2AAAAFgAAAAEAAAAev7//xQAAAA4AAAA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EgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAA4CQAAAAAAAJABAAAAAAAAQAMAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAApAYAAAMAAABMAAAAKAAAAAQAAAB49///CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAJj3//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAuPf//wgAAAA8BgAAMgYAAHsic3RhdHMiOlt7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogYnl0ZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ1bml0IjoiQnBzIiwidmFsdWUiOjM1MDcwMjJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBsaW5lcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInZhbHVlIjoyNDgxOH0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGJ5dGVzIHByb2Nlc3NlZCIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgbGluZXMgcHJvY2Vzc2VkIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogZXhlYyB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDIyMTYxMjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIHJlZiIsInZhbHVlIjoyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyBkb3dubG9hZGVkIiwidmFsdWUiOjN9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY2h1bmtzIGRvd25sb2FkIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMDM5MDk1OH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHF1ZXJ5MSJ9AAAEAAAAbWV0YQAAAAAFAAAArAEAADQBAADYAAAAWAAAAAQAAAB6/v//FAAAADgAAAA4AAAAAAAABTQAAAABAAAABAAAAED+//8IAAAADAAAAAIAAABpZAAABAAAAG5hbWUAAAAAAAAAACD+//8CAAAAaWQAAMr+//8UAAAAYAAAAGAAAAAAAAAFXAAAAAIAAAAsAAAABAAAAJT+//8IAAAAEAAAAAQAAAB0c05zAAAAAAQAAABuYW1lAAAAALj+//8IAAAADAAAAAIAAAB7fQAABgAAAGxhYmVscwAAAAAAAJj+//8EAAAAdHNOcwAAAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAAAz///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAADw/v//BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAABk////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAIAAAACEAAAAAAAABYAAAAACAAAANAAAAAQAAADc////CAAAABAAAAAGAAAAbGFiZWxzAAAEAAAAbmFtZQAAAAAIAAwACAAEAAgAAAAIAAAAJAAAABgAAAB7ImN1c3RvbSI6eyJqc29uIjp0cnVlfX0AAAAABgAAAGNvbmZpZwAAAAAAAAQABAAEAAAABgAAAGxhYmVscwAAUAkAAEFSUk9XMQ== +FRAME=QVJST1cxAAD/////6AgAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAKQGAAADAAAATAAAACgAAAAEAAAAoPf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADA9///CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOD3//8IAAAAPAYAADIGAAB7InN0YXRzIjpbeyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGJ5dGVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidW5pdCI6IkJwcyIsInZhbHVlIjozNTA3MDIyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogbGluZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ2YWx1ZSI6MjQ4MTh9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBieXRlcyBwcm9jZXNzZWQiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGxpbmVzIHByb2Nlc3NlZCIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGV4ZWMgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAyMjE2MTI1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyByZWYiLCJ2YWx1ZSI6Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgZG93bmxvYWRlZCIsInZhbHVlIjozfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNodW5rcyBkb3dubG9hZCB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDAzOTA5NTh9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo0fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6Nzc3Mn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjozMTQzMn0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjZ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgcmVhY2hlZCIsInZhbHVlIjo3fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGNodW5rcyBtYXRjaGVkIiwidmFsdWUiOjh9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgYmF0Y2hlcyIsInZhbHVlIjo5fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGxpbmVzIHNlbnQiLCJ2YWx1ZSI6MTB9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxMX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjEyfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxM30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgbGluZXMiLCJ2YWx1ZSI6MTR9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjoxNX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBkdXBsaWNhdGVzIiwidmFsdWUiOjE2fV0sImV4ZWN1dGVkUXVlcnlTdHJpbmciOiJFeHByOiBxdWVyeTEifQAABAAAAG1ldGEAAAAABQAAAKwBAAA0AQAA2AAAAFgAAAAEAAAAev7//xQAAAA4AAAA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pAYAAAMAAABMAAAAKAAAAAQAAACg9///CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMD3//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA4Pf//wgAAAA8BgAAMgYAAHsic3RhdHMiOlt7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogYnl0ZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ1bml0IjoiQnBzIiwidmFsdWUiOjM1MDcwMjJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBsaW5lcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInZhbHVlIjoyNDgxOH0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGJ5dGVzIHByb2Nlc3NlZCIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgbGluZXMgcHJvY2Vzc2VkIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogZXhlYyB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDIyMTYxMjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIHJlZiIsInZhbHVlIjoyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyBkb3dubG9hZGVkIiwidmFsdWUiOjN9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY2h1bmtzIGRvd25sb2FkIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMDM5MDk1OH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHF1ZXJ5MSJ9AAAEAAAAbWV0YQAAAAAFAAAArAEAADQBAADYAAAAWAAAAAQAAAB6/v//FAAAADgAAAA4AAAAAAAABTQAAAABAAAABAAAAGj+//8IAAAADAAAAAIAAABpZAAABAAAAG5hbWUAAAAAAAAAAFz+//8CAAAAaWQAAMr+//8UAAAAYAAAAGAAAAAAAAAFXAAAAAIAAAAsAAAABAAAALz+//8IAAAAEAAAAAQAAAB0c05zAAAAAAQAAABuYW1lAAAAAOD+//8IAAAADAAAAAIAAAB7fQAABgAAAGxhYmVscwAAAAAAANT+//8EAAAAdHNOcwAAAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAs////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABIAAAAAAAABEQAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABgAAAGxhYmVscwAABAAAAG5hbWUAAAAAAAAAAAQABAAEAAAABgAAAGxhYmVscwAAGAkAAEFSUk9XMQ== diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts index ec4ab229322..6179df79462 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts @@ -15,13 +15,13 @@ const inputFrame: DataFrame = { name: 'time', type: FieldType.time, config: {}, - values: new ArrayVector([1645030244810, 1645030247027, 1645030246277, 1645030245539, 1645030244091]), + values: new ArrayVector([1645030244810, 1645030247027]), }, { name: 'value', type: FieldType.string, config: {}, - values: new ArrayVector(['line1', 'line2', 'line3', 'line4', 'line5']), + values: new ArrayVector(['line1', 'line2']), }, { name: 'labels', @@ -31,31 +31,19 @@ const inputFrame: DataFrame = { json: true, }, }, - values: new ArrayVector([ - `[["level", "info"],["code", "41๐ŸŒ™"]]`, - `[["level", "error"],["code", "41๐ŸŒ™"]]`, - `[["level", "error"],["code", "43๐ŸŒ™"]]`, - `[["level", "error"],["code", "41๐ŸŒ™"]]`, - `[["level", "info"],["code", "41๐ŸŒ™"]]`, - ]), + values: new ArrayVector([`[["level", "info"],["code", "41๐ŸŒ™"]]`, `[["level", "error"],["code", "41๐ŸŒ™"]]`]), }, { name: 'tsNs', - type: FieldType.time, + type: FieldType.string, config: {}, - values: new ArrayVector([ - '1645030244810757120', - '1645030247027735040', - '1645030246277587968', - '1645030245539423744', - '1645030244091700992', - ]), + values: new ArrayVector(['1645030244810757120', '1645030247027735040']), }, { name: 'id', type: FieldType.string, config: {}, - values: new ArrayVector(['id1', 'id2', 'id3', 'id4', 'id5']), + values: new ArrayVector(['id1', 'id2']), }, ], length: 5, @@ -74,14 +62,7 @@ describe('loki backendResultTransformer', () => { lokiQueryStatKey: 'Summary: total bytes processed', }, }; - expectedFrame.fields[2].type = FieldType.other; - expectedFrame.fields[2].values = new ArrayVector([ - { level: 'info', code: '41๐ŸŒ™' }, - { level: 'error', code: '41๐ŸŒ™' }, - { level: 'error', code: '43๐ŸŒ™' }, - { level: 'error', code: '41๐ŸŒ™' }, - { level: 'info', code: '41๐ŸŒ™' }, - ]); + expectedFrame.fields[3].type = FieldType.time; const expected: DataQueryResponse = { data: [expectedFrame] }; diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.ts b/public/app/plugins/datasource/loki/backendResultTransformer.ts index 2422359c74e..cff060731d7 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.ts @@ -1,12 +1,4 @@ -import { - DataQueryResponse, - DataFrame, - isDataFrame, - FieldType, - QueryResultMeta, - ArrayVector, - Labels, -} from '@grafana/data'; +import { DataQueryResponse, DataFrame, isDataFrame, FieldType, QueryResultMeta } from '@grafana/data'; import { makeTableFrames } from './makeTableFrames'; import { formatQuery, getHighlighterExpressionsFromQuery } from './query_utils'; @@ -27,12 +19,6 @@ function setFrameMeta(frame: DataFrame, meta: QueryResultMeta): DataFrame { }; } -function decodeLabelsInJson(text: string): Labels { - const array: Array<[string, string]> = JSON.parse(text); - // NOTE: maybe we should go with maps, those have guaranteed ordering - return Object.fromEntries(array); -} - function processStreamFrame(frame: DataFrame, query: LokiQuery | undefined): DataFrame { const meta: QueryResultMeta = { preferredVisualisationType: 'logs', @@ -46,19 +32,6 @@ function processStreamFrame(frame: DataFrame, query: LokiQuery | undefined): Dat const newFields = newFrame.fields.map((field) => { switch (field.name) { - case 'labels': { - // the labels, when coming from the server, are json-encoded. - // here we decode them if needed. - return field.config.custom.json - ? { - name: field.name, - type: FieldType.other, - config: field.config, - // we are parsing the labels the same way as streaming-dataframes do - values: new ArrayVector(field.values.toArray().map((text) => decodeLabelsInJson(text))), - } - : field; - } case 'tsNs': { // we need to switch the field-type to be `time` return {