2019-10-24 10:15:27 -05:00
|
|
|
package tsdb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
2020-03-10 14:42:15 -05:00
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
2019-10-24 10:15:27 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
// SeriesToFrame converts a TimeSeries to a sdk Frame
|
2020-03-10 14:42:15 -05:00
|
|
|
func SeriesToFrame(series *TimeSeries) (*data.Frame, error) {
|
2019-10-24 10:15:27 -05:00
|
|
|
timeVec := make([]*time.Time, len(series.Points))
|
|
|
|
floatVec := make([]*float64, len(series.Points))
|
|
|
|
for idx, point := range series.Points {
|
|
|
|
timeVec[idx], floatVec[idx] = convertTSDBTimePoint(point)
|
|
|
|
}
|
2020-03-10 14:42:15 -05:00
|
|
|
frame := data.NewFrame(series.Name,
|
|
|
|
data.NewField("time", nil, timeVec),
|
|
|
|
data.NewField("value", data.Labels(series.Tags), floatVec),
|
2019-10-24 10:15:27 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
return frame, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// convertTSDBTimePoint coverts a tsdb.TimePoint into two values appropriate
|
|
|
|
// for Series values.
|
|
|
|
func convertTSDBTimePoint(point TimePoint) (t *time.Time, f *float64) {
|
|
|
|
timeIdx, valueIdx := 1, 0
|
|
|
|
if point[timeIdx].Valid { // Assuming valid is null?
|
|
|
|
tI := int64(point[timeIdx].Float64)
|
|
|
|
uT := time.Unix(tI/int64(1e+3), (tI%int64(1e+3))*int64(1e+6)) // time.Time from millisecond unix ts
|
|
|
|
t = &uT
|
|
|
|
}
|
|
|
|
if point[valueIdx].Valid {
|
|
|
|
f = &point[valueIdx].Float64
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|