From 4b8d796c549633e6b2fb46365aec915bfa38992d Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 9 Jun 2021 11:15:42 -0700 Subject: [PATCH] Live: avoid panic when type changes (#35394) --- go.mod | 2 +- go.sum | 5 - pkg/services/live/convert/convert.go | 4 +- pkg/services/live/telemetry/converter.go | 16 + .../live/telemetry/telegraf/convert.go | 325 +++ .../live/telemetry/telegraf/convert_test.go | 255 +++ .../testdata/changing_types_NaN.golden.txt | 19 + .../telegraf/testdata/changing_types_NaN.txt | 4 + .../testdata/golden_labels_column.json | 285 +++ .../telegraf/testdata/golden_wide.json | 1971 +++++++++++++++++ .../telegraf/testdata/mixed_number_types.txt | 2 + ...etrics_different_labels_different_time.txt | 17 + ...etrics_different_labels_different_time.txt | 2 + ...ame_metrics_different_labels_same_time.txt | 13 + ...ame_metrics_same_labels_different_time.txt | 3 + .../telegraf/testdata/single_metric.txt | 1 + .../single_metric_different_field_order.txt | 1 + 17 files changed, 2917 insertions(+), 8 deletions(-) create mode 100644 pkg/services/live/telemetry/converter.go create mode 100644 pkg/services/live/telemetry/telegraf/convert.go create mode 100644 pkg/services/live/telemetry/telegraf/convert_test.go create mode 100644 pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json create mode 100644 pkg/services/live/telemetry/telegraf/testdata/golden_wide.json create mode 100644 pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_different_time.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/single_metric.txt create mode 100644 pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt diff --git a/go.mod b/go.mod index 369412c81e9..a509bb85437 100644 --- a/go.mod +++ b/go.mod @@ -51,7 +51,6 @@ require ( github.com/gorilla/websocket v1.4.2 github.com/gosimple/slug v1.9.0 github.com/grafana/grafana-aws-sdk v0.4.0 - github.com/grafana/grafana-live-sdk v0.0.6 github.com/grafana/grafana-plugin-sdk-go v0.104.0 github.com/grafana/loki v1.6.2-0.20210520072447-15d417efe103 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 @@ -60,6 +59,7 @@ require ( github.com/hashicorp/go-version v1.3.0 github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec github.com/influxdata/influxdb-client-go/v2 v2.2.3 + github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 github.com/jmespath/go-jmespath v0.4.0 github.com/json-iterator/go v1.1.11 github.com/jung-kurt/gofpdf v1.16.2 diff --git a/go.sum b/go.sum index 8ddeb4b37e0..bd81dcd3ac2 100644 --- a/go.sum +++ b/go.sum @@ -294,8 +294,6 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/centrifugal/centrifuge v0.17.0 h1:ANZMhcR8pFbRUPdv45nrIhhZcsSOdtshT3YM4v1/NHY= github.com/centrifugal/centrifuge v0.17.0/go.mod h1:AEFs3KPGRpvX1jCe24NDlGWQu7DPa7vdzeY/aUluOm0= -github.com/centrifugal/centrifuge-go v0.7.1/go.mod h1:G8cXpoTVd8l6CMHh9LWyUJOEfu6cjrm4SGdT36E15Hc= -github.com/centrifugal/protocol v0.3.5/go.mod h1:2YbBCaDwQHl37ErRdMrKSj18X2yVvpkQYtSX6aVbe5A= github.com/centrifugal/protocol v0.5.0 h1:h71u2Q53yhplftmUk1tjc+Mu6TKJ/eO3YRD3h7Qjvj4= github.com/centrifugal/protocol v0.5.0/go.mod h1:ru2N4pwiND/jE+XLtiLYbUo3YmgqgniGNW9f9aRgoVI= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -916,10 +914,7 @@ github.com/grafana/go-mssqldb v0.0.0-20210326084033-d0ce3c521036 h1:GplhUk6Xes5J github.com/grafana/go-mssqldb v0.0.0-20210326084033-d0ce3c521036/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/grafana/grafana-aws-sdk v0.4.0 h1:JmTaXfOJ/ydHSWH9kEt8Yhfb9kAhIW4LUOO3SWCviYg= github.com/grafana/grafana-aws-sdk v0.4.0/go.mod h1:+pPo5U+pX0zWimR7YBc7ASeSQfbRkcTyQYqMiAj7G5U= -github.com/grafana/grafana-live-sdk v0.0.6 h1:P1QFn0ZradOJp3zVpfG0STZMP+pgZrW0e0zvpqOrYVI= -github.com/grafana/grafana-live-sdk v0.0.6/go.mod h1:f15hHmWyLdFjmuWLsjeKeZnq/HnNQ3QkoPcaEww45AY= github.com/grafana/grafana-plugin-sdk-go v0.79.0/go.mod h1:NvxLzGkVhnoBKwzkst6CFfpMFKwAdIUZ1q8ssuLeF60= -github.com/grafana/grafana-plugin-sdk-go v0.91.0/go.mod h1:Ot3k7nY7P6DXmUsDgKvNB7oG1v7PRyTdmnYVoS554bU= github.com/grafana/grafana-plugin-sdk-go v0.104.0 h1:Ij2tPdEasSjCb2MxHaaiylyW4RLVZYyWpApzN/mlTxo= github.com/grafana/grafana-plugin-sdk-go v0.104.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= github.com/grafana/loki v1.6.2-0.20210520072447-15d417efe103 h1:qCmofFVwQR9QnsinstVqI1NPLMVl33jNCnOCXEAVn6E= diff --git a/pkg/services/live/convert/convert.go b/pkg/services/live/convert/convert.go index f69f3bea245..59b4ea4cb7b 100644 --- a/pkg/services/live/convert/convert.go +++ b/pkg/services/live/convert/convert.go @@ -4,8 +4,8 @@ import ( "errors" "fmt" - "github.com/grafana/grafana-live-sdk/telemetry" - "github.com/grafana/grafana-live-sdk/telemetry/telegraf" + "github.com/grafana/grafana/pkg/services/live/telemetry" + "github.com/grafana/grafana/pkg/services/live/telemetry/telegraf" ) type Converter struct { diff --git a/pkg/services/live/telemetry/converter.go b/pkg/services/live/telemetry/converter.go new file mode 100644 index 00000000000..bee3c789ddd --- /dev/null +++ b/pkg/services/live/telemetry/converter.go @@ -0,0 +1,16 @@ +package telemetry + +import "github.com/grafana/grafana-plugin-sdk-go/data" + +// Converter can convert input to Grafana Data Frames. +type Converter interface { + Convert(data []byte) ([]FrameWrapper, error) +} + +// FrameWrapper is a wrapper over data.Frame. +type FrameWrapper interface { + // Key returns a key which describes Frame metrics. + Key() string + // Frame allows getting data.Frame. + Frame() *data.Frame +} diff --git a/pkg/services/live/telemetry/telegraf/convert.go b/pkg/services/live/telemetry/telegraf/convert.go new file mode 100644 index 00000000000..0a7d0d5f9e0 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/convert.go @@ -0,0 +1,325 @@ +package telegraf + +import ( + "fmt" + "sort" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana-plugin-sdk-go/data/converters" + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/services/live/telemetry" + influx "github.com/influxdata/line-protocol" +) + +var ( + logger = log.New("live.telemetry.telegraf") +) + +var _ telemetry.Converter = (*Converter)(nil) + +// Converter converts Telegraf metrics to Grafana frames. +type Converter struct { + parser *influx.Parser + useLabelsColumn bool + useFloat64Numbers bool +} + +// ConverterOption ... +type ConverterOption func(*Converter) + +// WithUseLabelsColumn ... +func WithUseLabelsColumn(enabled bool) ConverterOption { + return func(h *Converter) { + h.useLabelsColumn = enabled + } +} + +// WithFloat64Numbers will convert all numbers met to float64 type. +func WithFloat64Numbers(enabled bool) ConverterOption { + return func(h *Converter) { + h.useFloat64Numbers = enabled + } +} + +// NewConverter creates new Converter from Influx/Telegraf format to Grafana Data Frames. +// This converter generates one frame for each input metric name and time combination. +func NewConverter(opts ...ConverterOption) *Converter { + c := &Converter{ + parser: influx.NewParser(influx.NewMetricHandler()), + } + for _, opt := range opts { + opt(c) + } + return c +} + +// Each unique metric frame identified by name and time. +func getFrameKey(m influx.Metric) string { + return m.Name() + "_" + m.Time().String() +} + +// Convert metrics. +func (c *Converter) Convert(body []byte) ([]telemetry.FrameWrapper, error) { + metrics, err := c.parser.Parse(body) + if err != nil { + return nil, fmt.Errorf("error parsing metrics: %w", err) + } + if !c.useLabelsColumn { + return c.convertWideFields(metrics) + } + return c.convertWithLabelsColumn(metrics) +} + +func (c *Converter) convertWideFields(metrics []influx.Metric) ([]telemetry.FrameWrapper, error) { + // maintain the order of frames as they appear in input. + var frameKeyOrder []string + metricFrames := make(map[string]*metricFrame) + + for _, m := range metrics { + frameKey := getFrameKey(m) + frame, ok := metricFrames[frameKey] + if ok { + // Existing frame. + err := frame.extend(m) + if err != nil { + return nil, err + } + } else { + frameKeyOrder = append(frameKeyOrder, frameKey) + frame = newMetricFrame(m, c.useFloat64Numbers) + err := frame.extend(m) + if err != nil { + return nil, err + } + metricFrames[frameKey] = frame + } + } + + frameWrappers := make([]telemetry.FrameWrapper, 0, len(metricFrames)) + for _, key := range frameKeyOrder { + frameWrappers = append(frameWrappers, metricFrames[key]) + } + + return frameWrappers, nil +} + +func (c *Converter) convertWithLabelsColumn(metrics []influx.Metric) ([]telemetry.FrameWrapper, error) { + // maintain the order of frames as they appear in input. + var frameKeyOrder []string + metricFrames := make(map[string]*metricFrame) + + for _, m := range metrics { + frameKey := m.Name() + frame, ok := metricFrames[frameKey] + if ok { + // Existing frame. + err := frame.append(m) + if err != nil { + return nil, err + } + } else { + frameKeyOrder = append(frameKeyOrder, frameKey) + frame = newMetricFrameLabelsColumn(m, c.useFloat64Numbers) + err := frame.append(m) + if err != nil { + return nil, err + } + metricFrames[frameKey] = frame + } + } + + frameWrappers := make([]telemetry.FrameWrapper, 0, len(metricFrames)) + for _, key := range frameKeyOrder { + frameWrappers = append(frameWrappers, metricFrames[key]) + } + + return frameWrappers, nil +} + +type metricFrame struct { + useFloatNumbers bool + key string + fields []*data.Field + fieldCache map[string]int +} + +// newMetricFrame will return a new frame with length 1. +func newMetricFrame(m influx.Metric, useFloatNumbers bool) *metricFrame { + s := &metricFrame{ + useFloatNumbers: useFloatNumbers, + key: m.Name(), + fields: make([]*data.Field, 1), + } + s.fields[0] = data.NewField("time", nil, []time.Time{m.Time()}) + return s +} + +// newMetricFrame will return a new frame with length 1. +func newMetricFrameLabelsColumn(m influx.Metric, useFloatNumbers bool) *metricFrame { + s := &metricFrame{ + useFloatNumbers: useFloatNumbers, + key: m.Name(), + fields: make([]*data.Field, 2), + fieldCache: map[string]int{}, + } + s.fields[0] = data.NewField("labels", nil, []string{}) + s.fields[1] = data.NewField("time", nil, []time.Time{}) + return s +} + +// Key returns a key which describes Frame metrics. +func (s *metricFrame) Key() string { + return s.key +} + +// Frame transforms metricFrame to Grafana data.Frame. +func (s *metricFrame) Frame() *data.Frame { + return data.NewFrame(s.key, s.fields...) +} + +// extend existing metricFrame fields. +func (s *metricFrame) extend(m influx.Metric) error { + fields := m.FieldList() + sort.Slice(fields, func(i, j int) bool { + return fields[i].Key < fields[j].Key + }) + labels := tagsToLabels(m.TagList()) + for _, f := range fields { + ft, v, err := s.getFieldTypeAndValue(f) + if err != nil { + return err + } + field := data.NewFieldFromFieldType(ft, 1) + field.Name = f.Key + field.Labels = labels + field.Set(0, v) + s.fields = append(s.fields, field) + } + return nil +} + +func tagsToLabels(tags []*influx.Tag) data.Labels { + labels := data.Labels{} + for i := 0; i < len(tags); i += 1 { + labels[tags[i].Key] = tags[i].Value + } + return labels +} + +// append to existing metricFrame fields. +func (s *metricFrame) append(m influx.Metric) error { + s.fields[0].Append(tagsToLabels(m.TagList()).String()) // TODO, use labels.String() + s.fields[1].Append(m.Time()) + + fields := m.FieldList() + sort.Slice(fields, func(i, j int) bool { + return fields[i].Key < fields[j].Key + }) + + for _, f := range fields { + ft, v, err := s.getFieldTypeAndValue(f) + if err != nil { + return err + } + if index, ok := s.fieldCache[f.Key]; ok { + field := s.fields[index] + if ft != field.Type() { + logger.Warn("error appending values", "type", field.Type(), "expect", ft, "value", v, "key", f.Key, "line", m) + if field.Type() == data.FieldTypeNullableString && v != nil { + str := fmt.Sprintf("%v", f.Value) + v = &str + } else { + v = nil + } + } + field.Append(v) + } else { + field := data.NewFieldFromFieldType(ft, 1) + field.Name = f.Key + field.Set(0, v) + s.fields = append(s.fields, field) + s.fieldCache[f.Key] = len(s.fields) - 1 + } + } + return nil +} + +// float64FieldTypeFor converts all numbers to float64. +// The precision can be lost during big int64 or uint64 conversion to float64. +func float64FieldTypeFor(t interface{}) data.FieldType { + switch t.(type) { + case int8: + return data.FieldTypeFloat64 + case int16: + return data.FieldTypeFloat64 + case int32: + return data.FieldTypeFloat64 + case int64: + return data.FieldTypeFloat64 + + case uint8: + return data.FieldTypeFloat64 + case uint16: + return data.FieldTypeFloat64 + case uint32: + return data.FieldTypeFloat64 + case uint64: + return data.FieldTypeFloat64 + + case float32: + return data.FieldTypeFloat64 + case float64: + return data.FieldTypeFloat64 + case bool: + return data.FieldTypeBool + case string: + return data.FieldTypeString + case time.Time: + return data.FieldTypeTime + } + return data.FieldTypeUnknown +} + +func (s *metricFrame) getFieldTypeAndValue(f *influx.Field) (data.FieldType, interface{}, error) { + var ft data.FieldType + if s.useFloatNumbers { + ft = float64FieldTypeFor(f.Value) + } else { + ft = data.FieldTypeFor(f.Value) + } + if ft == data.FieldTypeUnknown { + return ft, nil, fmt.Errorf("unknown type: %t", f.Value) + } + + // Make all fields nullable. + ft = ft.NullableType() + + convert, ok := getConvertFunc(ft) + if !ok { + return ft, nil, fmt.Errorf("no converter %s=%v (%T) %s", f.Key, f.Value, f.Value, ft.ItemTypeString()) + } + + v, err := convert(f.Value) + if err != nil { + return ft, nil, fmt.Errorf("value convert error: %v", err) + } + return ft, v, nil +} + +func getConvertFunc(ft data.FieldType) (func(v interface{}) (interface{}, error), bool) { + var convert func(v interface{}) (interface{}, error) + switch ft { + case data.FieldTypeNullableString: + convert = converters.AnyToNullableString.Converter + case data.FieldTypeNullableFloat64: + convert = converters.JSONValueToNullableFloat64.Converter + case data.FieldTypeNullableBool: + convert = converters.BoolToNullableBool.Converter + case data.FieldTypeNullableInt64: + convert = converters.JSONValueToNullableInt64.Converter + default: + return nil, false + } + return convert, true +} diff --git a/pkg/services/live/telemetry/telegraf/convert_test.go b/pkg/services/live/telemetry/telegraf/convert_test.go new file mode 100644 index 00000000000..1187b12e7fe --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/convert_test.go @@ -0,0 +1,255 @@ +package telegraf + +import ( + "encoding/json" + "flag" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana-plugin-sdk-go/experimental" + "github.com/stretchr/testify/require" +) + +func loadTestData(tb testing.TB, file string) []byte { + tb.Helper() + // Safe to disable, this is a test. + // nolint:gosec + content, err := ioutil.ReadFile(filepath.Join("testdata", file+".txt")) + require.NoError(tb, err, "expected to be able to read file") + require.True(tb, len(content) > 0) + return content +} + +func checkTestData(tb testing.TB, file string) *backend.DataResponse { + tb.Helper() + // Safe to disable, this is a test. + // nolint:gosec + content, err := ioutil.ReadFile(filepath.Join("testdata", file+".txt")) + require.NoError(tb, err, "expected to be able to read file") + require.True(tb, len(content) > 0) + + converter := NewConverter(WithUseLabelsColumn(true)) + frameWrappers, err := converter.Convert(content) + require.NoError(tb, err) + + dr := &backend.DataResponse{} + for _, w := range frameWrappers { + dr.Frames = append(dr.Frames, w.Frame()) + } + + err = experimental.CheckGoldenDataResponse(filepath.Join("testdata", file+".golden.txt"), dr, true) + require.NoError(tb, err) + return dr +} + +func TestNewConverter(t *testing.T) { + c := NewConverter(WithUseLabelsColumn(true)) + require.True(t, c.useLabelsColumn) +} + +func TestConverter_Convert(t *testing.T) { + testCases := []struct { + Name string + NumFields int + FieldLength int + NumFrames int + }{ + {Name: "single_metric", NumFields: 6, FieldLength: 1, NumFrames: 1}, + {Name: "same_metrics_same_labels_different_time", NumFields: 6, FieldLength: 1, NumFrames: 3}, + {Name: "same_metrics_different_labels_different_time", NumFields: 6, FieldLength: 1, NumFrames: 2}, + {Name: "same_metrics_different_labels_same_time", NumFields: 131, FieldLength: 1, NumFrames: 1}, + } + + for _, tt := range testCases { + t.Run(tt.Name, func(t *testing.T) { + testData := loadTestData(t, tt.Name) + converter := NewConverter() + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, tt.NumFrames) + for _, fw := range frameWrappers { + frame := fw.Frame() + require.Len(t, frame.Fields, tt.NumFields) + require.Equal(t, tt.FieldLength, frame.Fields[0].Len()) + _, err := data.FrameToJSON(frame, data.IncludeAll) + require.NoError(t, err) + } + }) + } +} + +func TestConverter_Convert_LabelsColumn(t *testing.T) { + testCases := []struct { + Name string + NumFields int + FieldLength int + NumFrames int + }{ + {Name: "single_metric", NumFields: 7, FieldLength: 1, NumFrames: 1}, + {Name: "same_metrics_same_labels_different_time", NumFields: 7, FieldLength: 3, NumFrames: 1}, + {Name: "same_metrics_different_labels_different_time", NumFields: 7, FieldLength: 2, NumFrames: 1}, + {Name: "same_metrics_different_labels_same_time", NumFields: 12, FieldLength: 13, NumFrames: 1}, + } + + for _, tt := range testCases { + t.Run(tt.Name, func(t *testing.T) { + testData := loadTestData(t, tt.Name) + converter := NewConverter(WithUseLabelsColumn(true)) + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, tt.NumFrames) + for _, fw := range frameWrappers { + frame := fw.Frame() + require.Len(t, frame.Fields, tt.NumFields) + require.Equal(t, tt.FieldLength, frame.Fields[0].Len()) + _, err := data.FrameToJSON(frame, data.IncludeAll) + require.NoError(t, err) + } + }) + } +} + +var update = flag.Bool("update", false, "update golden files") + +func TestConverter_Convert_NumFrameFields(t *testing.T) { + testData := loadTestData(t, "same_metrics_different_labels_same_time") + converter := NewConverter() + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 1) + frameWrapper := frameWrappers[0] + + goldenFile := filepath.Join("testdata", "golden_wide.json") + + frame := frameWrapper.Frame() + require.Len(t, frame.Fields, 131) // 10 measurements across 13 metrics + time field. + frameJSON, err := json.MarshalIndent(frame, "", " ") + require.NoError(t, err) + if *update { + if err := ioutil.WriteFile(goldenFile, frameJSON, 0600); err != nil { + t.Fatal(err) + } + } + // Safe to disable, this is a test. + // nolint:gosec + want, err := ioutil.ReadFile(goldenFile) + if err != nil { + t.Fatal(err) + } + require.JSONEqf(t, string(frameJSON), string(want), "not matched with golden file") +} + +func TestConverter_Convert_ChangingTypes(t *testing.T) { + dr := checkTestData(t, "changing_types_NaN") + require.NotNil(t, dr) +} + +func TestConverter_Convert_FieldOrder(t *testing.T) { + converter := NewConverter() + + testData := loadTestData(t, "single_metric") + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + + require.Len(t, frameWrappers, 1) + frameJSON1, err := data.FrameToJSON(frameWrappers[0].Frame(), data.IncludeAll) + require.NoError(t, err) + + testDataDifferentOrder := loadTestData(t, "single_metric_different_field_order") + frameWrappers, err = converter.Convert(testDataDifferentOrder) + require.NoError(t, err) + require.Len(t, frameWrappers, 1) + frameJSON2, err := data.FrameToJSON(frameWrappers[0].Frame(), data.IncludeAll) + require.NoError(t, err) + + require.JSONEqf(t, string(frameJSON1), string(frameJSON2), "frames must match") +} + +func BenchmarkConverter_Convert_Wide(b *testing.B) { + testData := loadTestData(b, "same_metrics_different_labels_same_time") + converter := NewConverter() + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := converter.Convert(testData) + if err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkConverter_Convert_LabelsColumn(b *testing.B) { + testData := loadTestData(b, "same_metrics_different_labels_same_time") + converter := NewConverter(WithUseLabelsColumn(true)) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := converter.Convert(testData) + if err != nil { + b.Fatal(err) + } + } +} + +func TestConverter_Convert_NumFrameFields_LabelsColumn(t *testing.T) { + testData := loadTestData(t, "same_metrics_different_labels_same_time") + converter := NewConverter(WithUseLabelsColumn(true)) + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 1) + frameWrapper := frameWrappers[0] + + goldenFile := filepath.Join("testdata", "golden_labels_column.json") + + frame := frameWrapper.Frame() + require.Len(t, frame.Fields, 12) + frameJSON, err := json.MarshalIndent(frame, "", " ") + require.NoError(t, err) + if *update { + if err := ioutil.WriteFile(goldenFile, frameJSON, 0600); err != nil { + t.Fatal(err) + } + } + // Safe to disable, this is a test. + // nolint:gosec + want, err := ioutil.ReadFile(goldenFile) + if err != nil { + t.Fatal(err) + } + require.JSONEqf(t, string(frameJSON), string(want), "not matched with golden file") +} + +func TestConverter_Convert_MixedNumberTypes_OK(t *testing.T) { + testData := loadTestData(t, "mixed_number_types") + converter := NewConverter(WithFloat64Numbers(true)) + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 2) +} + +func TestConverter_Convert_MixedNumberTypes_OK_LabelsColumn(t *testing.T) { + testData := loadTestData(t, "mixed_number_types") + converter := NewConverter(WithUseLabelsColumn(true), WithFloat64Numbers(true)) + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 1) +} + +func TestConverter_Convert_PartInput(t *testing.T) { + testData := loadTestData(t, "part_metrics_different_labels_different_time") + converter := NewConverter() + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 2) +} + +func TestConverter_Convert_PartInput_LabelsColumn(t *testing.T) { + testData := loadTestData(t, "part_metrics_different_labels_different_time") + converter := NewConverter(WithUseLabelsColumn(true)) + frameWrappers, err := converter.Convert(testData) + require.NoError(t, err) + require.Len(t, frameWrappers, 1) +} diff --git a/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt b/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt new file mode 100644 index 00000000000..941898d640f --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt @@ -0,0 +1,19 @@ +🌟 This was machine generated. Do not edit. 🌟 + +Frame[0] +Name: system +Dimensions: 5 Fields by 4 Rows ++----------------+-------------------------------+------------------+-----------------+-----------------+ +| Name: labels | Name: time | Name: sensor | Name: sensor2 | Name: state | +| Labels: | Labels: | Labels: | Labels: | Labels: | +| Type: []string | Type: []time.Time | Type: []*float64 | Type: []*string | Type: []*string | ++----------------+-------------------------------+------------------+-----------------+-----------------+ +| host=A | 2021-03-22 01:51:30 -0700 PDT | 0 | NaN | aaa | +| host=B | 2021-03-22 01:51:30 -0700 PDT | null | 0 | bbb | +| host=A | 2021-03-22 01:51:31 -0700 PDT | null | 0 | ccc | +| host=B | 2021-03-22 01:51:31 -0700 PDT | 0 | NaN | 1 | ++----------------+-------------------------------+------------------+-----------------+-----------------+ + + +====== TEST DATA RESPONSE (arrow base64) ====== +FRAME=QVJST1cxAAD/////mAIAABAAAAAAAAoADgAMAAsABAAKAAAAFAAAAAAAAAEDAAoADAAAAAgABAAKAAAACAAAAFQAAAACAAAAKAAAAAQAAADw/f//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAABD+//8IAAAAEAAAAAYAAABzeXN0ZW0AAAQAAABuYW1lAAAAAAUAAACoAQAAMAEAANAAAABgAAAABAAAAE7///8UAAAAPAAAADwAAAAAAAUBOAAAAAEAAAAEAAAAbP7//wgAAAAQAAAABQAAAHN0YXRlAAAABAAAAG5hbWUAAAAAAAAAAGT+//8FAAAAc3RhdGUAAACm////FAAAADwAAAA8AAAAAAAFATgAAAABAAAABAAAAMT+//8IAAAAEAAAAAcAAABzZW5zb3IyAAQAAABuYW1lAAAAAAAAAAC8/v//BwAAAHNlbnNvcjIAAAASABgAFAATABIADAAAAAgABAASAAAAFAAAADwAAAA8AAAAAAADATwAAAABAAAABAAAADD///8IAAAAEAAAAAYAAABzZW5zb3IAAAQAAABuYW1lAAAAAAAAAACi////AAACAAYAAABzZW5zb3IAAJ7///8UAAAAPAAAAEQAAAAAAAAKRAAAAAEAAAAEAAAAjP///wgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAASAAAAAAAAAVEAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAYAAABsYWJlbHMAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAYAAABsYWJlbHMAAAAAAAD/////eAEAABQAAAAAAAAADAAWABQAEwAMAAQADAAAAMAAAAAAAAAAFAAAAAAAAAMDAAoAGAAMAAgABAAKAAAAFAAAAOgAAAAEAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAIAAAAAAAAABQAAAAAAAAAAgAAAAAAAAAWAAAAAAAAAAgAAAAAAAAAHgAAAAAAAAAAAAAAAAAAAB4AAAAAAAAABgAAAAAAAAAkAAAAAAAAAAIAAAAAAAAAJgAAAAAAAAAAAAAAAAAAACYAAAAAAAAABgAAAAAAAAAsAAAAAAAAAAQAAAAAAAAAAAAAAAFAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAwAAAASAAAAGAAAAAAAAABob3N0PUFob3N0PUJob3N0PUFob3N0PUIANEvZC55uFgA0S9kLnm4WAP7lFAyebhYA/uUUDJ5uFgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAAFAAAACAAAAAAAAABOYU4wME5hTgAAAAADAAAABgAAAAkAAAAKAAAAAAAAAGFhYWJiYmNjYzEAAAAAAAAQAAAADAAUABIADAAIAAQADAAAABAAAAAsAAAAOAAAAAAAAwABAAAAqAIAAAAAAACAAQAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAoADAAAAAgABAAKAAAACAAAAFQAAAACAAAAKAAAAAQAAADw/f//CAAAAAwAAAAAAAAAAAAAAAUAAAByZWZJZAAAABD+//8IAAAAEAAAAAYAAABzeXN0ZW0AAAQAAABuYW1lAAAAAAUAAACoAQAAMAEAANAAAABgAAAABAAAAE7///8UAAAAPAAAADwAAAAAAAUBOAAAAAEAAAAEAAAAbP7//wgAAAAQAAAABQAAAHN0YXRlAAAABAAAAG5hbWUAAAAAAAAAAGT+//8FAAAAc3RhdGUAAACm////FAAAADwAAAA8AAAAAAAFATgAAAABAAAABAAAAMT+//8IAAAAEAAAAAcAAABzZW5zb3IyAAQAAABuYW1lAAAAAAAAAAC8/v//BwAAAHNlbnNvcjIAAAASABgAFAATABIADAAAAAgABAASAAAAFAAAADwAAAA8AAAAAAADATwAAAABAAAABAAAADD///8IAAAAEAAAAAYAAABzZW5zb3IAAAQAAABuYW1lAAAAAAAAAACi////AAACAAYAAABzZW5zb3IAAJ7///8UAAAAPAAAAEQAAAAAAAAKRAAAAAEAAAAEAAAAjP///wgAAAAQAAAABAAAAHRpbWUAAAAABAAAAG5hbWUAAAAAAAAAAAAABgAIAAYABgAAAAAAAwAEAAAAdGltZQAAEgAYABQAAAATAAwAAAAIAAQAEgAAABQAAABEAAAASAAAAAAAAAVEAAAAAQAAAAwAAAAIAAwACAAEAAgAAAAIAAAAEAAAAAYAAABsYWJlbHMAAAQAAABuYW1lAAAAAAAAAAAEAAQABAAAAAYAAABsYWJlbHMAAMACAABBUlJPVzE= diff --git a/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt b/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt new file mode 100644 index 00000000000..03694d13a6f --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt @@ -0,0 +1,4 @@ +system,host=A sensor=0,sensor2="NaN",state="aaa" 1616403090000000000 +system,host=B sensor="NaN",sensor2=0,state="bbb" 1616403090000000000 +system,host=A sensor="NaN",sensor2=0,state="ccc" 1616403091000000000 +system,host=B sensor=0,sensor2="NaN",state=1 1616403091000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json b/pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json new file mode 100644 index 00000000000..a9d754ed197 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json @@ -0,0 +1,285 @@ +{ + "schema": { + "name": "cpu", + "fields": [ + { + "name": "labels", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + } + } + ] + }, + "data": { + "values": [ + [ + "cpu=cpu0, host=MacBook-Pro-Alexander.local", + "cpu=cpu1, host=MacBook-Pro-Alexander.local", + "cpu=cpu2, host=MacBook-Pro-Alexander.local", + "cpu=cpu3, host=MacBook-Pro-Alexander.local", + "cpu=cpu4, host=MacBook-Pro-Alexander.local", + "cpu=cpu5, host=MacBook-Pro-Alexander.local", + "cpu=cpu6, host=MacBook-Pro-Alexander.local", + "cpu=cpu7, host=MacBook-Pro-Alexander.local", + "cpu=cpu8, host=MacBook-Pro-Alexander.local", + "cpu=cpu9, host=MacBook-Pro-Alexander.local", + "cpu=cpu10, host=MacBook-Pro-Alexander.local", + "cpu=cpu11, host=MacBook-Pro-Alexander.local", + "cpu=cpu-total, host=MacBook-Pro-Alexander.local" + ], + [ + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000, + 1616403090000 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 82.00000000012005, + 100, + 88.23529411773097, + 100, + 91.91919191902859, + 100, + 93.0000000000291, + 100, + 95.04950495055924, + 100, + 100, + 100, + 95.8368026645606 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 6.000000000005457, + 0, + 4.901960784315911, + 0, + 3.0303030303011163, + 0, + 2.000000000001023, + 0, + 1.9801980198033176, + 0, + 0, + 0, + 1.4987510408004405 + ], + [ + 12.000000000033651, + 0, + 6.862745098042275, + 0, + 5.0505050504922915, + 0, + 5.000000000006821, + 0, + 2.970297029704976, + 0, + 0, + 0, + 2.6644462947563388 + ] + ] + } +} \ No newline at end of file diff --git a/pkg/services/live/telemetry/telegraf/testdata/golden_wide.json b/pkg/services/live/telemetry/telegraf/testdata/golden_wide.json new file mode 100644 index 00000000000..9cc0f1f1a41 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/golden_wide.json @@ -0,0 +1,1971 @@ +{ + "schema": { + "name": "cpu", + "fields": [ + { + "name": "time", + "type": "time", + "typeInfo": { + "frame": "time.Time" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu0", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu1", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu2", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu3", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu4", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu5", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu6", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu7", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu8", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu9", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu10", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu11", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_guest_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_idle", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_iowait", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_irq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_nice", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_softirq", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_steal", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_system", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + }, + { + "name": "usage_user", + "type": "number", + "typeInfo": { + "frame": "float64", + "nullable": true + }, + "labels": { + "cpu": "cpu-total", + "host": "MacBook-Pro-Alexander.local" + } + } + ] + }, + "data": { + "values": [ + [ + 1616403090000 + ], + [ + 0 + ], + [ + 0 + ], + [ + 82.00000000012005 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 6.000000000005457 + ], + [ + 12.000000000033651 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 88.23529411773097 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 4.901960784315911 + ], + [ + 6.862745098042275 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 91.91919191902859 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 3.0303030303011163 + ], + [ + 5.0505050504922915 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 93.0000000000291 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 2.000000000001023 + ], + [ + 5.000000000006821 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 95.04950495055924 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 1.9801980198033176 + ], + [ + 2.970297029704976 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 100 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 95.8368026645606 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 0 + ], + [ + 1.4987510408004405 + ], + [ + 2.6644462947563388 + ] + ] + } +} \ No newline at end of file diff --git a/pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt b/pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt new file mode 100644 index 00000000000..89decc96efa --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt @@ -0,0 +1,2 @@ +avionics_actuator_ActuatorCommands,host=MacBook-Pro-Alexander.local tilt_deg_2=-17.7650375,surface_angle_deg_3=11.6852818,tilt_deg_0=-1.15918803,surface_angle_deg_8=-9.71168709,pitch_deg_4=-15.3900461,motor_current_A_6=12.0532084,pitch_brake_3=true,surface_angle_deg_1=-12.3403225,surface_angle_deg_7=29.6087742,tilt_brake_1=true,motor_current_A_11=15.4619112,motor_current_A_5=-5.99128914,pitch_brake_1=true,motor_current_A_2=9.32099056,tilt_brake_0=true,tilt_brake_4=false,tailno="GHIL",motor_current_A_1=2.68936205,pitch_brake_5=false,tilt_deg_3=47.3740387,surface_angle_deg_2=15.5803757,motor_current_A_4=24.7537708,tilt_deg_4=-32.8259926,pitch_brake_2=false,surface_angle_deg_0=-13.7655039,pitch_brake_0=true,tilt_deg_1=-20.9695129,motor_current_A_3=9.7648468,pitch_deg_5=9.11340141,motor_current_A_10=43.7951317,pitch_deg_1=8.13307095,surface_angle_deg_4=16.7721748,surface_angle_deg_6=-0.672622204,tilt_brake_2=true,motor_current_A_7=-15.5444078,surface_angle_deg_9=-27.5968456,tilt_brake_5=true,pitch_deg_2=-3.20253587,pitch_brake_4=true,tilt_deg_5=7.48156977,motor_current_A_8=37.8594284,pitch_deg_0=-29.9564457,tilt_brake_3=true,motor_current_A_0=1.99507976,surface_angle_deg_5=-16.7661037,pitch_deg_3=-20.904705,recorder="fcc1",motor_current_A_9=-19.5889759 1618400059121931000 +avionics_actuator_ActuatorCommands,host=MacBook-Pro-Alexander.local surface_angle_deg_0=-16.4649525,pitch_brake_2=false,motor_current_A_10=42.0176544,pitch_brake_3=false,tailno="GHIL",pitch_deg_1=9.89322376,surface_angle_deg_2=11.1123266,pitch_deg_4=-16.7317562,tilt_brake_2=true,motor_current_A_8=36.8988419,tilt_deg_5=5.36965704,surface_angle_deg_4=17.8226891,surface_angle_deg_6=-0.707197368,tilt_deg_2=-20.144413,pitch_brake_5=true,pitch_deg_2=-2.82733965,tilt_brake_5=false,motor_current_A_1=5.20447683,pitch_brake_1=false,motor_current_A_9=-19.5628815,surface_angle_deg_1=-12.6342392,pitch_deg_3=-21i,tilt_brake_4=true,motor_current_A_6=8.51478672,motor_current_A_0=2.84927869,tilt_deg_0=2.93773961,tilt_brake_3=true,tilt_deg_1=-20.8846588,surface_angle_deg_3=8.33424473,tilt_deg_4=-28.9802303,pitch_deg_5=6.43800926,surface_angle_deg_7=28.5278912,motor_current_A_7=-17.6263618,recorder="fcc1",surface_angle_deg_5=-23.5173836,tilt_brake_0=true,motor_current_A_5=-5.96704578,tilt_deg_3=45.6446266,motor_current_A_11=11.097291,pitch_brake_0=true,surface_angle_deg_9=-27.9620895,motor_current_A_3=6.87531996,motor_current_A_4=23.7491093,pitch_deg_0=-29.835228,motor_current_A_2=6.56280565,pitch_brake_4=false,surface_angle_deg_8=-9.53332138,tilt_brake_1=true 1618400059173608000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt b/pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt new file mode 100644 index 00000000000..4136ef8e67a --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt @@ -0,0 +1,17 @@ +cpu,cpu=cpu9,host=MacBook-Pro-Alexander.local usage_guest=0,usage_user=0,usage_system=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_softirq=0,usage_irq=0,usage_steal=0,usage_guest_nice=0 1616403089000000000 +cpu,cpu=cpu10,host=MacBook-Pro-Alexander.local usage_system=0,usage_idle=100,usage_nice=0,usage_guest=0,usage_guest_nice=0,usage_user=0,usage_iowait=0,usage_irq=0,usage_softirq=0,usage_steal=0 1616403089000000000 +cpu,cpu=cpu11,host=MacBook-Pro-Alexander.local usage_guest_nice=0,usage_user=0,usage_idle=100,usage_nice=0,usage_softirq=0,usage_guest=0,usage_system=0,usage_iowait=0,usage_irq=0,usage_steal=0 1616403089000000000 +cpu,cpu=cpu-total,host=MacBook-Pro-Alexander.local usage_nice=0,usage_iowait=0,usage_irq=0,usage_idle=95.8368026645606,usage_system=1.4987510408004405,usage_softirq=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=2.6644462947563388 1616403089000000000 +cpu,cpu=cpu0,host=MacBook-Pro-Alexander.local usage_system=6.000000000005457,usage_idle=82.00000000012005,usage_nice=0,usage_irq=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=12.000000000033651,usage_iowait=0,usage_softirq=0 1616403090000000000 +cpu,cpu=cpu1,host=MacBook-Pro-Alexander.local usage_user=0,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_system=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_guest=0 1616403090000000000 +cpu,cpu=cpu2,host=MacBook-Pro-Alexander.local usage_system=4.901960784315911,usage_idle=88.23529411773097,usage_iowait=0,usage_guest=0,usage_user=6.862745098042275,usage_nice=0,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0 1616403090000000000 +cpu,cpu=cpu3,host=MacBook-Pro-Alexander.local usage_user=0,usage_iowait=0,usage_steal=0,usage_guest_nice=0,usage_softirq=0,usage_guest=0,usage_system=0,usage_idle=100,usage_nice=0,usage_irq=0 1616403090000000000 +cpu,cpu=cpu4,host=MacBook-Pro-Alexander.local usage_idle=91.91919191902859,usage_nice=0,usage_iowait=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_system=3.0303030303011163,usage_irq=0,usage_softirq=0,usage_user=5.0505050504922915 1616403090000000000 +cpu,cpu=cpu5,host=MacBook-Pro-Alexander.local usage_softirq=0,usage_guest_nice=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_steal=0,usage_guest=0,usage_user=0,usage_system=0,usage_irq=0 1616403090000000000 +cpu,cpu=cpu6,host=MacBook-Pro-Alexander.local usage_idle=93.0000000000291,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_user=5.000000000006821,usage_system=2.000000000001023,usage_guest=0,usage_nice=0,usage_iowait=0 1616403090000000000 +cpu,cpu=cpu7,host=MacBook-Pro-Alexander.local usage_guest_nice=0,usage_user=0,usage_system=0,usage_idle=100,usage_iowait=0,usage_guest=0,usage_nice=0,usage_irq=0,usage_softirq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu8,host=MacBook-Pro-Alexander.local usage_system=1.9801980198033176,usage_idle=95.04950495055924,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_user=2.970297029704976,usage_nice=0,usage_iowait=0,usage_irq=0,usage_guest=0 1616403090000000000 +cpu,cpu=cpu9,host=MacBook-Pro-Alexander.local usage_guest=0,usage_user=0,usage_system=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_softirq=0,usage_irq=0,usage_steal=0,usage_guest_nice=0 1616403090000000000 +cpu,cpu=cpu10,host=MacBook-Pro-Alexander.local usage_system=0,usage_idle=100,usage_nice=0,usage_guest=0,usage_guest_nice=0,usage_user=0,usage_iowait=0,usage_irq=0,usage_softirq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu11,host=MacBook-Pro-Alexander.local usage_guest_nice=0,usage_user=0,usage_idle=100,usage_nice=0,usage_softirq=0,usage_guest=0,usage_system=0,usage_iowait=0,usage_irq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu-total,host=MacBook-Pro-Alexander.local usage_nice=0,usage_iowait=0,usage_irq=0,usage_idle=95.8368026645606,usage_system=1.4987510408004405,usage_softirq=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=2.6644462947563388 1616403090000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_different_time.txt b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_different_time.txt new file mode 100644 index 00000000000..4e061bd16db --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_different_time.txt @@ -0,0 +1,2 @@ +system,host=MacBook-Pro-Alexander.local,mylabel=boom1 load15=2.00341796875,n_cpus=12i,n_users=6i,load1=3.15966796875,load5=2.3837890625 1616403089000000000 +system,host=MacBook-Pro-Alexander.local,mylabel=boom2 load15=2.00341796875,n_cpus=11i,n_users=6i,load1=3.15966796875,load5=2.3837890625 1616403090000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt new file mode 100644 index 00000000000..321e10ab952 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt @@ -0,0 +1,13 @@ +cpu,cpu=cpu0,host=MacBook-Pro-Alexander.local usage_system=6.000000000005457,usage_idle=82.00000000012005,usage_nice=0,usage_irq=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=12.000000000033651,usage_iowait=0,usage_softirq=0 1616403090000000000 +cpu,cpu=cpu1,host=MacBook-Pro-Alexander.local usage_user=0,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_system=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_guest=0 1616403090000000000 +cpu,cpu=cpu2,host=MacBook-Pro-Alexander.local usage_system=4.901960784315911,usage_idle=88.23529411773097,usage_iowait=0,usage_guest=0,usage_user=6.862745098042275,usage_nice=0,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0 1616403090000000000 +cpu,cpu=cpu3,host=MacBook-Pro-Alexander.local usage_user=0,usage_iowait=0,usage_steal=0,usage_guest_nice=0,usage_softirq=0,usage_guest=0,usage_system=0,usage_idle=100,usage_nice=0,usage_irq=0 1616403090000000000 +cpu,cpu=cpu4,host=MacBook-Pro-Alexander.local usage_idle=91.91919191902859,usage_nice=0,usage_iowait=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_system=3.0303030303011163,usage_irq=0,usage_softirq=0,usage_user=5.0505050504922915 1616403090000000000 +cpu,cpu=cpu5,host=MacBook-Pro-Alexander.local usage_softirq=0,usage_guest_nice=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_steal=0,usage_guest=0,usage_user=0,usage_system=0,usage_irq=0 1616403090000000000 +cpu,cpu=cpu6,host=MacBook-Pro-Alexander.local usage_idle=93.0000000000291,usage_irq=0,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_user=5.000000000006821,usage_system=2.000000000001023,usage_guest=0,usage_nice=0,usage_iowait=0 1616403090000000000 +cpu,cpu=cpu7,host=MacBook-Pro-Alexander.local usage_guest_nice=0,usage_user=0,usage_system=0,usage_idle=100,usage_iowait=0,usage_guest=0,usage_nice=0,usage_irq=0,usage_softirq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu8,host=MacBook-Pro-Alexander.local usage_system=1.9801980198033176,usage_idle=95.04950495055924,usage_softirq=0,usage_steal=0,usage_guest_nice=0,usage_user=2.970297029704976,usage_nice=0,usage_iowait=0,usage_irq=0,usage_guest=0 1616403090000000000 +cpu,cpu=cpu9,host=MacBook-Pro-Alexander.local usage_guest=0,usage_user=0,usage_system=0,usage_idle=100,usage_nice=0,usage_iowait=0,usage_softirq=0,usage_irq=0,usage_steal=0,usage_guest_nice=0 1616403090000000000 +cpu,cpu=cpu10,host=MacBook-Pro-Alexander.local usage_system=0,usage_idle=100,usage_nice=0,usage_guest=0,usage_guest_nice=0,usage_user=0,usage_iowait=0,usage_irq=0,usage_softirq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu11,host=MacBook-Pro-Alexander.local usage_guest_nice=0,usage_user=0,usage_idle=100,usage_nice=0,usage_softirq=0,usage_guest=0,usage_system=0,usage_iowait=0,usage_irq=0,usage_steal=0 1616403090000000000 +cpu,cpu=cpu-total,host=MacBook-Pro-Alexander.local usage_nice=0,usage_iowait=0,usage_irq=0,usage_idle=95.8368026645606,usage_system=1.4987510408004405,usage_softirq=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=2.6644462947563388 1616403090000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt new file mode 100644 index 00000000000..6af397bd6e3 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt @@ -0,0 +1,3 @@ +system,host=MacBook-Pro-Alexander.local,mylabel=boom load15=2.00341796875,n_cpus=12i,n_users=6i,load1=3.15966796875,load5=2.3837890625 1616403089000000000 +system,host=MacBook-Pro-Alexander.local,mylabel=boom load15=2.00341796876,n_cpus=13i,n_users=7i,load1=3.15966796876,load5=2.3837890626 1616403090000000000 +system,host=MacBook-Pro-Alexander.local,mylabel=boom load15=2.00341796877,n_cpus=14i,n_users=8i,load1=3.15966796877,load5=2.3837890627 1616403091000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/single_metric.txt b/pkg/services/live/telemetry/telegraf/testdata/single_metric.txt new file mode 100644 index 00000000000..7be699360c2 --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/single_metric.txt @@ -0,0 +1 @@ +system,host=MacBook-Pro-Alexander.local,mylabel=boom load15=2.00341796875,n_cpus=12i,n_users=6i,load1=3.15966796875,load5=2.3837890625 1616403089000000000 diff --git a/pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt b/pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt new file mode 100644 index 00000000000..b2ee187e77c --- /dev/null +++ b/pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt @@ -0,0 +1 @@ +system,host=MacBook-Pro-Alexander.local,mylabel=boom load15=2.00341796875,n_users=6i,load1=3.15966796875,n_cpus=12i,load5=2.3837890625 1616403089000000000