InfluxDB: metricFindQuery migration to backend (#44546)

* Send metricFindQuery to backend

* Added feature toggle

* Changed flag name

* metricFindQuery backend

* Added test for metricFindQuery backend parse

* Added test for show tag values

* Test for metricFindQueries

* Updated tests

* Put back comment

* Case insensitive in transformRows

* Check length ov value pair

* Sep tests

* Updated valuePair index
pull/44789/head
Joey Tawadrous 4 years ago committed by GitHub
parent 6a38ce2307
commit b4dd3138ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 59
      pkg/tsdb/influxdb/response_parser.go
  2. 86
      pkg/tsdb/influxdb/response_parser_test.go
  3. 3
      public/app/plugins/datasource/influxdb/datasource.ts

@ -56,32 +56,59 @@ func parseJSON(buf io.ReadCloser) (Response, error) {
func transformRows(rows []Row, query Query) data.Frames { func transformRows(rows []Row, query Query) data.Frames {
frames := data.Frames{} frames := data.Frames{}
for _, row := range rows { for _, row := range rows {
for columnIndex, column := range row.Columns { var hasTimeCol = false
for _, column := range row.Columns {
if column == "time" { if column == "time" {
continue hasTimeCol = true
} }
}
var timeArray []time.Time if !hasTimeCol {
var valueArray []*float64 var values []string
for _, valuePair := range row.Values { for _, valuePair := range row.Values {
timestamp, timestampErr := parseTimestamp(valuePair[0]) if strings.Contains(strings.ToLower(query.RawQuery), strings.ToLower("SHOW TAG VALUES")) {
// we only add this row if the timestamp is valid if len(valuePair) >= 2 {
if timestampErr == nil { values = append(values, valuePair[1].(string))
value := parseValue(valuePair[columnIndex]) }
timeArray = append(timeArray, timestamp) } else {
valueArray = append(valueArray, value) if len(valuePair) >= 1 {
values = append(values, valuePair[0].(string))
}
} }
} }
name := formatFrameName(row, column, query)
timeField := data.NewField("time", nil, timeArray) field := data.NewField("value", nil, values)
valueField := data.NewField("value", row.Tags, valueArray) frames = append(frames, data.NewFrame(row.Name, field))
} else {
for columnIndex, column := range row.Columns {
if column == "time" {
continue
}
var timeArray []time.Time
var valueArray []*float64
for _, valuePair := range row.Values {
timestamp, timestampErr := parseTimestamp(valuePair[0])
// we only add this row if the timestamp is valid
if timestampErr == nil {
value := parseValue(valuePair[columnIndex])
timeArray = append(timeArray, timestamp)
valueArray = append(valueArray, value)
}
}
name := formatFrameName(row, column, query)
timeField := data.NewField("time", nil, timeArray)
valueField := data.NewField("value", row.Tags, valueArray)
// set a nice name on the value-field // set a nice name on the value-field
valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name}) valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name})
frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField)) frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField))
}
} }
} }

@ -91,6 +91,85 @@ func TestInfluxdbResponseParser(t *testing.T) {
} }
}) })
t.Run("Influxdb response parser should parse metricFindQueries normally", func(t *testing.T) {
parser := &ResponseParser{}
response := `
{
"results": [
{
"series": [
{
"refId": "metricFindQuery",
"name": "cpu",
"values": [
["cpu"],
["disk"],
["logs"]
]
}
]
}
]
}
`
var queries []Query
queries = append(queries, Query{RefID: "metricFindQuery"})
newField := data.NewField("value", nil, []string{
"cpu", "disk", "logs",
})
testFrame := data.NewFrame("cpu",
newField,
)
result := parser.Parse(prepare(response), queries)
frame := result.Responses["metricFindQuery"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
t.Errorf("Result mismatch (-want +got):\n%s", diff)
}
})
t.Run("Influxdb response parser should parse metricFindQueries->SHOW TAG VALUES normally", func(t *testing.T) {
parser := &ResponseParser{}
response := `
{
"results": [
{
"series": [
{
"name": "cpu",
"values": [
["values", "cpu-total"],
["values", "cpu0"],
["values", "cpu1"]
]
}
]
}
]
}
`
var queries []Query
queries = append(queries, Query{RawQuery: "SHOW TAG VALUES", RefID: "metricFindQuery"})
newField := data.NewField("value", nil, []string{
"cpu-total", "cpu0", "cpu1",
})
testFrame := data.NewFrame("cpu",
newField,
)
result := parser.Parse(prepare(response), queries)
frame := result.Responses["metricFindQuery"]
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
t.Errorf("Result mismatch (-want +got):\n%s", diff)
}
})
t.Run("Influxdb response parser should parse two responses with different refIDs", func(t *testing.T) { t.Run("Influxdb response parser should parse two responses with different refIDs", func(t *testing.T) {
parser := &ResponseParser{} parser := &ResponseParser{}
@ -130,7 +209,12 @@ func TestInfluxdbResponseParser(t *testing.T) {
"series": [ "series": [
{ {
"name": "cpu", "name": "cpu",
"columns": ["time","mean"] "columns": ["time","cpu"],
"values": [
["values", "cpu-total"],
["values", "cpu0"],
["values", "cpu1"]
]
} }
] ]
} }

@ -445,10 +445,11 @@ export default class InfluxDatasource extends DataSourceWithBackend<InfluxQuery,
} }
async metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> { async metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> {
if (this.isFlux) { if (this.isFlux || (config.featureToggles.influxdbBackendMigration && this.access === 'proxy')) {
const target: InfluxQuery = { const target: InfluxQuery = {
refId: 'metricFindQuery', refId: 'metricFindQuery',
query, query,
rawQuery: true,
}; };
return lastValueFrom( return lastValueFrom(
super.query({ super.query({

Loading…
Cancel
Save