From 683c1c0f40cff199a71c1a039b692a88c47d2105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Mon, 16 May 2022 13:38:05 +0200 Subject: [PATCH] logs: use explicit frame-type-check (#48940) --- pkg/tsdb/loki/frame.go | 6 ++++- .../loki/testdata/streams_simple.golden.txt | 5 +++- public/app/core/logs_model.test.ts | 12 +++++++++ public/app/core/logs_model.ts | 25 +++++++++++-------- .../loki/backendResultTransformer.test.ts | 4 +++ .../loki/backendResultTransformer.ts | 3 ++- .../datasource/loki/result_transformer.ts | 3 +++ 7 files changed, 45 insertions(+), 13 deletions(-) diff --git a/pkg/tsdb/loki/frame.go b/pkg/tsdb/loki/frame.go index 10affc4dede..aa574270c1c 100644 --- a/pkg/tsdb/loki/frame.go +++ b/pkg/tsdb/loki/frame.go @@ -114,7 +114,11 @@ func adjustLogsFrame(frame *data.Frame, query *lokiQuery) error { } frame.Meta.Stats = parseStats(frame.Meta.Custom) - frame.Meta.Custom = nil + // TODO: when we get a real frame-type in grafana-plugin-sdk-go, + // move this to frame.Meta.FrameType + frame.Meta.Custom = map[string]string{ + "frameType": "LabeledTimeValues", + } frame.Meta.ExecutedQueryString = "Expr: " + query.Expr diff --git a/pkg/tsdb/loki/testdata/streams_simple.golden.txt b/pkg/tsdb/loki/testdata/streams_simple.golden.txt index 9cc8eec9918..9558819ec43 100644 --- a/pkg/tsdb/loki/testdata/streams_simple.golden.txt +++ b/pkg/tsdb/loki/testdata/streams_simple.golden.txt @@ -1,6 +1,9 @@ 🌟 This was machine generated. Do not edit. 🌟 Frame[0] { + "custom": { + "frameType": "LabeledTimeValues" + }, "stats": [ { "displayName": "Summary: bytes processed per second", @@ -128,4 +131,4 @@ Dimensions: 5 Fields by 6 Rows ====== TEST DATA RESPONSE (arrow base64) ====== -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== +FRAME=QVJST1cxAAD/////8AgAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANAGAAADAAAATAAAACgAAAAEAAAAmPf//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC49///CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANj3//8IAAAAaAYAAF0GAAB7ImN1c3RvbSI6eyJmcmFtZVR5cGUiOiJMYWJlbGVkVGltZVZhbHVlcyJ9LCJzdGF0cyI6W3siZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBieXRlcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInVuaXQiOiJCcHMiLCJ2YWx1ZSI6MzUwNzAyMn0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IGxpbmVzIHByb2Nlc3NlZCBwZXIgc2Vjb25kIiwidmFsdWUiOjI0ODE4fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgYnl0ZXMgcHJvY2Vzc2VkIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiB0b3RhbCBsaW5lcyBwcm9jZXNzZWQiLCJ2YWx1ZSI6NTV9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBleGVjIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMjIxNjEyNX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiB0b3RhbCBjaHVua3MgcmVmIiwidmFsdWUiOjJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIGRvd25sb2FkZWQiLCJ2YWx1ZSI6M30seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjaHVua3MgZG93bmxvYWQgdGltZSIsInVuaXQiOiJzIiwidmFsdWUiOjAuMDAwMzkwOTU4fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6NH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGxpbmVzIiwidmFsdWUiOjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjc3NzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MzE0MzJ9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjo2fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIHJlYWNoZWQiLCJ2YWx1ZSI6N30seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBjaHVua3MgbWF0Y2hlZCIsInZhbHVlIjo4fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGJhdGNoZXMiLCJ2YWx1ZSI6OX0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBsaW5lcyBzZW50IiwidmFsdWUiOjEwfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTF9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjoxMn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBkZWNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTN9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGxpbmVzIiwidmFsdWUiOjE0fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGNvbXByZXNzZWQgYnl0ZXMiLCJ1bml0IjoiZGVjYnl0ZXMiLCJ2YWx1ZSI6MTV9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgZHVwbGljYXRlcyIsInZhbHVlIjoxNn1dLCJleGVjdXRlZFF1ZXJ5U3RyaW5nIjoiRXhwcjogcXVlcnkxIn0AAAAEAAAA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CgAAAAgAAADQBgAAAwAAAEwAAAAoAAAABAAAAJj3//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAAuPf//wgAAAAMAAAAAAAAAAAAAAAEAAAAbmFtZQAAAADY9///CAAAAGgGAABdBgAAeyJjdXN0b20iOnsiZnJhbWVUeXBlIjoiTGFiZWxlZFRpbWVWYWx1ZXMifSwic3RhdHMiOlt7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogYnl0ZXMgcHJvY2Vzc2VkIHBlciBzZWNvbmQiLCJ1bml0IjoiQnBzIiwidmFsdWUiOjM1MDcwMjJ9LHsiZGlzcGxheU5hbWUiOiJTdW1tYXJ5OiBsaW5lcyBwcm9jZXNzZWQgcGVyIHNlY29uZCIsInZhbHVlIjoyNDgxOH0seyJkaXNwbGF5TmFtZSI6IlN1bW1hcnk6IHRvdGFsIGJ5dGVzIHByb2Nlc3NlZCIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogdG90YWwgbGluZXMgcHJvY2Vzc2VkIiwidmFsdWUiOjU1fSx7ImRpc3BsYXlOYW1lIjoiU3VtbWFyeTogZXhlYyB0aW1lIiwidW5pdCI6InMiLCJ2YWx1ZSI6MC4wMDIyMTYxMjV9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogdG90YWwgY2h1bmtzIHJlZiIsInZhbHVlIjoyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGNodW5rcyBkb3dubG9hZGVkIiwidmFsdWUiOjN9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogY2h1bmtzIGRvd25sb2FkIHRpbWUiLCJ1bml0IjoicyIsInZhbHVlIjowLjAwMDM5MDk1OH0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjR9LHsiZGlzcGxheU5hbWUiOiJTdG9yZTogaGVhZCBjaHVuayBsaW5lcyIsInZhbHVlIjo1fSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBieXRlcyIsInVuaXQiOiJkZWNieXRlcyIsInZhbHVlIjo3NzcyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjo1NX0seyJkaXNwbGF5TmFtZSI6IlN0b3JlOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjMxNDMyfSx7ImRpc3BsYXlOYW1lIjoiU3RvcmU6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6Nn0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCByZWFjaGVkIiwidmFsdWUiOjd9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgY2h1bmtzIG1hdGNoZWQiLCJ2YWx1ZSI6OH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiB0b3RhbCBiYXRjaGVzIiwidmFsdWUiOjl9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogdG90YWwgbGluZXMgc2VudCIsInZhbHVlIjoxMH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBoZWFkIGNodW5rIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjExfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGhlYWQgY2h1bmsgbGluZXMiLCJ2YWx1ZSI6MTJ9LHsiZGlzcGxheU5hbWUiOiJJbmdlc3RlcjogZGVjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjEzfSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IGRlY29tcHJlc3NlZCBsaW5lcyIsInZhbHVlIjoxNH0seyJkaXNwbGF5TmFtZSI6IkluZ2VzdGVyOiBjb21wcmVzc2VkIGJ5dGVzIiwidW5pdCI6ImRlY2J5dGVzIiwidmFsdWUiOjE1fSx7ImRpc3BsYXlOYW1lIjoiSW5nZXN0ZXI6IHRvdGFsIGR1cGxpY2F0ZXMiLCJ2YWx1ZSI6MTZ9XSwiZXhlY3V0ZWRRdWVyeVN0cmluZyI6IkV4cHI6IHF1ZXJ5MSJ9AAAABAAAAG1ldGEAAAAABQAAAIgBAAAQAQAAtAAAAFgAAAAEAAAAnv7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAACM/v//CAAAAAwAAAACAAAAaWQAAAQAAABuYW1lAAAAAAAAAACA/v//AgAAAGlkAADu/v//FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAANz+//8IAAAAEAAAAAQAAAB0c05zAAAAAAQAAABuYW1lAAAAAAAAAADU/v//BAAAAHRzTnMAAAAARv///xQAAAA8AAAAPAAAAAAAAAU4AAAAAQAAAAQAAAA0////CAAAABAAAAAEAAAATGluZQAAAAAEAAAAbmFtZQAAAAAAAAAALP///wQAAABMaW5lAAAAAJ7///8UAAAAPAAAAEQAAAAAAAAKRAAAAAEAAAAEAAAAjP///wgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAASAAAAAAAAAREAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAYAAABsYWJlbHMAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAYAAABsYWJlbHMAACAJAABBUlJPVzE= diff --git a/public/app/core/logs_model.test.ts b/public/app/core/logs_model.test.ts index 34ffa4d5671..4547b52f5eb 100644 --- a/public/app/core/logs_model.test.ts +++ b/public/app/core/logs_model.test.ts @@ -387,6 +387,9 @@ describe('dataFrameToLogsModel', () => { ], meta: { limit: 1000, + custom: { + frameType: 'LabeledTimeValues', + }, }, }), ]; @@ -464,15 +467,24 @@ describe('dataFrameToLogsModel', () => { values: ['line1'], }; + const meta = { + custom: { + frameType: 'LabeledTimeValues', + }, + }; + const frame1 = new MutableDataFrame({ + meta, fields: [labels, time, line], }); const frame2 = new MutableDataFrame({ + meta, fields: [time, labels, line], }); const frame3 = new MutableDataFrame({ + meta, fields: [time, line, labels], }); diff --git a/public/app/core/logs_model.ts b/public/app/core/logs_model.ts index 2e16093b144..7ab66c6f587 100644 --- a/public/app/core/logs_model.ts +++ b/public/app/core/logs_model.ts @@ -316,11 +316,11 @@ function getAllLabels(fields: LogFields): Labels[] { const { stringField, labelsField } = fields; - const fieldLabels = stringField.labels !== undefined ? [stringField.labels] : []; - - const labelsFieldLabels: Labels[] = labelsField !== undefined ? labelsField.values.toArray() : []; - - return [...fieldLabels, ...labelsFieldLabels]; + if (labelsField !== undefined) { + return labelsField.values.toArray(); + } else { + return [stringField.labels ?? {}]; + } } function getLabelsForFrameRow(fields: LogFields, index: number): Labels { @@ -329,10 +329,11 @@ function getLabelsForFrameRow(fields: LogFields, index: number): Labels { const { stringField, labelsField } = fields; - return { - ...stringField.labels, - ...labelsField?.values.get(index), - }; + if (labelsField !== undefined) { + return labelsField.values.get(index); + } else { + return stringField.labels ?? {}; + } } /** @@ -357,7 +358,11 @@ export function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefi const fieldCache = new FieldCache(series); const stringField = fieldCache.getFirstFieldOfType(FieldType.string); const timeField = fieldCache.getFirstFieldOfType(FieldType.time); - const labelsField = fieldCache.getFieldByName('labels'); + // NOTE: this is experimental, please do not use in your code. + // we will get this custom-frame-type into the "real" frame-type list soon, + // but the name might change, so please do not use it until then. + const labelsField = + series.meta?.custom?.frameType === 'LabeledTimeValues' ? fieldCache.getFieldByName('labels') : undefined; if (stringField !== undefined && timeField !== undefined) { const info = { diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts index 5c8e9c69180..050db46247d 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.test.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.test.ts @@ -22,6 +22,9 @@ const inputFrame: DataFrame = { refId: 'A', meta: { executedQueryString: LOKI_EXPR, + custom: { + frameType: 'LabeledTimeValues', + }, }, fields: [ { @@ -71,6 +74,7 @@ describe('loki backendResultTransformer', () => { preferredVisualisationType: 'logs', searchWords: ['thing1'], custom: { + ...expectedFrame.meta?.custom, lokiQueryStatKey: 'Summary: total bytes processed', }, }; diff --git a/public/app/plugins/datasource/loki/backendResultTransformer.ts b/public/app/plugins/datasource/loki/backendResultTransformer.ts index 5b559209f89..2154eeb19f1 100644 --- a/public/app/plugins/datasource/loki/backendResultTransformer.ts +++ b/public/app/plugins/datasource/loki/backendResultTransformer.ts @@ -10,7 +10,7 @@ function isMetricFrame(frame: DataFrame): boolean { return frame.fields.every((field) => field.type === FieldType.time || field.type === FieldType.number); } -// returns a new frame, with meta merged with it's original meta +// returns a new frame, with meta shallow merged with it's original meta function setFrameMeta(frame: DataFrame, meta: QueryResultMeta): DataFrame { const { meta: oldMeta, ...rest } = frame; // meta maybe be undefined, we need to handle that @@ -27,6 +27,7 @@ function processStreamFrame( derivedFieldConfigs: DerivedFieldConfig[] ): DataFrame { const custom: Record = { + ...frame.meta?.custom, // keep the original meta.custom // used by logs_model lokiQueryStatKey: 'Summary: total bytes processed', }; diff --git a/public/app/plugins/datasource/loki/result_transformer.ts b/public/app/plugins/datasource/loki/result_transformer.ts index 5e855e67ad7..31ff9fd7ec2 100644 --- a/public/app/plugins/datasource/loki/result_transformer.ts +++ b/public/app/plugins/datasource/loki/result_transformer.ts @@ -334,6 +334,9 @@ export function lokiStreamsToDataFrames( // Use custom mechanism to identify which stat we want to promote to label const custom = { lokiQueryStatKey: 'Summary: total bytes processed', + // TODO: when we get a real frame-type in @grafana/data + // move this to frame.meta.type + frameType: 'LabeledTimeValues', }; const meta: QueryResultMeta = {