From 9a63a1f70f43d91877cd63fe553128f8565a5954 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 27 May 2021 13:28:14 +0300 Subject: [PATCH] Return multiple frames (frame per series) --- pkg/datasource/datasource.go | 4 ++-- pkg/datasource/response_handler.go | 30 ++++++++++++++++++++++++++++++ pkg/datasource/zabbix.go | 10 ++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/pkg/datasource/datasource.go b/pkg/datasource/datasource.go index f35ba60..607c661 100644 --- a/pkg/datasource/datasource.go +++ b/pkg/datasource/datasource.go @@ -125,11 +125,11 @@ func (ds *ZabbixDatasource) QueryData(ctx context.Context, req *backend.QueryDat } else if query.Mode != 0 { res.Error = ErrNonMetricQueryNotSupported } else { - frame, err := zabbixDS.queryNumericItems(ctx, &query) + frames, err := zabbixDS.queryNumericItems(ctx, &query) if err != nil { res.Error = err } else { - res.Frames = append(res.Frames, frame) + res.Frames = append(res.Frames, frames...) } } qdr.Responses[q.RefID] = res diff --git a/pkg/datasource/response_handler.go b/pkg/datasource/response_handler.go index 1182bca..d137636 100644 --- a/pkg/datasource/response_handler.go +++ b/pkg/datasource/response_handler.go @@ -55,6 +55,10 @@ func convertTimeSeriesToDataFrame(series []*timeseries.TimeSeriesData) *data.Fra timeFileld.Name = "time" frame := data.NewFrame("History", timeFileld) + if len(series) == 0 { + return frame + } + for _, s := range series { field := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0) field.Name = s.Meta.Name @@ -84,6 +88,32 @@ func convertTimeSeriesToDataFrame(series []*timeseries.TimeSeriesData) *data.Fra 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 { timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0) timeFileld.Name = "time" diff --git a/pkg/datasource/zabbix.go b/pkg/datasource/zabbix.go index 18f45c4..d692d51 100644 --- a/pkg/datasource/zabbix.go +++ b/pkg/datasource/zabbix.go @@ -41,7 +41,7 @@ func (ds *ZabbixDatasourceInstance) TestConnection(ctx context.Context) (string, 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 hostFilter := query.Host.Filter appFilter := query.Application.Filter @@ -60,7 +60,7 @@ func (ds *ZabbixDatasourceInstance) queryNumericItems(ctx context.Context, query 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) consolidateBy := ds.getConsolidateBy(query) @@ -79,10 +79,8 @@ func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context return nil, err } - frame := convertTimeSeriesToDataFrame(series) - - // frame := convertHistoryToDataFrame(history, items) - return frame, nil + frames := convertTimeSeriesToDataFrames(series) + return frames, nil } func (ds *ZabbixDatasourceInstance) getTrendValueType(query *QueryModel) string {