diff --git a/pkg/tsdb/influxdb/influxql/buffered/response_parser.go b/pkg/tsdb/influxdb/influxql/buffered/response_parser.go index 41646c19720..bcc89ea3960 100644 --- a/pkg/tsdb/influxdb/influxql/buffered/response_parser.go +++ b/pkg/tsdb/influxdb/influxql/buffered/response_parser.go @@ -241,6 +241,12 @@ func transformRowsForTimeSeries(rows []models.Row, query models.Query) data.Fram if !hasTimeCol { newFrame := newFrameWithoutTimeField(row, query) + if len(frames) == 0 { + newFrame.Meta = &data.FrameMeta{ + ExecutedQueryString: query.RawQuery, + PreferredVisualization: util.GetVisType(query.ResultFormat), + } + } frames = append(frames, newFrame) } else { for colIndex, column := range row.Columns { @@ -326,20 +332,21 @@ func newFrameWithoutTimeField(row models.Row, query models.Query) *data.Frame { for _, valuePair := range row.Values { if strings.Contains(strings.ToLower(query.RawQuery), strings.ToLower("SHOW TAG VALUES")) { if len(valuePair) >= 2 { - values = append(values, util.ToPtr(valuePair[1].(string))) + values = append(values, util.ParseString(valuePair[1])) + } + } else if strings.Contains(strings.ToLower(query.RawQuery), strings.ToLower("SHOW DIAGNOSTICS")) { + // https://docs.influxdata.com/platform/monitoring/influxdata-platform/tools/show-diagnostics/ + for _, vp := range valuePair { + values = append(values, util.ParseString(vp)) } } else { if len(valuePair) >= 1 { - values = append(values, util.ToPtr(valuePair[0].(string))) + values = append(values, util.ParseString(valuePair[0])) } } } field := data.NewField("Value", nil, values) frame := data.NewFrame(row.Name, field) - frame.Meta = &data.FrameMeta{ - ExecutedQueryString: query.RawQuery, - PreferredVisualization: util.GetVisType(query.ResultFormat), - } return frame } diff --git a/pkg/tsdb/influxdb/influxql/util/util.go b/pkg/tsdb/influxdb/influxql/util/util.go index 5d03fcb1104..b4ecc095b6b 100644 --- a/pkg/tsdb/influxdb/influxql/util/util.go +++ b/pkg/tsdb/influxdb/influxql/util/util.go @@ -139,6 +139,15 @@ func ParseNumber(value any) *float64 { return &fvalue } +func ParseString(value any) *string { + switch val := value.(type) { + case string: + return ToPtr(val) + default: + return ToPtr(fmt.Sprintf("%v", value)) + } +} + func GetVisType(resFormat string) data.VisType { switch resFormat { case "table": diff --git a/pkg/tsdb/influxdb/influxql/util/util_test.go b/pkg/tsdb/influxdb/influxql/util/util_test.go new file mode 100644 index 00000000000..a535cc54026 --- /dev/null +++ b/pkg/tsdb/influxdb/influxql/util/util_test.go @@ -0,0 +1,23 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseString(t *testing.T) { + t.Run("parse bool value to string", func(t *testing.T) { + val := true + expected := ToPtr("true") + result := ParseString(val) + require.Equal(t, expected, result) + }) + + t.Run("parse number value to string", func(t *testing.T) { + val := 123 + expected := ToPtr("123") + result := ParseString(val) + require.Equal(t, expected, result) + }) +}