mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Live: avoid panic when type changes (#35394)
This commit is contained in:
parent
e4a4446004
commit
4b8d796c54
2
go.mod
2
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
|
||||
|
5
go.sum
5
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=
|
||||
|
@ -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 {
|
||||
|
16
pkg/services/live/telemetry/converter.go
Normal file
16
pkg/services/live/telemetry/converter.go
Normal file
@ -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
|
||||
}
|
325
pkg/services/live/telemetry/telegraf/convert.go
Normal file
325
pkg/services/live/telemetry/telegraf/convert.go
Normal file
@ -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
|
||||
}
|
255
pkg/services/live/telemetry/telegraf/convert_test.go
Normal file
255
pkg/services/live/telemetry/telegraf/convert_test.go
Normal file
@ -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)
|
||||
}
|
19
pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt
vendored
Normal file
19
pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.golden.txt
vendored
Normal file
@ -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=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
|
4
pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt
vendored
Normal file
4
pkg/services/live/telemetry/telegraf/testdata/changing_types_NaN.txt
vendored
Normal file
@ -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
|
285
pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json
vendored
Normal file
285
pkg/services/live/telemetry/telegraf/testdata/golden_labels_column.json
vendored
Normal file
@ -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
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
1971
pkg/services/live/telemetry/telegraf/testdata/golden_wide.json
vendored
Normal file
1971
pkg/services/live/telemetry/telegraf/testdata/golden_wide.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt
vendored
Normal file
2
pkg/services/live/telemetry/telegraf/testdata/mixed_number_types.txt
vendored
Normal file
@ -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
|
17
pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt
vendored
Normal file
17
pkg/services/live/telemetry/telegraf/testdata/part_metrics_different_labels_different_time.txt
vendored
Normal file
@ -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
|
@ -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
|
13
pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt
vendored
Normal file
13
pkg/services/live/telemetry/telegraf/testdata/same_metrics_different_labels_same_time.txt
vendored
Normal file
@ -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
|
3
pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt
vendored
Normal file
3
pkg/services/live/telemetry/telegraf/testdata/same_metrics_same_labels_different_time.txt
vendored
Normal file
@ -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
|
1
pkg/services/live/telemetry/telegraf/testdata/single_metric.txt
vendored
Normal file
1
pkg/services/live/telemetry/telegraf/testdata/single_metric.txt
vendored
Normal file
@ -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
|
1
pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt
vendored
Normal file
1
pkg/services/live/telemetry/telegraf/testdata/single_metric_different_field_order.txt
vendored
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user