mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
c80b31a0d4
commit
fec7765111
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user