grafana_bak/pkg/tsdb/tempo/traceql/metrics_test.go
2025-04-01 10:38:02 +09:00

158 lines
5.2 KiB
Go

package traceql
import (
"testing"
"time"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/tsdb/tempo/kinds/dataquery"
"github.com/grafana/tempo/pkg/tempopb"
v1 "github.com/grafana/tempo/pkg/tempopb/common/v1"
"github.com/stretchr/testify/assert"
)
func TestTransformMetricsResponse_EmptyResponse(t *testing.T) {
resp := tempopb.QueryRangeResponse{}
frames := TransformMetricsResponse("", resp)
assert.Empty(t, frames)
}
func TestTransformMetricsResponse_SingleSeriesSingleLabel(t *testing.T) {
resp := tempopb.QueryRangeResponse{
Series: []*tempopb.TimeSeries{
{
Labels: []v1.KeyValue{
{Key: "label1", Value: &v1.AnyValue{Value: &v1.AnyValue_StringValue{StringValue: "value1"}}},
},
Samples: []tempopb.Sample{
{TimestampMs: 1638316800000, Value: 1.23},
},
},
},
}
frames := TransformMetricsResponse("", resp)
assert.Len(t, frames, 1)
assert.Equal(t, "value1", frames[0].RefID)
assert.Equal(t, "value1", frames[0].Name)
assert.Len(t, frames[0].Fields, 2)
assert.Equal(t, "time", frames[0].Fields[0].Name)
assert.Equal(t, "value1", frames[0].Fields[1].Name)
assert.Equal(t, data.VisTypeGraph, frames[0].Meta.PreferredVisualization)
assert.Equal(t, time.UnixMilli(1638316800000), frames[0].Fields[0].At(0))
assert.Equal(t, 1.23, frames[0].Fields[1].At(0))
}
func TestTransformMetricsResponse_SingleSeriesMultipleLabels(t *testing.T) {
resp := tempopb.QueryRangeResponse{
Series: []*tempopb.TimeSeries{
{
Labels: []v1.KeyValue{
{Key: "label1", Value: &v1.AnyValue{Value: &v1.AnyValue_StringValue{StringValue: "value1"}}},
{Key: "label2", Value: &v1.AnyValue{Value: &v1.AnyValue_IntValue{IntValue: 123}}},
{Key: "label3", Value: &v1.AnyValue{Value: &v1.AnyValue_DoubleValue{DoubleValue: 123.456}}},
{Key: "label4", Value: &v1.AnyValue{Value: &v1.AnyValue_BoolValue{BoolValue: true}}},
},
Samples: []tempopb.Sample{
{TimestampMs: 1638316800000, Value: 1.23},
},
},
},
}
frames := TransformMetricsResponse("", resp)
assert.Len(t, frames, 1)
assert.Equal(t, "{label1=\"value1\", label2=123, label3=123.456, label4=true}", frames[0].RefID)
assert.Equal(t, "{label1=\"value1\", label2=123, label3=123.456, label4=true}", frames[0].Name)
assert.Len(t, frames[0].Fields, 2)
assert.Equal(t, "time", frames[0].Fields[0].Name)
assert.Equal(t, "{label1=\"value1\", label2=123, label3=123.456, label4=true}", frames[0].Fields[1].Name)
assert.Equal(t, data.VisTypeGraph, frames[0].Meta.PreferredVisualization)
assert.Equal(t, time.UnixMilli(1638316800000), frames[0].Fields[0].At(0))
assert.Equal(t, 1.23, frames[0].Fields[1].At(0))
}
func TestTransformMetricsResponse_MultipleSeries(t *testing.T) {
resp := tempopb.QueryRangeResponse{
Series: []*tempopb.TimeSeries{
{
Labels: []v1.KeyValue{
{Key: "label1", Value: &v1.AnyValue{Value: &v1.AnyValue_StringValue{StringValue: "value1"}}},
},
Samples: []tempopb.Sample{
{TimestampMs: 1638316800000, Value: 1.23},
},
},
{
Labels: []v1.KeyValue{
{Key: "label2", Value: &v1.AnyValue{Value: &v1.AnyValue_IntValue{IntValue: 456}}},
},
Samples: []tempopb.Sample{
{TimestampMs: 1638316800000, Value: 4.56},
},
},
},
}
frames := TransformMetricsResponse("", resp)
assert.Len(t, frames, 2)
assert.Equal(t, "value1", frames[0].RefID)
assert.Equal(t, "value1", frames[0].Name)
assert.Len(t, frames[0].Fields, 2)
assert.Equal(t, "time", frames[0].Fields[0].Name)
assert.Equal(t, "value1", frames[0].Fields[1].Name)
assert.Equal(t, data.VisTypeGraph, frames[0].Meta.PreferredVisualization)
assert.Equal(t, time.UnixMilli(1638316800000), frames[0].Fields[0].At(0))
assert.Equal(t, 1.23, frames[0].Fields[1].At(0))
assert.Equal(t, "456", frames[1].RefID)
assert.Equal(t, "456", frames[1].Name)
assert.Len(t, frames[1].Fields, 2)
assert.Equal(t, "time", frames[1].Fields[0].Name)
assert.Equal(t, "456", frames[1].Fields[1].Name)
assert.Equal(t, data.VisTypeGraph, frames[1].Meta.PreferredVisualization)
assert.Equal(t, time.UnixMilli(1638316800000), frames[1].Fields[0].At(0))
assert.Equal(t, 4.56, frames[1].Fields[1].At(0))
}
func TestTransformInstantMetricsResponse(t *testing.T) {
query := &dataquery.TempoQuery{}
resp := tempopb.QueryInstantResponse{
Series: []*tempopb.InstantSeries{
{
Labels: []v1.KeyValue{
{
Key: "label",
Value: &v1.AnyValue{Value: &v1.AnyValue_StringValue{StringValue: "value"}},
},
},
Value: 123.45,
PromLabels: "label=\"value\"",
},
},
}
frames := TransformInstantMetricsResponse(query, resp)
assert.Len(t, frames, 1)
frame := frames[0]
assert.Equal(t, "value", frame.RefID)
assert.Equal(t, "value", frame.Name)
assert.Len(t, frame.Fields, 3)
timeField := frame.Fields[0]
assert.Equal(t, "time", timeField.Name)
assert.Equal(t, 1, timeField.Len())
assert.IsType(t, time.Time{}, timeField.At(0))
labelField := frame.Fields[1]
assert.Equal(t, "label", labelField.Name)
assert.Equal(t, 1, labelField.Len())
assert.IsType(t, "", labelField.At(0))
assert.Equal(t, "value", labelField.At(0))
valueField := frame.Fields[2]
assert.Equal(t, "value", valueField.Name)
assert.Equal(t, 1, valueField.Len())
assert.IsType(t, 0.0, valueField.At(0))
assert.Equal(t, 123.45, valueField.At(0).(float64))
}