SSE: Dataplane Compliance (#65927)

Takes a specific code path for data that identifies itself as dataplane instead of "guessing" what the data is.

The data must identify itself by being in the dataplane by having both the following frame metadata properties:

- TypeVersion property that is greater than 0.0
- 'Type' property

The flag is disableSSEDataplane and disables this functionality and uses the old code for all queries regardless.

See https://github.com/grafana/grafana-plugin-sdk-go/blob/main/data/contract_docs/contract.md for dataplane details.
This commit is contained in:
Kyle Brandt
2023-04-12 12:24:34 -04:00
committed by GitHub
parent b83627a661
commit e78be44e1a
17 changed files with 480 additions and 6 deletions

View File

@@ -5,6 +5,7 @@ import (
"sort"
"time"
"github.com/grafana/dataplane/sdata/timeseries"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/expr/mathexp/parse"
@@ -132,12 +133,50 @@ func NewSeries(refID string, labels data.Labels, size int) Series {
fields := make([]*data.Field, 2)
fields[seriesTypeTimeIdx] = data.NewField("Time", nil, make([]time.Time, size))
fields[seriesTypeValIdx] = data.NewField(refID, labels, make([]*float64, size))
frame := data.NewFrame("", fields...)
frame.RefID = refID
frame.Meta = &data.FrameMeta{
Type: data.FrameTypeTimeSeriesMulti,
TypeVersion: data.FrameTypeVersion{0, 1},
}
return Series{
Frame: data.NewFrame("", fields...),
Frame: frame,
}
}
// NewSeries returns a dataframe of type Series.
func NewSeriesFromRef(refID string, s timeseries.MetricRef) (Series, error) {
frame := data.NewFrame("")
frame.RefID = refID
frame.Meta = &data.FrameMeta{
Type: data.FrameTypeTimeSeriesMulti,
TypeVersion: data.FrameTypeVersion{0, 1},
}
valField := s.ValueField
if valField.Type() != data.FieldTypeNullableFloat64 {
convertedField := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, valField.Len())
convertedField.Name = valField.Name
convertedField.Labels = valField.Labels
convertedField.Config = valField.Config
for j := 0; j < valField.Len(); j++ {
ff, err := valField.NullableFloatAt(j)
if err != nil {
break
}
convertedField.Set(j, ff)
}
valField = convertedField
}
frame.Fields = []*data.Field{s.TimeField, valField}
return Series{
Frame: frame, // No Data Frame
}, nil
}
// Type returns the Value type and allows it to fulfill the Value interface.
func (s Series) Type() parse.ReturnType { return parse.TypeSeriesSet }

View File

@@ -1,6 +1,7 @@
package mathexp
import (
"github.com/grafana/dataplane/sdata/numeric"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/expr/mathexp/parse"
@@ -128,10 +129,31 @@ func NewNumber(name string, labels data.Labels) Number {
return Number{
data.NewFrame("",
data.NewField(name, labels, make([]*float64, 1)),
),
).SetMeta(&data.FrameMeta{
Type: data.FrameTypeNumericMulti,
TypeVersion: data.FrameTypeVersion{0, 1},
}),
}
}
// NewNumber returns a data that holds a float64Vector
func NumberFromRef(refID string, nr numeric.MetricRef) (Number, error) {
f, _, err := nr.NullableFloat64Value()
if err != nil {
return Number{}, err
}
frame := data.NewFrame("",
data.NewField(nr.GetMetricName(), nr.GetLabels(), []*float64{f})).SetMeta(&data.FrameMeta{
Type: data.FrameTypeNumericMulti,
TypeVersion: data.FrameTypeVersion{0, 1},
})
frame.Fields[0].Config = nr.ValueField.Config
return Number{frame}, nil
}
func (n Number) GetMeta() interface{} {
return n.Frame.Meta.Custom
}