Use time series format internally

This commit is contained in:
Alexander Zobnin
2021-05-24 17:11:36 +03:00
parent f3d6fa3c2b
commit 7748508a5c
6 changed files with 125 additions and 14 deletions

View File

@@ -5,12 +5,85 @@ import (
"strconv"
"time"
"github.com/alexanderzobnin/grafana-zabbix/pkg/timeseries"
"github.com/alexanderzobnin/grafana-zabbix/pkg/zabbix"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/data"
)
func convertHistoryToDataFrame(history zabbix.History, items zabbix.Items) *data.Frame {
func convertHistoryToTimeSeries(history zabbix.History, items []*zabbix.Item) []*timeseries.TimeSeriesData {
seriesMap := make(map[string]*timeseries.TimeSeriesData, len(items))
itemsMap := make(map[string]*zabbix.Item, len(items))
for _, item := range items {
itemsMap[item.ID] = item
}
for _, point := range history {
pointItem := itemsMap[point.ItemID]
if seriesMap[point.ItemID] == nil {
seriesMap[point.ItemID] = timeseries.NewTimeSeriesData()
}
pointSeries := seriesMap[point.ItemID]
if pointSeries.Meta.Item == nil {
pointSeries.Meta.Item = pointItem
}
value := point.Value
pointSeries.Add(timeseries.TimePoint{
Time: time.Unix(point.Clock, point.NS),
Value: &value,
})
}
series := make([]*timeseries.TimeSeriesData, 0)
for _, tsd := range seriesMap {
series = append(series, tsd)
}
return series
}
func convertTimeSeriesToDataFrame(series []*timeseries.TimeSeriesData) *data.Frame {
timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFileld.Name = "time"
frame := data.NewFrame("History", timeFileld)
for _, s := range series {
field := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0)
item := s.Meta.Item
if len(item.Hosts) > 0 {
field.Name = fmt.Sprintf("%s: %s", item.Hosts[0].Name, item.ExpandItemName())
} else {
field.Name = item.ExpandItemName()
}
frame.Fields = append(frame.Fields, field)
}
for i, s := range series {
currentFieldIndex := i + 1
for _, point := range s.TS {
timeFileld.Append(point.Time)
for fieldIndex, field := range frame.Fields {
if fieldIndex == currentFieldIndex {
field.Append(point.Value)
} else if fieldIndex > 0 {
field.Append(nil)
}
}
}
}
wideFrame, err := data.LongToWide(frame, &data.FillMissing{Mode: data.FillModeNull})
if err != nil {
backend.Logger.Debug("Error converting data frame to the wide format", "error", err)
return frame
}
return wideFrame
}
func convertHistoryToDataFrame(history zabbix.History, items []*zabbix.Item) *data.Frame {
timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
timeFileld.Name = "time"
frame := data.NewFrame("History", timeFileld)

View File

@@ -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.Items) (*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)
@@ -73,7 +73,12 @@ func (ds *ZabbixDatasourceInstance) queryNumericDataForItems(ctx context.Context
return nil, err
}
frame := convertHistoryToDataFrame(history, items)
series := convertHistoryToTimeSeries(history, items)
// TODO: handle time series functions
frame := convertTimeSeriesToDataFrame(series)
// frame := convertHistoryToDataFrame(history, items)
return frame, nil
}
@@ -100,7 +105,7 @@ func (ds *ZabbixDatasourceInstance) getConsolidateBy(query *QueryModel) string {
return consolidateBy
}
func (ds *ZabbixDatasourceInstance) getHistotyOrTrend(ctx context.Context, query *QueryModel, items zabbix.Items, trendValueType string) (zabbix.History, error) {
func (ds *ZabbixDatasourceInstance) getHistotyOrTrend(ctx context.Context, query *QueryModel, items []*zabbix.Item, trendValueType string) (zabbix.History, error) {
timeRange := query.TimeRange
useTrend := ds.isUseTrend(timeRange)