Chore: InfluxQL stream parser improvements (#85041)

* don't iterate over first column as it is a time column already

* don't iterate over first column as it was handled earlier

* add more flexibility to run the commands

* Update pkg/tsdb/influxdb/influxql/converter/converter.go

Co-authored-by: Nick Richmond <5732000+NWRichmond@users.noreply.github.com>

---------

Co-authored-by: Nick Richmond <5732000+NWRichmond@users.noreply.github.com>
This commit is contained in:
ismail simsek 2024-03-26 18:25:03 +01:00 committed by GitHub
parent c80b31a0d4
commit fec7765111
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 22 deletions

View File

@ -345,11 +345,9 @@ func typeOf(value interface{}) data.FieldType {
func handleTimeSeriesFormatWithTimeColumn(valueFields data.Fields, tags map[string]string, columns []string, measurement string, frameName []byte, query *models.Query) []*data.Frame {
frames := make([]*data.Frame, 0, len(columns)-1)
for i, v := range columns {
if v == "time" {
continue
}
formattedFrameName := string(util.FormatFrameName(measurement, v, tags, *query, frameName[:]))
// don't iterate over first column as it is a time column already
for i := 1; i < len(columns); i++ {
formattedFrameName := string(util.FormatFrameName(measurement, columns[i], tags, *query, frameName[:]))
valueFields[i].Labels = tags
valueFields[i].Config = &data.FieldConfig{DisplayNameFromDS: formattedFrameName}
@ -421,26 +419,24 @@ func handleTableFormatValueFields(rsp *backend.DataResponse, valueFields data.Fi
// number of fields we currently have in the first frame
// we handled first value field and then tags.
si := len(tags) + 1
for i, v := range valueFields {
// first value field is always handled first, before tags.
// no need to create another one again here
if i == 0 {
continue
}
l := len(valueFields)
// first value field is always handled first, before tags.
// no need to create another one again here
for i := 1; i < l; i++ {
if len(rsp.Frames[0].Fields) == si {
rsp.Frames[0].Fields = append(rsp.Frames[0].Fields, v)
rsp.Frames[0].Fields = append(rsp.Frames[0].Fields, valueFields[i])
} else {
for vi := 0; vi < v.Len(); vi++ {
if v.Type() == data.FieldTypeNullableJSON {
ll := valueFields[i].Len()
for vi := 0; vi < ll; vi++ {
if valueFields[i].Type() == data.FieldTypeNullableJSON {
// add nil explicitly.
// we don't know if it is a float pointer nil or string pointer nil or etc
rsp.Frames[0].Fields[si].Append(nil)
} else {
if v.Type() != rsp.Frames[0].Fields[si].Type() {
maybeFixValueFieldType(rsp.Frames[0].Fields, v.Type(), si)
if valueFields[i].Type() != rsp.Frames[0].Fields[si].Type() {
maybeFixValueFieldType(rsp.Frames[0].Fields, valueFields[i].Type(), si)
}
rsp.Frames[0].Fields[si].Append(v.At(vi))
rsp.Frames[0].Fields[si].Append(valueFields[i].At(vi))
}
}
}

View File

@ -16,10 +16,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/influxdb/models"
)
// TEST_MODE=buffered go test -benchmem -run=^$ -memprofile buffered_mem.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee buffered.txt
// TEST_MODE=stream go test -benchmem -run=^$ -memprofile stream_mem.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee stream.txt
// TEST_MODE=buffered RES_FORMAT=time_series go test -benchmem -run=^$ -memprofile buffered_mem.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee buffered.txt
// TEST_MODE=stream RES_FORMAT=time_series go test -benchmem -run=^$ -memprofile stream_mem.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee stream.txt
// TEST_MODE=buffered RES_FORMAT=table go test -benchmem -run=^$ -memprofile buffered_table_mem.out -cpuprofile buffered_table_cpu.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee buffered_table.txt
// TEST_MODE=stream RES_FORMAT=table go test -benchmem -run=^$ -memprofile stream_table_mem.out -cpuprofile stream_table_cpu.out -count=10 -bench ^BenchmarkParseJson github.com/grafana/grafana/pkg/tsdb/influxdb/influxql | tee stream_table.txt
// go tool pprof -http=localhost:9999 memprofile.out
// benchstat buffered.txt stream.txt
// benchstat buffered_table.txt stream_table.txt
func BenchmarkParseJson(b *testing.B) {
filePath := "testdata/many_columns.json"
bytes, err := os.ReadFile(filePath)
@ -28,13 +31,15 @@ func BenchmarkParseJson(b *testing.B) {
}
testMode := os.Getenv("TEST_MODE")
resFormat := os.Getenv("RES_FORMAT")
if testMode == "" {
testMode = "stream"
}
query := &models.Query{
RawQuery: "Test raw query",
UseRawQuery: true,
RawQuery: "Test raw query",
UseRawQuery: true,
ResultFormat: resFormat,
}
b.ResetTimer()