Live: avoid panic when type changes (#35394)

This commit is contained in:
Ryan McKinley 2021-06-09 11:15:42 -07:00 committed by GitHub
parent e4a4446004
commit 4b8d796c54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 2917 additions and 8 deletions

2
go.mod
View File

@ -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
View File

@ -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=

View File

@ -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 {

View 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
}

View 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
}

View 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)
}

View 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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

View 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

View 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
]
]
}
}

File diff suppressed because it is too large Load Diff

View 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

View 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

View File

@ -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

View 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

View 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

View 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

View 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