signoz/pkg/telemetrytraces/trace_time_range_test.go
2025-06-18 15:30:29 +05:30

263 lines
7.0 KiB
Go

package telemetrytraces
import (
"testing"
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
"github.com/stretchr/testify/assert"
)
func TestExtractTraceIDsFromFilter(t *testing.T) {
tests := []struct {
name string
filterExpr string
fieldKeys map[string][]*telemetrytypes.TelemetryFieldKey
expectIDs []string
expectFound bool
}{
{
name: "simple trace_id filter",
filterExpr: "trace_id = '123abc'",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"123abc"},
expectFound: true,
},
{
name: "trace_id IN with square brackets",
filterExpr: "trace_id IN ['123abc', '456def', '789ghi']",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"123abc", "456def", "789ghi"},
expectFound: true,
},
{
name: "trace_id IN with parentheses",
filterExpr: "trace_id IN ('aaa', 'bbb', 'ccc')",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"aaa", "bbb", "ccc"},
expectFound: true,
},
{
name: "trace_id IN with double quotes",
filterExpr: `trace_id IN ["111", "222", "333"]`,
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"111", "222", "333"},
expectFound: true,
},
{
name: "trace_id IN with mixed quotes",
filterExpr: `trace_id IN ['abc', "def", 'ghi']`,
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"abc", "def", "ghi"},
expectFound: true,
},
{
name: "trace_id IN with single value",
filterExpr: "trace_id IN ['single']",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"single"},
expectFound: true,
},
{
name: "trace_id IN in complex filter",
filterExpr: "service.name = 'api' AND trace_id IN ['x1', 'x2'] AND duration > 100",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"service.name": {{
Name: "service.name",
FieldContext: telemetrytypes.FieldContextResource,
}},
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
"duration": {{
Name: "duration",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: []string{"x1", "x2"},
expectFound: true,
},
{
name: "no trace_id in filter",
filterExpr: "service.name = 'api' AND duration > 100",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"service.name": {{
Name: "service.name",
FieldContext: telemetrytypes.FieldContextResource,
}},
"duration": {{
Name: "duration",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectIDs: nil,
expectFound: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ids, found := ExtractTraceIDsFromFilter(tt.filterExpr, tt.fieldKeys)
assert.Equal(t, tt.expectFound, found)
assert.Equal(t, tt.expectIDs, ids)
})
}
}
func TestExtractTraceIDFromFilter(t *testing.T) {
tests := []struct {
name string
filterExpr string
fieldKeys map[string][]*telemetrytypes.TelemetryFieldKey
expectID string
expectFound bool
}{
{
name: "simple trace_id filter",
filterExpr: "trace_id = '123abc'",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "123abc",
expectFound: true,
},
{
name: "trace_id filter with double quotes",
filterExpr: `trace_id = "456def"`,
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "456def",
expectFound: true,
},
{
name: "traceId alternative name",
filterExpr: "traceId = '789ghi'",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"traceId": {{
Name: "traceId",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "789ghi",
expectFound: true,
},
{
name: "trace_id in complex filter",
filterExpr: "service.name = 'api' AND trace_id = 'xyz123' AND duration > 100",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"service.name": {{
Name: "service.name",
FieldContext: telemetrytypes.FieldContextResource,
}},
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
"duration": {{
Name: "duration",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "xyz123",
expectFound: true,
},
{
name: "no trace_id in filter",
filterExpr: "service.name = 'api' AND duration > 100",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"service.name": {{
Name: "service.name",
FieldContext: telemetrytypes.FieldContextResource,
}},
"duration": {{
Name: "duration",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "",
expectFound: false,
},
{
name: "trace_id field not in span context",
filterExpr: "trace_id = '123'",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextAttribute,
}},
},
expectID: "",
expectFound: false,
},
{
name: "unquoted trace_id value",
filterExpr: "trace_id = abc123def",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "abc123def",
expectFound: true,
},
{
name: "trace_id with parentheses",
filterExpr: "(trace_id = '123') AND (service = 'api')",
fieldKeys: map[string][]*telemetrytypes.TelemetryFieldKey{
"trace_id": {{
Name: "trace_id",
FieldContext: telemetrytypes.FieldContextSpan,
}},
},
expectID: "123",
expectFound: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
id, found := ExtractTraceIDFromFilter(tt.filterExpr, tt.fieldKeys)
assert.Equal(t, tt.expectFound, found)
assert.Equal(t, tt.expectID, id)
})
}
}