Return multiple frames (frame per series)

This commit is contained in:
Alexander Zobnin
2021-05-27 13:28:14 +03:00
parent 24e9129fbe
commit 9a63a1f70f
3 changed files with 36 additions and 8 deletions

View File

@@ -125,11 +125,11 @@ func (ds *ZabbixDatasource) QueryData(ctx context.Context, req *backend.QueryDat
} else if query.Mode != 0 { } else if query.Mode != 0 {
res.Error = ErrNonMetricQueryNotSupported res.Error = ErrNonMetricQueryNotSupported
} else { } else {
frame, err := zabbixDS.queryNumericItems(ctx, &query) frames, err := zabbixDS.queryNumericItems(ctx, &query)
if err != nil { if err != nil {
res.Error = err res.Error = err
} else { } else {
res.Frames = append(res.Frames, frame) res.Frames = append(res.Frames, frames...)
} }
} }
qdr.Responses[q.RefID] = res qdr.Responses[q.RefID] = res

View File

@@ -55,6 +55,10 @@ func convertTimeSeriesToDataFrame(series []*timeseries.TimeSeriesData) *data.Fra
timeFileld.Name = "time" timeFileld.Name = "time"
frame := data.NewFrame("History", timeFileld) frame := data.NewFrame("History", timeFileld)
if len(series) == 0 {
return frame
}
for _, s := range series { for _, s := range series {
field := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0) field := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0)
field.Name = s.Meta.Name field.Name = s.Meta.Name
@@ -84,6 +88,32 @@ func convertTimeSeriesToDataFrame(series []*timeseries.TimeSeriesData) *data.Fra
return wideFrame return wideFrame
} }
func convertTimeSeriesToDataFrames(series []*timeseries.TimeSeriesData) []*data.Frame {
frames := make([]*data.Frame, 0)
for _, s := range series {
frames = append(frames, seriesToDataFrame(s))
}
return frames
}
func seriesToDataFrame(series *timeseries.TimeSeriesData) *data.Frame {
timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFileld.Name = "time"
seriesName := series.Meta.Name
valueField := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0)
valueField.Name = seriesName
frame := data.NewFrame(seriesName, timeFileld, valueField)
for _, point := range series.TS {
timeFileld.Append(point.Time)
valueField.Append(point.Value)
}
return frame
}
func convertHistoryToDataFrame(history zabbix.History, items []*zabbix.Item) *data.Frame { func convertHistoryToDataFrame(history zabbix.History, items []*zabbix.Item) *data.Frame {
timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFileld.Name = "time" timeFileld.Name = "time"

View File

@@ -41,7 +41,7 @@ func (ds *ZabbixDatasourceInstance) TestConnection(ctx context.Context) (string,
return string(resultByte), nil return string(resultByte), nil
} }
func (ds *ZabbixDatasourceInstance) queryNumericItems(ctx context.Context, query *QueryModel) (*data.Frame, error) { func (ds *ZabbixDatasourceInstance) queryNumericItems(ctx context.Context, query *QueryModel) ([]*data.Frame, error) {
groupFilter := query.Group.Filter groupFilter := query.Group.Filter
hostFilter := query.Host.Filter hostFilter := query.Host.Filter
appFilter := query.Application.Filter appFilter := query.Application.Filter
@@ -60,7 +60,7 @@ func (ds *ZabbixDatasourceInstance) queryNumericItems(ctx context.Context, query
return frames, nil return frames, nil
} }
func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context, query *QueryModel, items []*zabbix.Item) (*data.Frame, error) { func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context, query *QueryModel, items []*zabbix.Item) ([]*data.Frame, error) {
valueType := ds.getTrendValueType(query) valueType := ds.getTrendValueType(query)
consolidateBy := ds.getConsolidateBy(query) consolidateBy := ds.getConsolidateBy(query)
@@ -79,10 +79,8 @@ func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context
return nil, err return nil, err
} }
frame := convertTimeSeriesToDataFrame(series) frames := convertTimeSeriesToDataFrames(series)
return frames, nil
// frame := convertHistoryToDataFrame(history, items)
return frame, nil
} }
func (ds *ZabbixDatasourceInstance) getTrendValueType(query *QueryModel) string { func (ds *ZabbixDatasourceInstance) getTrendValueType(query *QueryModel) string {