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. 27
      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,6 +56,32 @@ 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 {
var hasTimeCol = false
for _, column := range row.Columns {
if column == "time" {
hasTimeCol = true
}
}
if !hasTimeCol {
var values []string
for _, valuePair := range row.Values {
if strings.Contains(strings.ToLower(query.RawQuery), strings.ToLower("SHOW TAG VALUES")) {
if len(valuePair) >= 2 {
values = append(values, valuePair[1].(string))
}
} else {
if len(valuePair) >= 1 {
values = append(values, valuePair[0].(string))
}
}
}
field := data.NewField("value", nil, values)
frames = append(frames, data.NewFrame(row.Name, field))
} else {
for columnIndex, column := range row.Columns { for columnIndex, column := range row.Columns {
if column == "time" { if column == "time" {
continue continue
@ -84,6 +110,7 @@ func transformRows(rows []Row, query Query) data.Frames {
frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField)) frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField))
} }
} }
}
return frames return frames
} }

@ -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