[v11.0.x] OpenTSDB: Fix data frame construction (#91756)
OpenTSDB: Fix data frame construction (#90991)
* Update type and frame construction
* Update tests
* Keep dataField name as value
(cherry picked from commit 06509712ec)
Co-authored-by: Andreas Christou <andreas.christou@grafana.com>
This commit is contained in:
co-authored by
Andreas Christou
parent
d96741eb51
commit
503bbbedbc
@@ -8,7 +8,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -121,6 +120,9 @@ func (s *Service) createRequest(ctx context.Context, logger log.Logger, dsInfo *
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
u.Path = path.Join(u.Path, "api/query")
|
u.Path = path.Join(u.Path, "api/query")
|
||||||
|
queryParams := u.Query()
|
||||||
|
queryParams.Set("arrays", "true")
|
||||||
|
u.RawQuery = queryParams.Encode()
|
||||||
|
|
||||||
postData, err := json.Marshal(data)
|
postData, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -165,23 +167,25 @@ func (s *Service) parseResponse(logger log.Logger, res *http.Response, myRefID s
|
|||||||
|
|
||||||
frames := data.Frames{}
|
frames := data.Frames{}
|
||||||
for _, val := range responseData {
|
for _, val := range responseData {
|
||||||
timeVector := make([]time.Time, 0, len(val.DataPoints))
|
labels := data.Labels{}
|
||||||
values := make([]float64, 0, len(val.DataPoints))
|
for label, value := range val.Tags {
|
||||||
name := val.Metric
|
labels[label] = value
|
||||||
tags := val.Tags
|
|
||||||
|
|
||||||
for timeString, value := range val.DataPoints {
|
|
||||||
timestamp, err := strconv.ParseInt(timeString, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
logger.Info("Failed to unmarshal opentsdb timestamp", "timestamp", timeString)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
timeVector = append(timeVector, time.Unix(timestamp, 0).UTC())
|
|
||||||
values = append(values, value)
|
|
||||||
}
|
}
|
||||||
frames = append(frames, data.NewFrame(name,
|
|
||||||
data.NewField("time", nil, timeVector),
|
frame := data.NewFrameOfFieldTypes(val.Metric, len(val.DataPoints), data.FieldTypeTime, data.FieldTypeFloat64)
|
||||||
data.NewField("value", tags, values)))
|
frame.Meta = &data.FrameMeta{Type: data.FrameTypeTimeSeriesMulti, TypeVersion: data.FrameTypeVersion{0, 1}}
|
||||||
|
frame.RefID = myRefID
|
||||||
|
timeField := frame.Fields[0]
|
||||||
|
timeField.Name = data.TimeSeriesTimeFieldName
|
||||||
|
dataField := frame.Fields[1]
|
||||||
|
dataField.Name = "value"
|
||||||
|
dataField.Labels = labels
|
||||||
|
|
||||||
|
points := val.DataPoints
|
||||||
|
for i, point := range points {
|
||||||
|
frame.SetRow(i, time.Unix(int64(point[0]), 0).UTC(), point[1])
|
||||||
|
}
|
||||||
|
frames = append(frames, frame)
|
||||||
}
|
}
|
||||||
result := resp.Responses[myRefID]
|
result := resp.Responses[myRefID]
|
||||||
result.Frames = frames
|
result.Frames = frames
|
||||||
|
|||||||
@@ -43,9 +43,9 @@ func TestOpenTsdbExecutor(t *testing.T) {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"metric": "test",
|
"metric": "test",
|
||||||
"dps": {
|
"dps": [
|
||||||
"1405544146": 50.0
|
[1405544146, 50.0]
|
||||||
},
|
],
|
||||||
"tags" : {
|
"tags" : {
|
||||||
"env": "prod",
|
"env": "prod",
|
||||||
"app": "grafana"
|
"app": "grafana"
|
||||||
@@ -54,12 +54,17 @@ func TestOpenTsdbExecutor(t *testing.T) {
|
|||||||
]`
|
]`
|
||||||
|
|
||||||
testFrame := data.NewFrame("test",
|
testFrame := data.NewFrame("test",
|
||||||
data.NewField("time", nil, []time.Time{
|
data.NewField("Time", nil, []time.Time{
|
||||||
time.Date(2014, 7, 16, 20, 55, 46, 0, time.UTC),
|
time.Date(2014, 7, 16, 20, 55, 46, 0, time.UTC),
|
||||||
}),
|
}),
|
||||||
data.NewField("value", map[string]string{"env": "prod", "app": "grafana"}, []float64{
|
data.NewField("value", map[string]string{"env": "prod", "app": "grafana"}, []float64{
|
||||||
50}),
|
50}),
|
||||||
)
|
)
|
||||||
|
testFrame.Meta = &data.FrameMeta{
|
||||||
|
Type: data.FrameTypeTimeSeriesMulti,
|
||||||
|
TypeVersion: data.FrameTypeVersion{0, 1},
|
||||||
|
}
|
||||||
|
testFrame.RefID = "A"
|
||||||
|
|
||||||
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
|
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
|
||||||
resp.StatusCode = 200
|
resp.StatusCode = 200
|
||||||
@@ -80,9 +85,9 @@ func TestOpenTsdbExecutor(t *testing.T) {
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"metric": "test",
|
"metric": "test",
|
||||||
"dps": {
|
"dps": [
|
||||||
"1405544146": 50.0
|
[1405544146, 50.0]
|
||||||
},
|
],
|
||||||
"tags" : {
|
"tags" : {
|
||||||
"env": "prod",
|
"env": "prod",
|
||||||
"app": "grafana"
|
"app": "grafana"
|
||||||
@@ -91,12 +96,17 @@ func TestOpenTsdbExecutor(t *testing.T) {
|
|||||||
]`
|
]`
|
||||||
|
|
||||||
testFrame := data.NewFrame("test",
|
testFrame := data.NewFrame("test",
|
||||||
data.NewField("time", nil, []time.Time{
|
data.NewField("Time", nil, []time.Time{
|
||||||
time.Date(2014, 7, 16, 20, 55, 46, 0, time.UTC),
|
time.Date(2014, 7, 16, 20, 55, 46, 0, time.UTC),
|
||||||
}),
|
}),
|
||||||
data.NewField("value", map[string]string{"env": "prod", "app": "grafana"}, []float64{
|
data.NewField("value", map[string]string{"env": "prod", "app": "grafana"}, []float64{
|
||||||
50}),
|
50}),
|
||||||
)
|
)
|
||||||
|
testFrame.Meta = &data.FrameMeta{
|
||||||
|
Type: data.FrameTypeTimeSeriesMulti,
|
||||||
|
TypeVersion: data.FrameTypeVersion{0, 1},
|
||||||
|
}
|
||||||
|
testFrame.RefID = myRefid
|
||||||
|
|
||||||
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
|
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
|
||||||
resp.StatusCode = 200
|
resp.StatusCode = 200
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ type OpenTsdbQuery struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type OpenTsdbResponse struct {
|
type OpenTsdbResponse struct {
|
||||||
Metric string `json:"metric"`
|
Metric string `json:"metric"`
|
||||||
Tags map[string]string `json:"tags"`
|
Tags map[string]string `json:"tags"`
|
||||||
DataPoints map[string]float64 `json:"dps"`
|
DataPoints [][]float64 `json:"dps"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user