From 9529c35efa7b919c1ff9e4a3b530c08cc98500bd Mon Sep 17 00:00:00 2001 From: Todd Treece <360020+toddtreece@users.noreply.github.com> Date: Wed, 4 May 2022 20:26:32 -0400 Subject: [PATCH] Converter: Add support for parsing prometheus string (#48727) --- pkg/util/converter/prom.go | 29 ++++++++++++++ pkg/util/converter/prom_test.go | 1 + .../converter/testdata/prom-string-frame.json | 40 +++++++++++++++++++ .../converter/testdata/prom-string-golden.txt | 18 +++++++++ pkg/util/converter/testdata/prom-string.json | 10 +++++ 5 files changed, 98 insertions(+) create mode 100644 pkg/util/converter/testdata/prom-string-frame.json create mode 100644 pkg/util/converter/testdata/prom-string-golden.txt create mode 100644 pkg/util/converter/testdata/prom-string.json diff --git a/pkg/util/converter/prom.go b/pkg/util/converter/prom.go index f158206b9d5..43a7ff3e964 100644 --- a/pkg/util/converter/prom.go +++ b/pkg/util/converter/prom.go @@ -111,6 +111,8 @@ func readPrometheusData(iter *jsoniter.Iterator) *backend.DataResponse { rsp = readMatrixOrVector(iter) case "streams": rsp = readStream(iter) + case "string": + rsp = readString(iter) case "scalar": rsp = readScalar(iter) default: @@ -290,6 +292,33 @@ func readLabelsOrExemplars(iter *jsoniter.Iterator) (*data.Frame, [][2]string) { return frame, pairs } +func readString(iter *jsoniter.Iterator) *backend.DataResponse { + timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) + timeField.Name = data.TimeSeriesTimeFieldName + valueField := data.NewFieldFromFieldType(data.FieldTypeString, 0) + valueField.Name = data.TimeSeriesValueFieldName + valueField.Labels = data.Labels{} + + iter.ReadArray() + t := iter.ReadFloat64() + iter.ReadArray() + v := iter.ReadString() + iter.ReadArray() + + tt := timeFromFloat(t) + timeField.Append(tt) + valueField.Append(v) + + frame := data.NewFrame("", timeField, valueField) + frame.Meta = &data.FrameMeta{ + Type: data.FrameTypeTimeSeriesMany, + } + + return &backend.DataResponse{ + Frames: []*data.Frame{frame}, + } +} + func readScalar(iter *jsoniter.Iterator) *backend.DataResponse { timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeField.Name = data.TimeSeriesTimeFieldName diff --git a/pkg/util/converter/prom_test.go b/pkg/util/converter/prom_test.go index c1a4f1692c7..4fc854ca56f 100644 --- a/pkg/util/converter/prom_test.go +++ b/pkg/util/converter/prom_test.go @@ -19,6 +19,7 @@ func TestReadPromFrames(t *testing.T) { "prom-matrix", "prom-matrix-with-nans", "prom-vector", + "prom-string", "prom-scalar", "prom-series", "prom-warnings", diff --git a/pkg/util/converter/testdata/prom-string-frame.json b/pkg/util/converter/testdata/prom-string-frame.json new file mode 100644 index 00000000000..49f65d538b1 --- /dev/null +++ b/pkg/util/converter/testdata/prom-string-frame.json @@ -0,0 +1,40 @@ +{ + "frames": [ + { + "schema": { + "meta": { + "type": "timeseries-many" + }, + "fields": [ + { + "name": "Time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "Value", + "type": "string", + "typeInfo": { + "frame": "string" + }, + "labels": { + + } + } + ] + }, + "data": { + "values": [ + [ + 1651680139104 + ], + [ + "example" + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/pkg/util/converter/testdata/prom-string-golden.txt b/pkg/util/converter/testdata/prom-string-golden.txt new file mode 100644 index 00000000000..3ff1517f6c4 --- /dev/null +++ b/pkg/util/converter/testdata/prom-string-golden.txt @@ -0,0 +1,18 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] { + "type": "timeseries-many" +} +Name: +Dimensions: 2 Fields by 1 Rows ++-----------------------------------+----------------+ +| Name: Time | Name: Value | +| Labels: | Labels: | +| Type: []time.Time | Type: []string | ++-----------------------------------+----------------+ +| 2022-05-04 16:02:19.104 +0000 UTC | example | ++-----------------------------------+----------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////yAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAzP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADs/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAAz///8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAJgAAAAEAAAAgv///xQAAABgAAAAZAAAAAAAAAVgAAAAAgAAACwAAAAEAAAAdP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAmP///wgAAAAMAAAAAgAAAHt9AAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAAAAAAP/////IAAAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAGAAAAAAAAAAUAAAAAAAAAwQACgAYAAwACAAEAAoAAAAUAAAAaAAAAAEAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAHAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAmNzlVfLrFgAAAAAHAAAAZXhhbXBsZQAQAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAABAABAAAA2AEAAAAAAADQAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAzP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADs/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAAz///8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAJgAAAAEAAAAgv///xQAAABgAAAAZAAAAAAAAAVgAAAAAgAAACwAAAAEAAAAdP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAmP///wgAAAAMAAAAAgAAAHt9AAAGAAAAbGFiZWxzAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAA8AEAAEFSUk9XMQ== diff --git a/pkg/util/converter/testdata/prom-string.json b/pkg/util/converter/testdata/prom-string.json new file mode 100644 index 00000000000..9d2e967356a --- /dev/null +++ b/pkg/util/converter/testdata/prom-string.json @@ -0,0 +1,10 @@ +{ + "status": "success", + "data": { + "resultType": "string", + "result": [ + 1651680139.104, + "example" + ] + } +} \ No newline at end of file