mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
@@ -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 }
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user