mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Converter: use streaming JSON parser to construct frames from loki/prometheus responses (#44520)
This commit is contained in:
386
pkg/util/converter/prom.go
Normal file
386
pkg/util/converter/prom.go
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
package converter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
)
|
||||||
|
|
||||||
|
// helpful while debugging all the options that may appear
|
||||||
|
func logf(format string, a ...interface{}) {
|
||||||
|
//fmt.Printf(format, a...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadPrometheusStyleResult will read results from a prometheus or loki server and return data frames
|
||||||
|
func ReadPrometheusStyleResult(iter *jsoniter.Iterator) *backend.DataResponse {
|
||||||
|
var rsp *backend.DataResponse
|
||||||
|
status := "unknown"
|
||||||
|
|
||||||
|
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
|
||||||
|
switch l1Field {
|
||||||
|
case "status":
|
||||||
|
status = iter.ReadString()
|
||||||
|
|
||||||
|
case "data":
|
||||||
|
rsp = readPrometheusData(iter)
|
||||||
|
|
||||||
|
// case "error":
|
||||||
|
// case "errorType":
|
||||||
|
// case "warnings":
|
||||||
|
default:
|
||||||
|
v := iter.Read()
|
||||||
|
logf("[ROOT] TODO, support key: %s / %v\n", l1Field, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if status != "success" {
|
||||||
|
logf("ERROR: %s\n", status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsp
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPrometheusData(iter *jsoniter.Iterator) *backend.DataResponse {
|
||||||
|
t := iter.WhatIsNext()
|
||||||
|
if t == jsoniter.ArrayValue {
|
||||||
|
return readArrayData(iter)
|
||||||
|
}
|
||||||
|
|
||||||
|
if t != jsoniter.ObjectValue {
|
||||||
|
return &backend.DataResponse{
|
||||||
|
Error: fmt.Errorf("expected object type"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resultType := ""
|
||||||
|
var rsp *backend.DataResponse
|
||||||
|
|
||||||
|
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
|
||||||
|
switch l1Field {
|
||||||
|
case "resultType":
|
||||||
|
resultType = iter.ReadString()
|
||||||
|
|
||||||
|
case "result":
|
||||||
|
switch resultType {
|
||||||
|
case "matrix":
|
||||||
|
rsp = readMatrixOrVector(iter)
|
||||||
|
case "vector":
|
||||||
|
rsp = readMatrixOrVector(iter)
|
||||||
|
case "streams":
|
||||||
|
rsp = readStream(iter)
|
||||||
|
default:
|
||||||
|
iter.Skip()
|
||||||
|
rsp = &backend.DataResponse{
|
||||||
|
Error: fmt.Errorf("unknown result type: %s", resultType),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case "stats":
|
||||||
|
v := iter.Read()
|
||||||
|
if len(rsp.Frames) > 0 {
|
||||||
|
meta := rsp.Frames[0].Meta
|
||||||
|
if meta == nil {
|
||||||
|
meta = &data.FrameMeta{}
|
||||||
|
rsp.Frames[0].Meta = meta
|
||||||
|
}
|
||||||
|
meta.Custom = map[string]interface{}{
|
||||||
|
"stats": v,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
v := iter.Read()
|
||||||
|
logf("[data] TODO, support key: %s / %v\n", l1Field, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsp
|
||||||
|
}
|
||||||
|
|
||||||
|
// will return strings or exemplars
|
||||||
|
func readArrayData(iter *jsoniter.Iterator) *backend.DataResponse {
|
||||||
|
lookup := make(map[string]*data.Field)
|
||||||
|
|
||||||
|
var labelFrame *data.Frame
|
||||||
|
rsp := &backend.DataResponse{}
|
||||||
|
stringField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
stringField.Name = "Value"
|
||||||
|
for iter.ReadArray() {
|
||||||
|
switch iter.WhatIsNext() {
|
||||||
|
case jsoniter.StringValue:
|
||||||
|
stringField.Append(iter.ReadString())
|
||||||
|
|
||||||
|
// Either label or exemplars
|
||||||
|
case jsoniter.ObjectValue:
|
||||||
|
exemplar, labelPairs := readLabelsOrExemplars(iter)
|
||||||
|
if exemplar != nil {
|
||||||
|
rsp.Frames = append(rsp.Frames, exemplar)
|
||||||
|
} else if labelPairs != nil {
|
||||||
|
max := 0
|
||||||
|
for _, pair := range labelPairs {
|
||||||
|
k := pair[0]
|
||||||
|
v := pair[1]
|
||||||
|
f, ok := lookup[k]
|
||||||
|
if !ok {
|
||||||
|
f = data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
f.Name = k
|
||||||
|
lookup[k] = f
|
||||||
|
|
||||||
|
if labelFrame == nil {
|
||||||
|
labelFrame = data.NewFrame("")
|
||||||
|
rsp.Frames = append(rsp.Frames, labelFrame)
|
||||||
|
}
|
||||||
|
labelFrame.Fields = append(labelFrame.Fields, f)
|
||||||
|
}
|
||||||
|
f.Append(fmt.Sprintf("%v", v))
|
||||||
|
if f.Len() > max {
|
||||||
|
max = f.Len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure all fields have equal length
|
||||||
|
for _, f := range lookup {
|
||||||
|
diff := max - f.Len()
|
||||||
|
if diff > 0 {
|
||||||
|
f.Extend(diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
ext := iter.ReadAny()
|
||||||
|
v := fmt.Sprintf("%v", ext)
|
||||||
|
stringField.Append(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if rsp.Frames == nil || stringField.Len() > 0 {
|
||||||
|
rsp.Frames = append(rsp.Frames, data.NewFrame("", stringField))
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsp
|
||||||
|
}
|
||||||
|
|
||||||
|
// For consistent ordering read values to an array not a map
|
||||||
|
func readLabelsAsPairs(iter *jsoniter.Iterator) [][2]string {
|
||||||
|
pairs := make([][2]string, 0, 10)
|
||||||
|
for k := iter.ReadObject(); k != ""; k = iter.ReadObject() {
|
||||||
|
pairs = append(pairs, [2]string{k, iter.ReadString()})
|
||||||
|
}
|
||||||
|
return pairs
|
||||||
|
}
|
||||||
|
|
||||||
|
func readLabelsOrExemplars(iter *jsoniter.Iterator) (*data.Frame, [][2]string) {
|
||||||
|
pairs := make([][2]string, 0, 10)
|
||||||
|
labels := data.Labels{}
|
||||||
|
var frame *data.Frame
|
||||||
|
|
||||||
|
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
|
||||||
|
switch l1Field {
|
||||||
|
case "seriesLabels":
|
||||||
|
iter.ReadVal(&labels)
|
||||||
|
case "exemplars":
|
||||||
|
lookup := make(map[string]*data.Field)
|
||||||
|
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
|
||||||
|
valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0)
|
||||||
|
valueField.Name = labels["__name__"]
|
||||||
|
delete(labels, "__name__")
|
||||||
|
valueField.Labels = labels
|
||||||
|
frame = data.NewFrame("", timeField, valueField)
|
||||||
|
for iter.ReadArray() {
|
||||||
|
for l2Field := iter.ReadObject(); l2Field != ""; l2Field = iter.ReadObject() {
|
||||||
|
switch l2Field {
|
||||||
|
// nolint:goconst
|
||||||
|
case "value":
|
||||||
|
v, _ := strconv.ParseFloat(iter.ReadString(), 64)
|
||||||
|
valueField.Append(v)
|
||||||
|
|
||||||
|
case "timestamp":
|
||||||
|
ts := timeFromFloat(iter.ReadFloat64())
|
||||||
|
timeField.Append(ts)
|
||||||
|
|
||||||
|
case "labels":
|
||||||
|
max := 0
|
||||||
|
for _, pair := range readLabelsAsPairs(iter) {
|
||||||
|
k := pair[0]
|
||||||
|
v := pair[1]
|
||||||
|
f, ok := lookup[k]
|
||||||
|
if !ok {
|
||||||
|
f = data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
f.Name = k
|
||||||
|
lookup[k] = f
|
||||||
|
frame.Fields = append(frame.Fields, f)
|
||||||
|
}
|
||||||
|
f.Append(v)
|
||||||
|
if f.Len() > max {
|
||||||
|
max = f.Len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure all fields have equal length
|
||||||
|
for _, f := range lookup {
|
||||||
|
diff := max - f.Len()
|
||||||
|
if diff > 0 {
|
||||||
|
f.Extend(diff)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
iter.Skip()
|
||||||
|
frame.AppendNotices(data.Notice{
|
||||||
|
Severity: data.NoticeSeverityError,
|
||||||
|
Text: fmt.Sprintf("unable to parse key: %s in response body", l2Field),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
v := fmt.Sprintf("%v", iter.Read())
|
||||||
|
pairs = append(pairs, [2]string{l1Field, v})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return frame, pairs
|
||||||
|
}
|
||||||
|
|
||||||
|
func readMatrixOrVector(iter *jsoniter.Iterator) *backend.DataResponse {
|
||||||
|
rsp := &backend.DataResponse{}
|
||||||
|
|
||||||
|
for iter.ReadArray() {
|
||||||
|
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
|
||||||
|
timeField.Name = data.TimeSeriesTimeFieldName
|
||||||
|
valueField := data.NewFieldFromFieldType(data.FieldTypeFloat64, 0)
|
||||||
|
valueField.Labels = data.Labels{}
|
||||||
|
|
||||||
|
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
|
||||||
|
switch l1Field {
|
||||||
|
case "metric":
|
||||||
|
iter.ReadVal(&valueField.Labels)
|
||||||
|
|
||||||
|
case "value":
|
||||||
|
t, v, err := readTimeValuePair(iter)
|
||||||
|
if err == nil {
|
||||||
|
timeField.Append(t)
|
||||||
|
valueField.Append(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// nolint:goconst
|
||||||
|
case "values":
|
||||||
|
for iter.ReadArray() {
|
||||||
|
t, v, err := readTimeValuePair(iter)
|
||||||
|
if err == nil {
|
||||||
|
timeField.Append(t)
|
||||||
|
valueField.Append(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
name, ok := valueField.Labels["__name__"]
|
||||||
|
if ok {
|
||||||
|
valueField.Name = name
|
||||||
|
delete(valueField.Labels, "__name__")
|
||||||
|
} else {
|
||||||
|
valueField.Name = data.TimeSeriesValueFieldName
|
||||||
|
}
|
||||||
|
|
||||||
|
frame := data.NewFrame("", timeField, valueField)
|
||||||
|
frame.Meta = &data.FrameMeta{
|
||||||
|
Type: data.FrameTypeTimeSeriesMany,
|
||||||
|
}
|
||||||
|
rsp.Frames = append(rsp.Frames, frame)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsp
|
||||||
|
}
|
||||||
|
|
||||||
|
func readTimeValuePair(iter *jsoniter.Iterator) (time.Time, float64, error) {
|
||||||
|
iter.ReadArray()
|
||||||
|
t := iter.ReadFloat64()
|
||||||
|
iter.ReadArray()
|
||||||
|
v := iter.ReadString()
|
||||||
|
iter.ReadArray()
|
||||||
|
|
||||||
|
tt := timeFromFloat(t)
|
||||||
|
fv, err := strconv.ParseFloat(v, 64)
|
||||||
|
return tt, fv, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func readStream(iter *jsoniter.Iterator) *backend.DataResponse {
|
||||||
|
rsp := &backend.DataResponse{}
|
||||||
|
|
||||||
|
labelsField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
labelsField.Name = "__labels" // avoid automatically spreading this by labels
|
||||||
|
|
||||||
|
timeField := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
|
||||||
|
timeField.Name = "Time"
|
||||||
|
|
||||||
|
lineField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
lineField.Name = "Line"
|
||||||
|
|
||||||
|
// Nanoseconds time field
|
||||||
|
tsField := data.NewFieldFromFieldType(data.FieldTypeString, 0)
|
||||||
|
tsField.Name = "TS"
|
||||||
|
|
||||||
|
labels := data.Labels{}
|
||||||
|
labelString := labels.String()
|
||||||
|
|
||||||
|
for iter.ReadArray() {
|
||||||
|
for l1Field := iter.ReadObject(); l1Field != ""; l1Field = iter.ReadObject() {
|
||||||
|
switch l1Field {
|
||||||
|
case "stream":
|
||||||
|
iter.ReadVal(&labels)
|
||||||
|
labelString = labels.String()
|
||||||
|
|
||||||
|
case "values":
|
||||||
|
for iter.ReadArray() {
|
||||||
|
iter.ReadArray()
|
||||||
|
ts := iter.ReadString()
|
||||||
|
iter.ReadArray()
|
||||||
|
line := iter.ReadString()
|
||||||
|
iter.ReadArray()
|
||||||
|
|
||||||
|
t := timeFromLokiString(ts)
|
||||||
|
|
||||||
|
labelsField.Append(labelString)
|
||||||
|
timeField.Append(t)
|
||||||
|
lineField.Append(line)
|
||||||
|
tsField.Append(ts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frame := data.NewFrame("", labelsField, timeField, lineField, tsField)
|
||||||
|
frame.Meta = &data.FrameMeta{}
|
||||||
|
rsp.Frames = append(rsp.Frames, frame)
|
||||||
|
|
||||||
|
return rsp
|
||||||
|
}
|
||||||
|
|
||||||
|
func timeFromFloat(fv float64) time.Time {
|
||||||
|
return time.UnixMilli(int64(fv * 1000.0)).UTC()
|
||||||
|
}
|
||||||
|
|
||||||
|
func timeFromLokiString(str string) time.Time {
|
||||||
|
// normal time values look like: 1645030246277587968
|
||||||
|
// and are less than: math.MaxInt65=9223372036854775807
|
||||||
|
// This will do a fast path for any date before 2033
|
||||||
|
s := len(str)
|
||||||
|
if s < 19 || (s == 19 && str[0] == '1') {
|
||||||
|
ns, err := strconv.ParseInt(str, 10, 64)
|
||||||
|
if err == nil {
|
||||||
|
return time.Unix(0, ns).UTC()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ss, _ := strconv.ParseInt(str[0:10], 10, 64)
|
||||||
|
ns, _ := strconv.ParseInt(str[10:], 10, 64)
|
||||||
|
return time.Unix(ss, ns).UTC()
|
||||||
|
}
|
||||||
83
pkg/util/converter/prom_test.go
Normal file
83
pkg/util/converter/prom_test.go
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
package converter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana-plugin-sdk-go/experimental"
|
||||||
|
jsoniter "github.com/json-iterator/go"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestReadPromFrames(t *testing.T) {
|
||||||
|
files := []string{
|
||||||
|
"prom-labels",
|
||||||
|
"prom-matrix",
|
||||||
|
"prom-matrix-with-nans",
|
||||||
|
"prom-vector",
|
||||||
|
"prom-series",
|
||||||
|
"prom-exemplars",
|
||||||
|
"loki-streams-a",
|
||||||
|
"loki-streams-b",
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, name := range files {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
// nolint:gosec
|
||||||
|
// We can ignore the gosec G304 because this is a test with static defined paths
|
||||||
|
f, err := os.Open(path.Join("testdata", name+".json"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
iter := jsoniter.Parse(jsoniter.ConfigDefault, f, 1024)
|
||||||
|
rsp := ReadPrometheusStyleResult(iter)
|
||||||
|
|
||||||
|
out, err := jsoniter.MarshalIndent(rsp, "", " ")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
save := false
|
||||||
|
fpath := path.Join("testdata", name+"-frame.json")
|
||||||
|
|
||||||
|
// nolint:gosec
|
||||||
|
// We can ignore the gosec G304 because this is a test with static defined paths
|
||||||
|
current, err := ioutil.ReadFile(fpath)
|
||||||
|
if err == nil {
|
||||||
|
same := assert.JSONEq(t, string(out), string(current))
|
||||||
|
if !same {
|
||||||
|
save = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
assert.Fail(t, "missing file: "+fpath)
|
||||||
|
save = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if save {
|
||||||
|
err = os.WriteFile(fpath, out, 0600)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fpath = path.Join("testdata", name+"-golden.txt")
|
||||||
|
err = experimental.CheckGoldenDataResponse(fpath, rsp, true)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTimeConversions(t *testing.T) {
|
||||||
|
// include millisecond precision
|
||||||
|
assert.Equal(t,
|
||||||
|
time.Date(2020, time.September, 14, 15, 22, 25, 479000000, time.UTC),
|
||||||
|
timeFromFloat(1600096945.479))
|
||||||
|
|
||||||
|
// Loki date parsing
|
||||||
|
assert.Equal(t,
|
||||||
|
time.Date(2022, time.February, 16, 16, 50, 46, 277587968, time.UTC),
|
||||||
|
timeFromLokiString("1645030246277587968"))
|
||||||
|
|
||||||
|
assert.Equal(t,
|
||||||
|
time.Date(2033, time.May, 18, 3, 33, 20, 0, time.UTC),
|
||||||
|
timeFromLokiString("2000000000000000000"))
|
||||||
|
}
|
||||||
90
pkg/util/converter/testdata/loki-streams-a-frame.json
vendored
Normal file
90
pkg/util/converter/testdata/loki-streams-a-frame.json
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"custom": {
|
||||||
|
"stats": {
|
||||||
|
"ingester": {
|
||||||
|
"totalChunksMatched": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"totalReached": 0,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"decompressedBytes": 0
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55,
|
||||||
|
"execTime": 0.002216125
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"totalChunksRef": 2,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"chunksDownloadTime": 0.000390958
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "__labels",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Line",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TS",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"level=error, location=moon🌙","level=info, location=moon🌙","level=info, location=moon🌙","level=info, location=moon🌙","level=info, location=moon🌙","level=info, location=moon🌙"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1645030244810,1645030247027,1645030246277,1645030246277,1645030245539,1645030244091
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"log line error 1","log line info 1","log line info 2","log line info 2","log line info 3","log line info 4"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030244810757120","1645030247027735040","1645030246277587968","1645030246277587968","1645030245539423744","1645030244091700992"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
56
pkg/util/converter/testdata/loki-streams-a-golden.txt
vendored
Normal file
56
pkg/util/converter/testdata/loki-streams-a-golden.txt
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {
|
||||||
|
"custom": {
|
||||||
|
"stats": {
|
||||||
|
"ingester": {
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"decompressedBytes": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalChunksMatched": 0,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"totalReached": 0
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"chunksDownloadTime": 0.000390958,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"totalChunksRef": 2,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"execTime": 0.002216125,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 4 Fields by 6 Rows
|
||||||
|
+------------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
| Name: __labels | Name: Time | Name: Line | Name: TS |
|
||||||
|
| Labels: | Labels: | Labels: | Labels: |
|
||||||
|
| Type: []string | Type: []time.Time | Type: []string | Type: []string |
|
||||||
|
+------------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
| level=error, location=moon🌙 | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 |
|
||||||
|
| level=info, location=moon🌙 | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 |
|
||||||
|
| level=info, location=moon🌙 | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 |
|
||||||
|
| level=info, location=moon🌙 | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 |
|
||||||
|
| level=info, location=moon🌙 | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 |
|
||||||
|
| level=info, location=moon🌙 | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 |
|
||||||
|
+------------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////oAQAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANACAAADAAAATAAAACgAAAAEAAAA9Pv//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAU/P//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAADT8//8IAAAAaAIAAFwCAAB7ImN1c3RvbSI6eyJzdGF0cyI6eyJpbmdlc3RlciI6eyJjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZEJ5dGVzIjowLCJkZWNvbXByZXNzZWRMaW5lcyI6MCwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbEJhdGNoZXMiOjAsInRvdGFsQ2h1bmtzTWF0Y2hlZCI6MCwidG90YWxEdXBsaWNhdGVzIjowLCJ0b3RhbExpbmVzU2VudCI6MCwidG90YWxSZWFjaGVkIjowfSwic3RvcmUiOnsiY2h1bmtzRG93bmxvYWRUaW1lIjowLjAwMDM5MDk1OCwiY29tcHJlc3NlZEJ5dGVzIjozMTQzMiwiZGVjb21wcmVzc2VkQnl0ZXMiOjc3NzIsImRlY29tcHJlc3NlZExpbmVzIjo1NSwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbENodW5rc0Rvd25sb2FkZWQiOjIsInRvdGFsQ2h1bmtzUmVmIjoyLCJ0b3RhbER1cGxpY2F0ZXMiOjB9LCJzdW1tYXJ5Ijp7ImJ5dGVzUHJvY2Vzc2VkUGVyU2Vjb25kIjozNTA3MDIyLCJleGVjVGltZSI6MC4wMDIyMTYxMjUsImxpbmVzUHJvY2Vzc2VkUGVyU2Vjb25kIjoyNDgxOCwidG90YWxCeXRlc1Byb2Nlc3NlZCI6Nzc3MiwidG90YWxMaW5lc1Byb2Nlc3NlZCI6NTV9fX19AAAAAAQAAABtZXRhAAAAAAQAAAAsAQAAtAAAAFgAAAAEAAAA9v7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAADk/v//CAAAAAwAAAACAAAAVFMAAAQAAABuYW1lAAAAAAAAAADU/v//AgAAAFRTAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAo////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbGFiZWxzAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX2xhYmVscwAAAAAAAAAA/////0gBAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAYAgAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAADIAAAABgAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAIAAAAAAAAACvAAAAAAAAANAAAAAAAAAAAAAAAAAAAADQAAAAAAAAADAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAHAAAAAAAAAAgAQAAAAAAAFsAAAAAAAAAgAEAAAAAAAAAAAAAAAAAAIABAAAAAAAAHAAAAAAAAACgAQAAAAAAAHIAAAAAAAAAAAAAAAQAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAA7AAAAWAAAAHUAAACSAAAArwAAAAAAAABsZXZlbD1lcnJvciwgbG9jYXRpb249bW9vbvCfjJlsZXZlbD1pbmZvLCBsb2NhdGlvbj1tb29u8J+MmWxldmVsPWluZm8sIGxvY2F0aW9uPW1vb27wn4yZbGV2ZWw9aW5mbywgbG9jYXRpb249bW9vbvCfjJlsZXZlbD1pbmZvLCBsb2NhdGlvbj1tb29u8J+MmWxldmVsPWluZm8sIGxvY2F0aW9uPW1vb27wn4yZAAAUuLpKUtQWAHrcPktS1BYAJCYSS1LUFgAkJhJLUtQWAKYm5kpS1BYAJ9yPSlLUFgAAAAAQAAAAHwAAAC4AAAA9AAAATAAAAFsAAAAAAAAAbG9nIGxpbmUgZXJyb3IgMWxvZyBsaW5lIGluZm8gMWxvZyBsaW5lIGluZm8gMmxvZyBsaW5lIGluZm8gMmxvZyBsaW5lIGluZm8gM2xvZyBsaW5lIGluZm8gNAAAAAAAAAAAABMAAAAmAAAAOQAAAEwAAABfAAAAcgAAAAAAAAAxNjQ1MDMwMjQ0ODEwNzU3MTIwMTY0NTAzMDI0NzAyNzczNTA0MDE2NDUwMzAyNDYyNzc1ODc5NjgxNjQ1MDMwMjQ2Mjc3NTg3OTY4MTY0NTAzMDI0NTUzOTQyMzc0NDE2NDUwMzAyNDQwOTE3MDA5OTIAAAAAAAAQAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAABAABAAAAsAQAAAAAAABQAQAAAAAAABgCAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAANACAAADAAAATAAAACgAAAAEAAAA9Pv//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAU/P//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAADT8//8IAAAAaAIAAFwCAAB7ImN1c3RvbSI6eyJzdGF0cyI6eyJpbmdlc3RlciI6eyJjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZEJ5dGVzIjowLCJkZWNvbXByZXNzZWRMaW5lcyI6MCwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbEJhdGNoZXMiOjAsInRvdGFsQ2h1bmtzTWF0Y2hlZCI6MCwidG90YWxEdXBsaWNhdGVzIjowLCJ0b3RhbExpbmVzU2VudCI6MCwidG90YWxSZWFjaGVkIjowfSwic3RvcmUiOnsiY2h1bmtzRG93bmxvYWRUaW1lIjowLjAwMDM5MDk1OCwiY29tcHJlc3NlZEJ5dGVzIjozMTQzMiwiZGVjb21wcmVzc2VkQnl0ZXMiOjc3NzIsImRlY29tcHJlc3NlZExpbmVzIjo1NSwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbENodW5rc0Rvd25sb2FkZWQiOjIsInRvdGFsQ2h1bmtzUmVmIjoyLCJ0b3RhbER1cGxpY2F0ZXMiOjB9LCJzdW1tYXJ5Ijp7ImJ5dGVzUHJvY2Vzc2VkUGVyU2Vjb25kIjozNTA3MDIyLCJleGVjVGltZSI6MC4wMDIyMTYxMjUsImxpbmVzUHJvY2Vzc2VkUGVyU2Vjb25kIjoyNDgxOCwidG90YWxCeXRlc1Byb2Nlc3NlZCI6Nzc3MiwidG90YWxMaW5lc1Byb2Nlc3NlZCI6NTV9fX19AAAAAAQAAABtZXRhAAAAAAQAAAAsAQAAtAAAAFgAAAAEAAAA9v7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAADk/v//CAAAAAwAAAACAAAAVFMAAAQAAABuYW1lAAAAAAAAAADU/v//AgAAAFRTAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAo////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbGFiZWxzAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX2xhYmVscwAAAADIBAAAQVJST1cx
|
||||||
81
pkg/util/converter/testdata/loki-streams-a.json
vendored
Normal file
81
pkg/util/converter/testdata/loki-streams-a.json
vendored
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"resultType": "streams",
|
||||||
|
"result": [
|
||||||
|
{
|
||||||
|
"stream": {
|
||||||
|
"level": "error",
|
||||||
|
"location": "moon🌙"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"1645030244810757120",
|
||||||
|
"log line error 1"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stream": {
|
||||||
|
"level": "info",
|
||||||
|
"location": "moon🌙"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"1645030247027735040",
|
||||||
|
"log line info 1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030246277587968",
|
||||||
|
"log line info 2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030246277587968",
|
||||||
|
"log line info 2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030245539423744",
|
||||||
|
"log line info 3"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030244091700992",
|
||||||
|
"log line info 4"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stats": {
|
||||||
|
"summary": {
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55,
|
||||||
|
"execTime": 0.002216125
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"totalChunksRef": 2,
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"chunksDownloadTime": 0.000390958,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
},
|
||||||
|
"ingester": {
|
||||||
|
"totalReached": 0,
|
||||||
|
"totalChunksMatched": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
90
pkg/util/converter/testdata/loki-streams-b-frame.json
vendored
Normal file
90
pkg/util/converter/testdata/loki-streams-b-frame.json
vendored
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"custom": {
|
||||||
|
"stats": {
|
||||||
|
"summary": {
|
||||||
|
"execTime": 0.002216125,
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"chunksDownloadTime": 0.000390958,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"totalChunksRef": 2
|
||||||
|
},
|
||||||
|
"ingester": {
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"decompressedBytes": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"totalReached": 0,
|
||||||
|
"totalChunksMatched": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "__labels",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Line",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "TS",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"level=error, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon","level=info, location=moon"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1645030244810,1645030247027,1645030246277,1645030245539,1645030244091
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"log line error 1","log line info 1","log line info 2","log line info 3","log line info 4"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030244810757120","1645030247027735040","1645030246277587968","1645030245539423744","1645030244091700992"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
55
pkg/util/converter/testdata/loki-streams-b-golden.txt
vendored
Normal file
55
pkg/util/converter/testdata/loki-streams-b-golden.txt
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {
|
||||||
|
"custom": {
|
||||||
|
"stats": {
|
||||||
|
"ingester": {
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"decompressedBytes": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalChunksMatched": 0,
|
||||||
|
"totalDuplicates": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"totalReached": 0
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"chunksDownloadTime": 0.000390958,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"totalChunksRef": 2,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"execTime": 0.002216125,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 4 Fields by 5 Rows
|
||||||
|
+----------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
| Name: __labels | Name: Time | Name: Line | Name: TS |
|
||||||
|
| Labels: | Labels: | Labels: | Labels: |
|
||||||
|
| Type: []string | Type: []time.Time | Type: []string | Type: []string |
|
||||||
|
+----------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
| level=error, location=moon | 2022-02-16 16:50:44.81075712 +0000 UTC | log line error 1 | 1645030244810757120 |
|
||||||
|
| level=info, location=moon | 2022-02-16 16:50:47.02773504 +0000 UTC | log line info 1 | 1645030247027735040 |
|
||||||
|
| level=info, location=moon | 2022-02-16 16:50:46.277587968 +0000 UTC | log line info 2 | 1645030246277587968 |
|
||||||
|
| level=info, location=moon | 2022-02-16 16:50:45.539423744 +0000 UTC | log line info 3 | 1645030245539423744 |
|
||||||
|
| level=info, location=moon | 2022-02-16 16:50:44.091700992 +0000 UTC | log line info 4 | 1645030244091700992 |
|
||||||
|
+----------------------------+-----------------------------------------+------------------+---------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////oAQAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAANACAAADAAAATAAAACgAAAAEAAAA9Pv//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAU/P//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAADT8//8IAAAAaAIAAFwCAAB7ImN1c3RvbSI6eyJzdGF0cyI6eyJpbmdlc3RlciI6eyJjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZEJ5dGVzIjowLCJkZWNvbXByZXNzZWRMaW5lcyI6MCwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbEJhdGNoZXMiOjAsInRvdGFsQ2h1bmtzTWF0Y2hlZCI6MCwidG90YWxEdXBsaWNhdGVzIjowLCJ0b3RhbExpbmVzU2VudCI6MCwidG90YWxSZWFjaGVkIjowfSwic3RvcmUiOnsiY2h1bmtzRG93bmxvYWRUaW1lIjowLjAwMDM5MDk1OCwiY29tcHJlc3NlZEJ5dGVzIjozMTQzMiwiZGVjb21wcmVzc2VkQnl0ZXMiOjc3NzIsImRlY29tcHJlc3NlZExpbmVzIjo1NSwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbENodW5rc0Rvd25sb2FkZWQiOjIsInRvdGFsQ2h1bmtzUmVmIjoyLCJ0b3RhbER1cGxpY2F0ZXMiOjB9LCJzdW1tYXJ5Ijp7ImJ5dGVzUHJvY2Vzc2VkUGVyU2Vjb25kIjozNTA3MDIyLCJleGVjVGltZSI6MC4wMDIyMTYxMjUsImxpbmVzUHJvY2Vzc2VkUGVyU2Vjb25kIjoyNDgxOCwidG90YWxCeXRlc1Byb2Nlc3NlZCI6Nzc3MiwidG90YWxMaW5lc1Byb2Nlc3NlZCI6NTV9fX19AAAAAAQAAABtZXRhAAAAAAQAAAAsAQAAtAAAAFgAAAAEAAAA9v7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAADk/v//CAAAAAwAAAACAAAAVFMAAAQAAABuYW1lAAAAAAAAAADU/v//AgAAAFRTAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAo////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbGFiZWxzAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX2xhYmVscwAAAAAAAAAA/////0gBAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAACgAQAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAADIAAAABQAAAAAAAAAAAAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAB+AAAAAAAAAJgAAAAAAAAAAAAAAAAAAACYAAAAAAAAACgAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAGAAAAAAAAADYAAAAAAAAAEwAAAAAAAAAKAEAAAAAAAAAAAAAAAAAACgBAAAAAAAAGAAAAAAAAABAAQAAAAAAAF8AAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAzAAAATAAAAGUAAAB+AAAAbGV2ZWw9ZXJyb3IsIGxvY2F0aW9uPW1vb25sZXZlbD1pbmZvLCBsb2NhdGlvbj1tb29ubGV2ZWw9aW5mbywgbG9jYXRpb249bW9vbmxldmVsPWluZm8sIGxvY2F0aW9uPW1vb25sZXZlbD1pbmZvLCBsb2NhdGlvbj1tb29uAAAAFLi6SlLUFgB63D5LUtQWACQmEktS1BYApibmSlLUFgAn3I9KUtQWAAAAABAAAAAfAAAALgAAAD0AAABMAAAAbG9nIGxpbmUgZXJyb3IgMWxvZyBsaW5lIGluZm8gMWxvZyBsaW5lIGluZm8gMmxvZyBsaW5lIGluZm8gM2xvZyBsaW5lIGluZm8gNAAAAAAAAAAAEwAAACYAAAA5AAAATAAAAF8AAAAxNjQ1MDMwMjQ0ODEwNzU3MTIwMTY0NTAzMDI0NzAyNzczNTA0MDE2NDUwMzAyNDYyNzc1ODc5NjgxNjQ1MDMwMjQ1NTM5NDIzNzQ0MTY0NTAzMDI0NDA5MTcwMDk5MgAQAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAABAABAAAAsAQAAAAAAABQAQAAAAAAAKABAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAANACAAADAAAATAAAACgAAAAEAAAA9Pv//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAAU/P//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAADT8//8IAAAAaAIAAFwCAAB7ImN1c3RvbSI6eyJzdGF0cyI6eyJpbmdlc3RlciI6eyJjb21wcmVzc2VkQnl0ZXMiOjAsImRlY29tcHJlc3NlZEJ5dGVzIjowLCJkZWNvbXByZXNzZWRMaW5lcyI6MCwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbEJhdGNoZXMiOjAsInRvdGFsQ2h1bmtzTWF0Y2hlZCI6MCwidG90YWxEdXBsaWNhdGVzIjowLCJ0b3RhbExpbmVzU2VudCI6MCwidG90YWxSZWFjaGVkIjowfSwic3RvcmUiOnsiY2h1bmtzRG93bmxvYWRUaW1lIjowLjAwMDM5MDk1OCwiY29tcHJlc3NlZEJ5dGVzIjozMTQzMiwiZGVjb21wcmVzc2VkQnl0ZXMiOjc3NzIsImRlY29tcHJlc3NlZExpbmVzIjo1NSwiaGVhZENodW5rQnl0ZXMiOjAsImhlYWRDaHVua0xpbmVzIjowLCJ0b3RhbENodW5rc0Rvd25sb2FkZWQiOjIsInRvdGFsQ2h1bmtzUmVmIjoyLCJ0b3RhbER1cGxpY2F0ZXMiOjB9LCJzdW1tYXJ5Ijp7ImJ5dGVzUHJvY2Vzc2VkUGVyU2Vjb25kIjozNTA3MDIyLCJleGVjVGltZSI6MC4wMDIyMTYxMjUsImxpbmVzUHJvY2Vzc2VkUGVyU2Vjb25kIjoyNDgxOCwidG90YWxCeXRlc1Byb2Nlc3NlZCI6Nzc3MiwidG90YWxMaW5lc1Byb2Nlc3NlZCI6NTV9fX19AAAAAAQAAABtZXRhAAAAAAQAAAAsAQAAtAAAAFgAAAAEAAAA9v7//xQAAAA4AAAAOAAAAAAAAAU0AAAAAQAAAAQAAADk/v//CAAAAAwAAAACAAAAVFMAAAQAAABuYW1lAAAAAAAAAADU/v//AgAAAFRTAABG////FAAAADwAAAA8AAAAAAAABTgAAAABAAAABAAAADT///8IAAAAEAAAAAQAAABMaW5lAAAAAAQAAABuYW1lAAAAAAAAAAAo////BAAAAExpbmUAAAAAnv///xQAAAA8AAAARAAAAAAAAApEAAAAAQAAAAQAAACM////CAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbGFiZWxzAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX2xhYmVscwAAAADIBAAAQVJST1cx
|
||||||
76
pkg/util/converter/testdata/loki-streams-b.json
vendored
Normal file
76
pkg/util/converter/testdata/loki-streams-b.json
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"resultType": "streams",
|
||||||
|
"result": [
|
||||||
|
{
|
||||||
|
"stream": {
|
||||||
|
"level": "error",
|
||||||
|
"location": "moon"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"1645030244810757120",
|
||||||
|
"log line error 1"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stream": {
|
||||||
|
"level": "info",
|
||||||
|
"location": "moon"
|
||||||
|
},
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"1645030247027735040",
|
||||||
|
"log line info 1"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030246277587968",
|
||||||
|
"log line info 2"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030245539423744",
|
||||||
|
"log line info 3"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1645030244091700992",
|
||||||
|
"log line info 4"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stats": {
|
||||||
|
"summary": {
|
||||||
|
"bytesProcessedPerSecond": 3507022,
|
||||||
|
"linesProcessedPerSecond": 24818,
|
||||||
|
"totalBytesProcessed": 7772,
|
||||||
|
"totalLinesProcessed": 55,
|
||||||
|
"execTime": 0.002216125
|
||||||
|
},
|
||||||
|
"store": {
|
||||||
|
"totalChunksRef": 2,
|
||||||
|
"totalChunksDownloaded": 2,
|
||||||
|
"chunksDownloadTime": 0.000390958,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 7772,
|
||||||
|
"decompressedLines": 55,
|
||||||
|
"compressedBytes": 31432,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
},
|
||||||
|
"ingester": {
|
||||||
|
"totalReached": 0,
|
||||||
|
"totalChunksMatched": 0,
|
||||||
|
"totalBatches": 0,
|
||||||
|
"totalLinesSent": 0,
|
||||||
|
"headChunkBytes": 0,
|
||||||
|
"headChunkLines": 0,
|
||||||
|
"decompressedBytes": 0,
|
||||||
|
"decompressedLines": 0,
|
||||||
|
"compressedBytes": 0,
|
||||||
|
"totalDuplicates": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
102
pkg/util/converter/testdata/prom-exemplars-frame.json
vendored
Normal file
102
pkg/util/converter/testdata/prom-exemplars-frame.json
vendored
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "test_exemplar_metric_total",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"instance": "localhost:8090",
|
||||||
|
"job": "prometheus",
|
||||||
|
"service": "bar"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "traceID",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "a",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1600096945479
|
||||||
|
],
|
||||||
|
[
|
||||||
|
6
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"EpTxMJ40fUus7aGY"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"not in next"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "test_exemplar_metric_total",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"instance": "localhost:8090",
|
||||||
|
"job": "prometheus",
|
||||||
|
"service": "foo"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "traceID",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1600096955479,1600096965489
|
||||||
|
],
|
||||||
|
[
|
||||||
|
19,20
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"Olp9XHlq763ccsfa","hCtjygkIHwAN9vs4"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
31
pkg/util/converter/testdata/prom-exemplars-golden.txt
vendored
Normal file
31
pkg/util/converter/testdata/prom-exemplars-golden.txt
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0]
|
||||||
|
Name:
|
||||||
|
Dimensions: 4 Fields by 1 Rows
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+----------------+
|
||||||
|
| Name: | Name: test_exemplar_metric_total | Name: traceID | Name: a |
|
||||||
|
| Labels: | Labels: instance=localhost:8090, job=prometheus, service=bar | Labels: | Labels: |
|
||||||
|
| Type: []time.Time | Type: []float64 | Type: []string | Type: []string |
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+----------------+
|
||||||
|
| 2020-09-14 15:22:25.479 +0000 UTC | 6 | EpTxMJ40fUus7aGY | not in next |
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+----------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[1]
|
||||||
|
Name:
|
||||||
|
Dimensions: 3 Fields by 2 Rows
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+
|
||||||
|
| Name: | Name: test_exemplar_metric_total | Name: traceID |
|
||||||
|
| Labels: | Labels: instance=localhost:8090, job=prometheus, service=foo | Labels: |
|
||||||
|
| Type: []time.Time | Type: []float64 | Type: []string |
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+
|
||||||
|
| 2020-09-14 15:22:35.479 +0000 UTC | 19 | Olp9XHlq763ccsfa |
|
||||||
|
| 2020-09-14 15:22:45.489 +0000 UTC | 20 | hCtjygkIHwAN9vs4 |
|
||||||
|
+-----------------------------------+--------------------------------------------------------------+------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=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
|
||||||
|
FRAME=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
|
||||||
47
pkg/util/converter/testdata/prom-exemplars.json
vendored
Normal file
47
pkg/util/converter/testdata/prom-exemplars.json
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"seriesLabels": {
|
||||||
|
"__name__": "test_exemplar_metric_total",
|
||||||
|
"instance": "localhost:8090",
|
||||||
|
"job": "prometheus",
|
||||||
|
"service": "bar"
|
||||||
|
},
|
||||||
|
"exemplars": [
|
||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"traceID": "EpTxMJ40fUus7aGY",
|
||||||
|
"a": "not in next"
|
||||||
|
},
|
||||||
|
"value": "6",
|
||||||
|
"timestamp": 1600096945.479
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"seriesLabels": {
|
||||||
|
"__name__": "test_exemplar_metric_total",
|
||||||
|
"instance": "localhost:8090",
|
||||||
|
"job": "prometheus",
|
||||||
|
"service": "foo"
|
||||||
|
},
|
||||||
|
"exemplars": [
|
||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"traceID": "Olp9XHlq763ccsfa"
|
||||||
|
},
|
||||||
|
"value": "19",
|
||||||
|
"timestamp": 1600096955.479
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"labels": {
|
||||||
|
"traceID": "hCtjygkIHwAN9vs4"
|
||||||
|
},
|
||||||
|
"value": "20",
|
||||||
|
"timestamp": 1600096965.489
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
24
pkg/util/converter/testdata/prom-labels-frame.json
vendored
Normal file
24
pkg/util/converter/testdata/prom-labels-frame.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"__name__","call","code","config","dialer_name","endpoint","event","goversion","handler","instance","interval","job","le","listener_name","name","quantile","reason","role","scrape_job","slice","version"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
25
pkg/util/converter/testdata/prom-labels-golden.txt
vendored
Normal file
25
pkg/util/converter/testdata/prom-labels-golden.txt
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0]
|
||||||
|
Name:
|
||||||
|
Dimensions: 1 Fields by 21 Rows
|
||||||
|
+----------------+
|
||||||
|
| Name: Value |
|
||||||
|
| Labels: |
|
||||||
|
| Type: []string |
|
||||||
|
+----------------+
|
||||||
|
| __name__ |
|
||||||
|
| call |
|
||||||
|
| code |
|
||||||
|
| config |
|
||||||
|
| dialer_name |
|
||||||
|
| endpoint |
|
||||||
|
| event |
|
||||||
|
| goversion |
|
||||||
|
| handler |
|
||||||
|
| ... |
|
||||||
|
+----------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////AAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAACE////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAKT///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAQAAABgAAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEgAAAAAAAAFRAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAAAD/////mAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAOgAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAEgAAAAVAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAABYAAAAAAAAAIwAAAAAAAAAAAAAAAEAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAEAAAABYAAAAhAAAAKQAAAC4AAAA3AAAAPgAAAEYAAABOAAAAUQAAAFMAAABgAAAAZAAAAGwAAAByAAAAdgAAAIAAAACFAAAAjAAAAF9fbmFtZV9fY2FsbGNvZGVjb25maWdkaWFsZXJfbmFtZWVuZHBvaW50ZXZlbnRnb3ZlcnNpb25oYW5kbGVyaW5zdGFuY2VpbnRlcnZhbGpvYmxlbGlzdGVuZXJfbmFtZW5hbWVxdWFudGlsZXJlYXNvbnJvbGVzY3JhcGVfam9ic2xpY2V2ZXJzaW9uAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAAQAQAAAAAAAKAAAAAAAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAACE////CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAKT///8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAQAAABgAAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEgAAAAAAAAFRAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAAAAAAABAAEAAQAAAAFAAAAVmFsdWUAAAAwAQAAQVJST1cx
|
||||||
26
pkg/util/converter/testdata/prom-labels.json
vendored
Normal file
26
pkg/util/converter/testdata/prom-labels.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": [
|
||||||
|
"__name__",
|
||||||
|
"call",
|
||||||
|
"code",
|
||||||
|
"config",
|
||||||
|
"dialer_name",
|
||||||
|
"endpoint",
|
||||||
|
"event",
|
||||||
|
"goversion",
|
||||||
|
"handler",
|
||||||
|
"instance",
|
||||||
|
"interval",
|
||||||
|
"job",
|
||||||
|
"le",
|
||||||
|
"listener_name",
|
||||||
|
"name",
|
||||||
|
"quantile",
|
||||||
|
"reason",
|
||||||
|
"role",
|
||||||
|
"scrape_job",
|
||||||
|
"slice",
|
||||||
|
"version"
|
||||||
|
]
|
||||||
|
}
|
||||||
78
pkg/util/converter/testdata/prom-matrix-frame.json
vendored
Normal file
78
pkg/util/converter/testdata/prom-matrix-frame.json
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "up",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"job": "prometheus",
|
||||||
|
"instance": "localhost:9090"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1435781430781,1435781445781,1435781460781
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,1,1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "up",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"job": "node",
|
||||||
|
"instance": "localhost:9091"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1435781430781,1435781445781,1435781460781
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,0,1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
38
pkg/util/converter/testdata/prom-matrix-golden.txt
vendored
Normal file
38
pkg/util/converter/testdata/prom-matrix-golden.txt
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 3 Rows
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
| Name: Time | Name: up |
|
||||||
|
| Labels: | Labels: instance=localhost:9090, job=prometheus |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
| 2015-07-01 20:10:30.781 +0000 UTC | 1 |
|
||||||
|
| 2015-07-01 20:10:45.781 +0000 UTC | 1 |
|
||||||
|
| 2015-07-01 20:11:00.781 +0000 UTC | 1 |
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[1] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 3 Rows
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
| Name: Time | Name: up |
|
||||||
|
| Labels: | Labels: instance=localhost:9091, job=node |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
| 2015-07-01 20:10:30.781 +0000 UTC | 0 |
|
||||||
|
| 2015-07-01 20:10:45.781 +0000 UTC | 0 |
|
||||||
|
| 2015-07-01 20:11:00.781 +0000 UTC | 1 |
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////8AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAoP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADA/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOD+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMQAAAAEAAAAVv///xQAAACMAAAAjAAAAAAAAAOMAAAAAgAAACgAAAAEAAAASP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABo////CAAAADwAAAAwAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkwIiwiam9iIjoicHJvbWV0aGV1cyJ9AAAAAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAADAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAAAAAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAABAuc2smuvsE0CP3yqe6+wTQGXxqKHr7BMAAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8QAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAPAAAAAAABAABAAAAAAIAAAAAAADAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAwAAAAIAAQACgAAAAgAAACMAAAAAwAAAEwAAAAoAAAABAAAAKD+//8IAAAADAAAAAAAAAAAAAAABQAAAHJlZklkAAAAwP7//wgAAAAMAAAAAAAAAAAAAAAEAAAAbmFtZQAAAADg/v//CAAAACQAAAAaAAAAeyJ0eXBlIjoidGltZXNlcmllcy1tYW55In0AAAQAAABtZXRhAAAAAAIAAADEAAAABAAAAFb///8UAAAAjAAAAIwAAAAAAAADjAAAAAIAAAAoAAAABAAAAEj///8IAAAADAAAAAIAAAB1cAAABAAAAG5hbWUAAAAAaP///wgAAAA8AAAAMAAAAHsiaW5zdGFuY2UiOiJsb2NhbGhvc3Q6OTA5MCIsImpvYiI6InByb21ldGhldXMifQAAAAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAIAIAAEFSUk9XMQ==
|
||||||
|
FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkxIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAwAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAwAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAGAAAAAAAAAAAAAAAAgAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAQLnNrJrr7BNAj98qnuvsE0Bl8aih6+wTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAQAAQAAAPgBAAAAAAAAwAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACo/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMj+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA6P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAvAAAAAQAAABe////FAAAAIQAAACEAAAAAAAAA4QAAAACAAAAKAAAAAQAAABQ////CAAAAAwAAAACAAAAdXAAAAQAAABuYW1lAAAAAHD///8IAAAANAAAACoAAAB7Imluc3RhbmNlIjoibG9jYWxob3N0OjkwOTEiLCJqb2IiOiJub2RlIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAYAgAAQVJST1cx
|
||||||
55
pkg/util/converter/testdata/prom-matrix-with-nans-frame.json
vendored
Normal file
55
pkg/util/converter/testdata/prom-matrix-with-nans-frame.json
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"job": "prometheus",
|
||||||
|
"handler": "/api/v1/query_range"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1641889530000,1641889531000,1641889532000
|
||||||
|
],
|
||||||
|
[
|
||||||
|
null,null,null
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"entities": [
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
"NaN": [
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"Inf": [
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"NegInf": [
|
||||||
|
2
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
20
pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt
vendored
Normal file
20
pkg/util/converter/testdata/prom-matrix-with-nans-golden.txt
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 3 Rows
|
||||||
|
+-------------------------------+-----------------------------------------------------+
|
||||||
|
| Name: Time | Name: Value |
|
||||||
|
| Labels: | Labels: handler=/api/v1/query_range, job=prometheus |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-------------------------------+-----------------------------------------------------+
|
||||||
|
| 2022-01-11 08:25:30 +0000 UTC | +Inf |
|
||||||
|
| 2022-01-11 08:25:31 +0000 UTC | NaN |
|
||||||
|
| 2022-01-11 08:25:32 +0000 UTC | -Inf |
|
||||||
|
+-------------------------------+-----------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////+AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAmP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC4/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMwAAAAEAAAATv///xQAAACUAAAAlAAAAAAAAAOUAAAAAgAAACwAAAAEAAAAQP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAZP///wgAAABAAAAANAAAAHsiaGFuZGxlciI6Ii9hcGkvdjEvcXVlcnlfcmFuZ2UiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAAP////+4AAAAFAAAAAAAAAAMABYAFAATAAwABAAMAAAAMAAAAAAAAAAUAAAAAAAAAwQACgAYAAwACAAEAAoAAAAUAAAAWAAAAAMAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAABEFRTUKckWAA6wT9QpyRYA2EqL1CnJFgAAAAAAAPB/AQAAAAAA+H8AAAAAAADw/xAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAAIAgAAAAAAAMAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAmP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAAC4/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAANj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMwAAAAEAAAATv///xQAAACUAAAAlAAAAAAAAAOUAAAAAgAAACwAAAAEAAAAQP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAZP///wgAAABAAAAANAAAAHsiaGFuZGxlciI6Ii9hcGkvdjEvcXVlcnlfcmFuZ2UiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAACgCAABBUlJPVzE=
|
||||||
16
pkg/util/converter/testdata/prom-matrix-with-nans.json
vendored
Normal file
16
pkg/util/converter/testdata/prom-matrix-with-nans.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"status": "success",
|
||||||
|
"data": {
|
||||||
|
"resultType": "matrix",
|
||||||
|
"result": [
|
||||||
|
{
|
||||||
|
"metric": { "handler": "/api/v1/query_range", "job": "prometheus" },
|
||||||
|
"values": [
|
||||||
|
[1641889530, "+Inf"],
|
||||||
|
[1641889531, "NaN"],
|
||||||
|
[1641889532, "-Inf"]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
33
pkg/util/converter/testdata/prom-matrix.json
vendored
Normal file
33
pkg/util/converter/testdata/prom-matrix.json
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"status" : "success",
|
||||||
|
"data" : {
|
||||||
|
"resultType" : "matrix",
|
||||||
|
"result" : [
|
||||||
|
{
|
||||||
|
"metric" : {
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "prometheus",
|
||||||
|
"instance" : "localhost:9090"
|
||||||
|
},
|
||||||
|
"values" : [
|
||||||
|
[ 1435781430.781, "1" ],
|
||||||
|
[ 1435781445.781, "1" ],
|
||||||
|
[ 1435781460.781, "1" ]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric" : {
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "node",
|
||||||
|
"instance" : "localhost:9091"
|
||||||
|
},
|
||||||
|
"values" : [
|
||||||
|
[ 1435781430.781, "0" ],
|
||||||
|
[ 1435781445.781, "0" ],
|
||||||
|
[ 1435781460.781, "1" ]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
44
pkg/util/converter/testdata/prom-series-frame.json
vendored
Normal file
44
pkg/util/converter/testdata/prom-series-frame.json
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "__name__",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "job",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "instance",
|
||||||
|
"type": "string",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
"up","up","process_start_time_seconds"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"prometheus","node","prometheus"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"localhost:9090","localhost:9091","localhost:9090"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
pkg/util/converter/testdata/prom-series-golden.txt
vendored
Normal file
18
pkg/util/converter/testdata/prom-series-golden.txt
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0]
|
||||||
|
Name:
|
||||||
|
Dimensions: 3 Fields by 3 Rows
|
||||||
|
+----------------------------+----------------+----------------+
|
||||||
|
| Name: __name__ | Name: job | Name: instance |
|
||||||
|
| Labels: | Labels: | Labels: |
|
||||||
|
| Type: []string | Type: []string | Type: []string |
|
||||||
|
+----------------------------+----------------+----------------+
|
||||||
|
| up | prometheus | localhost:9090 |
|
||||||
|
| up | node | localhost:9091 |
|
||||||
|
| process_start_time_seconds | prometheus | localhost:9090 |
|
||||||
|
+----------------------------+----------------+----------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////wAEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAOz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAwAAANAAAABoAAAABAAAAE7///8UAAAAQAAAAEAAAAAAAAAFPAAAAAEAAAAEAAAAPP///wgAAAAUAAAACAAAAGluc3RhbmNlAAAAAAQAAABuYW1lAAAAAAAAAAA0////CAAAAGluc3RhbmNlAAAAAK7///8UAAAAOAAAADgAAAAAAAAFNAAAAAEAAAAEAAAAnP///wgAAAAMAAAAAwAAAGpvYgAEAAAAbmFtZQAAAAAAAAAAjP///wMAAABqb2IAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbmFtZV9fAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX25hbWVfXwAAAAD/////GAEAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAJgAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAKgAAAADAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAB4AAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAEAAAAAAAAABAAAAAAAAAABgAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAEAAAAAAAAABoAAAAAAAAACoAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAeAAAAdXB1cHByb2Nlc3Nfc3RhcnRfdGltZV9zZWNvbmRzAAAAAAAACgAAAA4AAAAYAAAAcHJvbWV0aGV1c25vZGVwcm9tZXRoZXVzAAAAAA4AAAAcAAAAKgAAAGxvY2FsaG9zdDo5MDkwbG9jYWxob3N0OjkwOTFsb2NhbGhvc3Q6OTA5MAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAADQAQAAAAAAACABAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFAAAAACAAAAKAAAAAQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAOz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAAAwAAANAAAABoAAAABAAAAE7///8UAAAAQAAAAEAAAAAAAAAFPAAAAAEAAAAEAAAAPP///wgAAAAUAAAACAAAAGluc3RhbmNlAAAAAAQAAABuYW1lAAAAAAAAAAA0////CAAAAGluc3RhbmNlAAAAAK7///8UAAAAOAAAADgAAAAAAAAFNAAAAAEAAAAEAAAAnP///wgAAAAMAAAAAwAAAGpvYgAEAAAAbmFtZQAAAAAAAAAAjP///wMAAABqb2IAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEgAAABMAAAAAAAABUgAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAUAAAACAAAAF9fbmFtZV9fAAAAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAgAAABfX25hbWVfXwAAAADwAQAAQVJST1cx
|
||||||
21
pkg/util/converter/testdata/prom-series.json
vendored
Normal file
21
pkg/util/converter/testdata/prom-series.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"status" : "success",
|
||||||
|
"data" : [
|
||||||
|
{
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "prometheus",
|
||||||
|
"instance" : "localhost:9090"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "node",
|
||||||
|
"instance" : "localhost:9091"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__name__" : "process_start_time_seconds",
|
||||||
|
"job" : "prometheus",
|
||||||
|
"instance" : "localhost:9090"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
213
pkg/util/converter/testdata/prom-vector-frame.json
vendored
Normal file
213
pkg/util/converter/testdata/prom-vector-frame.json
vendored
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
{
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "up",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"job": "prometheus",
|
||||||
|
"instance": "localhost:9090"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1435781451781
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "up",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"job": "node",
|
||||||
|
"instance": "localhost:9100"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1435781451781
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"level": "error",
|
||||||
|
"location": "moon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1645029699000
|
||||||
|
],
|
||||||
|
[
|
||||||
|
null
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"entities": [
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
"Inf": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"level": "info",
|
||||||
|
"location": "moon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1645029699000
|
||||||
|
],
|
||||||
|
[
|
||||||
|
null
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"entities": [
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
"NegInf": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"schema": {
|
||||||
|
"meta": {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
},
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "Time",
|
||||||
|
"type": "time",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "time.Time"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "number",
|
||||||
|
"typeInfo": {
|
||||||
|
"frame": "float64"
|
||||||
|
},
|
||||||
|
"labels": {
|
||||||
|
"level": "debug",
|
||||||
|
"location": "moon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"values": [
|
||||||
|
[
|
||||||
|
1645029699000
|
||||||
|
],
|
||||||
|
[
|
||||||
|
null
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"entities": [
|
||||||
|
null,
|
||||||
|
{
|
||||||
|
"NaN": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
82
pkg/util/converter/testdata/prom-vector-golden.txt
vendored
Normal file
82
pkg/util/converter/testdata/prom-vector-golden.txt
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
🌟 This was machine generated. Do not edit. 🌟
|
||||||
|
|
||||||
|
Frame[0] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 1 Rows
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
| Name: Time | Name: up |
|
||||||
|
| Labels: | Labels: instance=localhost:9090, job=prometheus |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
| 2015-07-01 20:10:51.781 +0000 UTC | 1 |
|
||||||
|
+-----------------------------------+-------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[1] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 1 Rows
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
| Name: Time | Name: up |
|
||||||
|
| Labels: | Labels: instance=localhost:9100, job=node |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
| 2015-07-01 20:10:51.781 +0000 UTC | 0 |
|
||||||
|
+-----------------------------------+-------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[2] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 1 Rows
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
| Name: Time | Name: Value |
|
||||||
|
| Labels: | Labels: level=error, location=moon |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
| 2022-02-16 16:41:39 +0000 UTC | +Inf |
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[3] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 1 Rows
|
||||||
|
+-------------------------------+-----------------------------------+
|
||||||
|
| Name: Time | Name: Value |
|
||||||
|
| Labels: | Labels: level=info, location=moon |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-------------------------------+-----------------------------------+
|
||||||
|
| 2022-02-16 16:41:39 +0000 UTC | -Inf |
|
||||||
|
+-------------------------------+-----------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frame[4] {
|
||||||
|
"type": "timeseries-many"
|
||||||
|
}
|
||||||
|
Name:
|
||||||
|
Dimensions: 2 Fields by 1 Rows
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
| Name: Time | Name: Value |
|
||||||
|
| Labels: | Labels: level=debug, location=moon |
|
||||||
|
| Type: []time.Time | Type: []float64 |
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
| 2022-02-16 16:41:39 +0000 UTC | NaN |
|
||||||
|
+-------------------------------+------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
|
====== TEST DATA RESPONSE (arrow base64) ======
|
||||||
|
FRAME=QVJST1cxAAD/////8AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAoP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADA/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOD+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAAMQAAAAEAAAAVv///xQAAACMAAAAjAAAAAAAAAOMAAAAAgAAACgAAAAEAAAASP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABo////CAAAADwAAAAwAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MDkwIiwiam9iIjoicHJvbWV0aGV1cyJ9AAAAAAYAAABsYWJlbHMAAAAAAACK////AAACAAIAAAB1cAAAAAASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAD/////uAAAABQAAAAAAAAADAAWABQAEwAMAAQADAAAABAAAAAAAAAAFAAAAAAAAAMEAAoAGAAMAAgABAAKAAAAFAAAAFgAAAABAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAABAS4CQn+vsEwAAAAAAAPA/EAAAAAwAFAASAAwACAAEAAwAAAAQAAAALAAAADwAAAAAAAQAAQAAAAACAAAAAAAAwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACg/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMD+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA4P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAxAAAAAQAAABW////FAAAAIwAAACMAAAAAAAAA4wAAAACAAAAKAAAAAQAAABI////CAAAAAwAAAACAAAAdXAAAAQAAABuYW1lAAAAAGj///8IAAAAPAAAADAAAAB7Imluc3RhbmNlIjoibG9jYWxob3N0OjkwOTAiLCJqb2IiOiJwcm9tZXRoZXVzIn0AAAAABgAAAGxhYmVscwAAAAAAAIr///8AAAIAAgAAAHVwAAAAABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAACACAABBUlJPVzE=
|
||||||
|
FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MTAwIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAQEuAkJ/r7BMAAAAAAAAAABAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA8AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAAqP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADI/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOj+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALwAAAAEAAAAXv///xQAAACEAAAAhAAAAAAAAAOEAAAAAgAAACgAAAAEAAAAUP///wgAAAAMAAAAAgAAAHVwAAAEAAAAbmFtZQAAAABw////CAAAADQAAAAqAAAAeyJpbnN0YW5jZSI6ImxvY2FsaG9zdDo5MTAwIiwiam9iIjoibm9kZSJ9AAAGAAAAbGFiZWxzAAAAAAAAiv///wAAAgACAAAAdXAAAAAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAATAAAAAAAAApMAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAQAAABUaW1lAAAAAAQAAABuYW1lAAAAAAAAAAAAAAYACAAGAAYAAAAAAAMABAAAAFRpbWUAAAAAGAIAAEFSUk9XMQ==
|
||||||
|
FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIwAAAHsibGV2ZWwiOiJlcnJvciIsImxvY2F0aW9uIjoibW9vbiJ9AAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYAAAAAAADwfxAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAjAAAAeyJsZXZlbCI6ImVycm9yIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE=
|
||||||
|
FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIgAAAHsibGV2ZWwiOiJpbmZvIiwibG9jYXRpb24iOiJtb29uIn0AAAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYAAAAAAADw/xAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAiAAAAeyJsZXZlbCI6ImluZm8iLCJsb2NhdGlvbiI6Im1vb24ifQAABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE=
|
||||||
|
FRAME=QVJST1cxAAD/////6AEAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEEAAoADAAAAAgABAAKAAAACAAAAIwAAAADAAAATAAAACgAAAAEAAAArP7//wgAAAAMAAAAAAAAAAAAAAAFAAAAcmVmSWQAAADM/v//CAAAAAwAAAAAAAAAAAAAAAQAAABuYW1lAAAAAOz+//8IAAAAJAAAABoAAAB7InR5cGUiOiJ0aW1lc2VyaWVzLW1hbnkifQAABAAAAG1ldGEAAAAAAgAAALgAAAAEAAAAYv///xQAAACAAAAAgAAAAAAAAAOAAAAAAgAAACwAAAAEAAAAVP///wgAAAAQAAAABQAAAFZhbHVlAAAABAAAAG5hbWUAAAAAeP///wgAAAAsAAAAIwAAAHsibGV2ZWwiOiJkZWJ1ZyIsImxvY2F0aW9uIjoibW9vbiJ9AAYAAABsYWJlbHMAAAAAAACK////AAACAAUAAABWYWx1ZQASABgAFAAAABMADAAAAAgABAASAAAAFAAAAEQAAABMAAAAAAAACkwAAAABAAAADAAAAAgADAAIAAQACAAAAAgAAAAQAAAABAAAAFRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAVGltZQAAAAAAAAAA/////7gAAAAUAAAAAAAAAAwAFgAUABMADAAEAAwAAAAQAAAAAAAAABQAAAAAAAADBAAKABgADAAIAAQACgAAABQAAABYAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAN7cpctR1BYBAAAAAAD4fxAAAAAMABQAEgAMAAgABAAMAAAAEAAAACwAAAA4AAAAAAAEAAEAAAD4AQAAAAAAAMAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAACgAMAAAACAAEAAoAAAAIAAAAjAAAAAMAAABMAAAAKAAAAAQAAACs/v//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAAMz+//8IAAAADAAAAAAAAAAAAAAABAAAAG5hbWUAAAAA7P7//wgAAAAkAAAAGgAAAHsidHlwZSI6InRpbWVzZXJpZXMtbWFueSJ9AAAEAAAAbWV0YQAAAAACAAAAuAAAAAQAAABi////FAAAAIAAAACAAAAAAAAAA4AAAAACAAAALAAAAAQAAABU////CAAAABAAAAAFAAAAVmFsdWUAAAAEAAAAbmFtZQAAAAB4////CAAAACwAAAAjAAAAeyJsZXZlbCI6ImRlYnVnIiwibG9jYXRpb24iOiJtb29uIn0ABgAAAGxhYmVscwAAAAAAAIr///8AAAIABQAAAFZhbHVlABIAGAAUAAAAEwAMAAAACAAEABIAAAAUAAAARAAAAEwAAAAAAAAKTAAAAAEAAAAMAAAACAAMAAgABAAIAAAACAAAABAAAAAEAAAAVGltZQAAAAAEAAAAbmFtZQAAAAAAAAAAAAAGAAgABgAGAAAAAAADAAQAAABUaW1lAAAAABACAABBUlJPVzE=
|
||||||
36
pkg/util/converter/testdata/prom-vector.json
vendored
Normal file
36
pkg/util/converter/testdata/prom-vector.json
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"status" : "success",
|
||||||
|
"data" : {
|
||||||
|
"resultType" : "vector",
|
||||||
|
"result" : [
|
||||||
|
{
|
||||||
|
"metric" : {
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "prometheus",
|
||||||
|
"instance" : "localhost:9090"
|
||||||
|
},
|
||||||
|
"value": [ 1435781451.781, "1" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric" : {
|
||||||
|
"__name__" : "up",
|
||||||
|
"job" : "node",
|
||||||
|
"instance" : "localhost:9100"
|
||||||
|
},
|
||||||
|
"value" : [ 1435781451.781, "0" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": { "level": "error", "location": "moon"},
|
||||||
|
"value": [1645029699, "+Inf"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": { "level": "info", "location": "moon" },
|
||||||
|
"value": [1645029699, "-Inf"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": { "level": "debug", "location": "moon" },
|
||||||
|
"value": [1645029699, "NaN"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user