78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package datasource
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"time"
|
|
|
|
"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 {
|
|
timeFileld := data.NewFieldFromFieldType(data.FieldTypeTime, 0)
|
|
timeFileld.Name = "time"
|
|
frame := data.NewFrame("History", timeFileld)
|
|
|
|
for _, item := range items {
|
|
field := data.NewFieldFromFieldType(data.FieldTypeNullableFloat64, 0)
|
|
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 _, point := range history {
|
|
for columnIndex, field := range frame.Fields {
|
|
if columnIndex == 0 {
|
|
ts := time.Unix(point.Clock, point.NS)
|
|
field.Append(ts)
|
|
} else {
|
|
item := items[columnIndex-1]
|
|
if point.ItemID == item.ID {
|
|
value := point.Value
|
|
field.Append(&value)
|
|
} else {
|
|
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 convertTrendToHistory(trend zabbix.Trend, valueType string) (zabbix.History, error) {
|
|
history := make([]zabbix.HistoryPoint, 0)
|
|
for _, point := range trend {
|
|
valueStr := point.ValueAvg
|
|
switch valueType {
|
|
case "min":
|
|
valueStr = point.ValueMin
|
|
case "max":
|
|
valueStr = point.ValueMax
|
|
}
|
|
|
|
value, err := strconv.ParseFloat(valueStr, 64)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error parsing trend value: %s", err)
|
|
}
|
|
|
|
history = append(history, zabbix.HistoryPoint{
|
|
ItemID: point.ItemID,
|
|
Clock: point.Clock,
|
|
Value: value,
|
|
})
|
|
}
|
|
|
|
return history, nil
|
|
}
|