InfluxDB: Fix regular expression to parse aliases according to documentation (#41186)
* Fix regular expression to parse aliases that start with either square brackets or dollar sign * Fix lint
This commit is contained in:
@@ -16,7 +16,7 @@ import (
|
|||||||
type ResponseParser struct{}
|
type ResponseParser struct{}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
legendFormat = regexp.MustCompile(`\[\[([\@\/\w-]+)(\.[\@\/\w-]+)*\]\]*|(\$*([\@\w-]+?))*`)
|
legendFormat = regexp.MustCompile(`\[\[([\@\/\w-]+)(\.[\@\/\w-]+)*\]\]*|\$(\s*([\@\w-]+?))*`)
|
||||||
)
|
)
|
||||||
|
|
||||||
func (rp *ResponseParser) Parse(buf io.ReadCloser, query *Query) *backend.QueryDataResponse {
|
func (rp *ResponseParser) Parse(buf io.ReadCloser, query *Query) *backend.QueryDataResponse {
|
||||||
|
|||||||
@@ -218,170 +218,202 @@ func TestInfluxdbResponseParser(t *testing.T) {
|
|||||||
newField,
|
newField,
|
||||||
)
|
)
|
||||||
result := parser.Parse(prepare(response), query)
|
result := parser.Parse(prepare(response), query)
|
||||||
|
t.Run("should parse aliases", func(t *testing.T) {
|
||||||
|
frame := result.Responses["A"]
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
frame := result.Responses["A"]
|
query = &Query{Alias: "alias $m $measurement", Measurement: "10m"}
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
result = parser.Parse(prepare(response), query)
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias $m $measurement", Measurement: "10m"}
|
frame = result.Responses["A"]
|
||||||
result = parser.Parse(prepare(response), query)
|
name := "alias 10m 10m"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
frame = result.Responses["A"]
|
query = &Query{Alias: "alias $col", Measurement: "10m"}
|
||||||
name := "alias 10m 10m"
|
result = parser.Parse(prepare(response), query)
|
||||||
testFrame.Name = name
|
frame = result.Responses["A"]
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
name = "alias mean"
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
testFrame.Name = name
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
}
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
name = "alias sum"
|
||||||
|
testFrame.Name = name
|
||||||
|
newField = data.NewField("value", labels, []*float64{
|
||||||
|
pointer.Float64(333),
|
||||||
|
})
|
||||||
|
testFrame.Fields[1] = newField
|
||||||
|
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[1], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
query = &Query{Alias: "alias $col", Measurement: "10m"}
|
query = &Query{Alias: "alias $tag_datacenter"}
|
||||||
result = parser.Parse(prepare(response), query)
|
result = parser.Parse(prepare(response), query)
|
||||||
frame = result.Responses["A"]
|
frame = result.Responses["A"]
|
||||||
name = "alias mean"
|
name = "alias America"
|
||||||
testFrame.Name = name
|
testFrame.Name = name
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
newField = data.NewField("value", labels, []*float64{
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
pointer.Float64(222),
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
})
|
||||||
}
|
testFrame.Fields[1] = newField
|
||||||
name = "alias sum"
|
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
||||||
testFrame.Name = name
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
newField = data.NewField("value", labels, []*float64{
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
pointer.Float64(333),
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias $tag_datacenter/$tag_datacenter"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias America/America"
|
||||||
|
testFrame.Name = name
|
||||||
|
newField = data.NewField("value", labels, []*float64{
|
||||||
|
pointer.Float64(222),
|
||||||
|
})
|
||||||
|
testFrame.Fields[1] = newField
|
||||||
|
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[col]]", Measurement: "10m"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias mean"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias $1"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias upc"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias $5"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias $5"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "series alias"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "series alias"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[m]] [[measurement]]", Measurement: "10m"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias 10m 10m"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[tag_datacenter]]"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias America"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[tag_dc.region.name]]"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias Northeast"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[tag_cluster-name]]"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias Cluster"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[tag_/cluster/name/]]"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias Cluster/"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias [[tag_@cluster@name@]]"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias Cluster@"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
testFrame.Fields[1] = newField
|
t.Run("shouldn't parse aliases", func(t *testing.T) {
|
||||||
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
query = &Query{Alias: "alias words with no brackets"}
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[1], data.FrameTestCompareOptions()...); diff != "" {
|
result = parser.Parse(prepare(response), query)
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
frame := result.Responses["A"]
|
||||||
}
|
name := "alias words with no brackets"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
query = &Query{Alias: "alias $tag_datacenter"}
|
query = &Query{Alias: "alias Test 1.5"}
|
||||||
result = parser.Parse(prepare(response), query)
|
result = parser.Parse(prepare(response), query)
|
||||||
frame = result.Responses["A"]
|
frame = result.Responses["A"]
|
||||||
name = "alias America"
|
name = "alias Test 1.5"
|
||||||
testFrame.Name = name
|
testFrame.Name = name
|
||||||
newField = data.NewField("value", labels, []*float64{
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
pointer.Float64(222),
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
|
|
||||||
|
query = &Query{Alias: "alias Test -1"}
|
||||||
|
result = parser.Parse(prepare(response), query)
|
||||||
|
frame = result.Responses["A"]
|
||||||
|
name = "alias Test -1"
|
||||||
|
testFrame.Name = name
|
||||||
|
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
||||||
|
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
||||||
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
testFrame.Fields[1] = newField
|
|
||||||
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias $tag_datacenter/$tag_datacenter"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias America/America"
|
|
||||||
testFrame.Name = name
|
|
||||||
newField = data.NewField("value", labels, []*float64{
|
|
||||||
pointer.Float64(222),
|
|
||||||
})
|
|
||||||
testFrame.Fields[1] = newField
|
|
||||||
testFrame.Fields[1].Config = &data.FieldConfig{DisplayNameFromDS: name}
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[col]]", Measurement: "10m"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias mean"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias $1"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias upc"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias $5"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias $5"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "series alias"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "series alias"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[m]] [[measurement]]", Measurement: "10m"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias 10m 10m"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[tag_datacenter]]"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias America"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[tag_dc.region.name]]"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias Northeast"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[tag_cluster-name]]"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias Cluster"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[tag_/cluster/name/]]"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias Cluster/"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
if diff := cmp.Diff(testFrame, frame.Frames[0], data.FrameTestCompareOptions()...); diff != "" {
|
|
||||||
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
||||||
}
|
|
||||||
|
|
||||||
query = &Query{Alias: "alias [[tag_@cluster@name@]]"}
|
|
||||||
result = parser.Parse(prepare(response), query)
|
|
||||||
frame = result.Responses["A"]
|
|
||||||
name = "alias Cluster@"
|
|
||||||
testFrame.Name = name
|
|
||||||
testFrame.Fields[1].Config.DisplayNameFromDS = name
|
|
||||||
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 with errors", func(t *testing.T) {
|
t.Run("Influxdb response parser with errors", func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user