mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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
This commit is contained in:
@@ -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
|
||||||
if column == "time" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeArray []time.Time
|
for _, column := range row.Columns {
|
||||||
var valueArray []*float64
|
if column == "time" {
|
||||||
|
hasTimeCol = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !hasTimeCol {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
// set a nice name on the value-field
|
var timeArray []time.Time
|
||||||
valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name})
|
var valueArray []*float64
|
||||||
|
|
||||||
frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField))
|
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
|
||||||
|
valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name})
|
||||||
|
|
||||||
|
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({
|
||||||
|
|||||||
Reference in New Issue
Block a user