2023-04-25 21:53:46 +05:30
package v3
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
"go.signoz.io/signoz/pkg/query-service/constants"
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
)
var buildFilterQueryData = [ ] struct {
Name string
FilterSet * v3 . FilterSet
ExpectedFilter string
} {
{
Name : "Test attribute and resource attribute" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "john" , Operator : "=" } ,
{ Key : v3 . AttributeKey { Key : "k8s_namespace" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } , Value : "my_service" , Operator : "!=" } ,
} } ,
ExpectedFilter : " AND stringTagMap['user.name'] = 'john' AND resourceTagsMap['k8s_namespace'] != 'my_service'" ,
} ,
{
Name : "Test fixed column" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } , Value : "john" , Operator : "=" } ,
{ Key : v3 . AttributeKey { Key : "k8s_namespace" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } , Value : "my_service" , Operator : "!=" } ,
} } ,
ExpectedFilter : " AND user.name = 'john' AND resourceTagsMap['k8s_namespace'] != 'my_service'" ,
} ,
{
Name : "Test fixed column with empty value" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } , Value : "" , Operator : "=" } ,
{ Key : v3 . AttributeKey { Key : "k8s_namespace" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } , Value : "my_service" , Operator : "!=" } ,
} } ,
ExpectedFilter : " AND user.name = '' AND resourceTagsMap['k8s_namespace'] != 'my_service'" ,
} ,
{
Name : "Test like" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "host" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "102.%" , Operator : "like" } ,
} } ,
ExpectedFilter : " AND stringTagMap['host'] ILIKE '102.%'" ,
} ,
{
Name : "Test IN" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } , Value : [ ] interface { } { 1 , 2 , 3 , 4 } , Operator : "in" } ,
} } ,
ExpectedFilter : " AND numberTagMap['bytes'] IN [1,2,3,4]" ,
} ,
{
Name : "Test DataType int64" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeInt64 , Type : v3 . AttributeKeyTypeTag } , Value : 10 , Operator : ">" } ,
} } ,
ExpectedFilter : " AND numberTagMap['bytes'] > 10" ,
} ,
{
Name : "Test NOT IN" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : [ ] interface { } { "john" , "bunny" } , Operator : "nin" } ,
} } ,
ExpectedFilter : " AND stringTagMap['name'] NOT IN ['john','bunny']" ,
} ,
{
Name : "Test exists" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "" , Operator : "exists" } ,
} } ,
ExpectedFilter : " AND has(stringTagMap, 'bytes')" ,
} ,
{
Name : "Test exists with fixed column" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } , Value : "" , Operator : "exists" } ,
} } ,
ExpectedFilter : " AND name != ''" ,
} ,
{
Name : "Test not exists" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "" , Operator : "nexists" } ,
} } ,
ExpectedFilter : " AND NOT has(stringTagMap, 'bytes')" ,
} ,
{
Name : "Test not exists with fixed column" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } , Value : "" , Operator : "nexists" } ,
} } ,
ExpectedFilter : " AND name = ''" ,
} ,
{
Name : "Test contains" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "host" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "102." , Operator : "contains" } ,
} } ,
ExpectedFilter : " AND stringTagMap['host'] ILIKE '%102.%'" ,
} ,
2024-05-27 15:18:49 +05:30
{
Name : "Test contains with quotes" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "message" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "Hello 'world'" , Operator : "contains" } ,
} } ,
ExpectedFilter : " AND stringTagMap['message'] ILIKE '%Hello \\'world\\'%'" ,
} ,
2023-04-25 21:53:46 +05:30
{
Name : "Test not contains" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "host" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "102." , Operator : "ncontains" } ,
} } ,
ExpectedFilter : " AND stringTagMap['host'] NOT ILIKE '%102.%'" ,
} ,
2023-08-22 10:42:53 +05:30
{
Name : "Test regex" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } , Value : "name: \"(?P<host>\\S+)\"" , Operator : "regex" } ,
} } ,
ExpectedFilter : " AND match(name, 'name: \"(?P<host>\\\\S+)\"')" ,
} ,
{
Name : "Test not regex" ,
FilterSet : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "102." , Operator : "nregex" } ,
} } ,
ExpectedFilter : " AND NOT match(stringTagMap['name'], '102.')" ,
} ,
2023-04-25 21:53:46 +05:30
}
func TestBuildTracesFilterQuery ( t * testing . T ) {
for _ , tt := range buildFilterQueryData {
Convey ( "TestBuildTracesFilterQuery" , t , func ( ) {
2024-09-13 16:43:56 +05:30
query , err := buildTracesFilterQuery ( tt . FilterSet )
2023-04-25 21:53:46 +05:30
So ( err , ShouldBeNil )
So ( query , ShouldEqual , tt . ExpectedFilter )
} )
}
}
var handleEmptyValuesInGroupByData = [ ] struct {
Name string
GroupBy [ ] v3 . AttributeKey
ExpectedFilter string
} {
{
Name : "String type key" ,
GroupBy : [ ] v3 . AttributeKey { { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
ExpectedFilter : " AND has(stringTagMap, 'bytes')" ,
} ,
{
Name : "fixed column type key" ,
GroupBy : [ ] v3 . AttributeKey { { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } } ,
ExpectedFilter : "" ,
} ,
{
Name : "String, float64 and fixed column type key" ,
GroupBy : [ ] v3 . AttributeKey {
{ Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
{ Key : "count" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
{ Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
} ,
ExpectedFilter : " AND has(stringTagMap, 'bytes') AND has(numberTagMap, 'count')" ,
} ,
}
func TestBuildTracesHandleEmptyValuesInGroupBy ( t * testing . T ) {
for _ , tt := range handleEmptyValuesInGroupByData {
Convey ( "TestBuildTracesHandleEmptyValuesInGroupBy" , t , func ( ) {
2024-09-13 16:43:56 +05:30
query , err := handleEmptyValuesInGroupBy ( tt . GroupBy )
2023-04-25 21:53:46 +05:30
So ( err , ShouldBeNil )
So ( query , ShouldEqual , tt . ExpectedFilter )
} )
}
}
var testColumnName = [ ] struct {
Name string
AttributeKey v3 . AttributeKey
ExpectedColumn string
} {
{
Name : "resource" ,
AttributeKey : v3 . AttributeKey { Key : "collector_id" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource , IsColumn : false } ,
ExpectedColumn : "resourceTagsMap['collector_id']" ,
} ,
{
Name : "stringAttribute" ,
AttributeKey : v3 . AttributeKey { Key : "customer_id" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : false } ,
ExpectedColumn : "stringTagMap['customer_id']" ,
} ,
{
Name : "boolAttribute" ,
AttributeKey : v3 . AttributeKey { Key : "has_error" , DataType : v3 . AttributeKeyDataTypeBool , Type : v3 . AttributeKeyTypeTag , IsColumn : false } ,
ExpectedColumn : "boolTagMap['has_error']" ,
} ,
{
Name : "float64Attribute" ,
AttributeKey : v3 . AttributeKey { Key : "count" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag , IsColumn : false } ,
ExpectedColumn : "numberTagMap['count']" ,
} ,
{
Name : "int64Attribute" ,
AttributeKey : v3 . AttributeKey { Key : "count" , DataType : v3 . AttributeKeyDataTypeInt64 , Type : v3 . AttributeKeyTypeTag , IsColumn : false } ,
ExpectedColumn : "numberTagMap['count']" ,
} ,
{
Name : "column" ,
AttributeKey : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
ExpectedColumn : "name" ,
} ,
{
Name : "missing key" ,
AttributeKey : v3 . AttributeKey { Key : "xyz" } ,
ExpectedColumn : "stringTagMap['xyz']" ,
} ,
}
func TestColumnName ( t * testing . T ) {
for _ , tt := range testColumnName {
2024-09-13 16:43:56 +05:30
tt . AttributeKey = enrichKeyWithMetadata ( tt . AttributeKey , map [ string ] v3 . AttributeKey { } )
2023-04-25 21:53:46 +05:30
Convey ( "testColumnName" , t , func ( ) {
2024-09-13 16:43:56 +05:30
Column := getColumnName ( tt . AttributeKey )
2023-04-25 21:53:46 +05:30
So ( Column , ShouldEqual , tt . ExpectedColumn )
} )
}
}
var testGetSelectLabelsData = [ ] struct {
Name string
AggregateOperator v3 . AggregateOperator
GroupByTags [ ] v3 . AttributeKey
SelectLabels string
} {
{
Name : "select keys for groupBy attribute" ,
AggregateOperator : v3 . AggregateOperatorCount ,
GroupByTags : [ ] v3 . AttributeKey { { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
2023-07-12 15:34:21 +05:30
SelectLabels : " stringTagMap['user.name'] as `user.name`," ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "select keys for groupBy resource" ,
AggregateOperator : v3 . AggregateOperatorCount ,
GroupByTags : [ ] v3 . AttributeKey { { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } } ,
2023-07-12 15:34:21 +05:30
SelectLabels : " resourceTagsMap['user.name'] as `user.name`," ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "select keys for groupBy attribute and resource" ,
AggregateOperator : v3 . AggregateOperatorCount ,
GroupByTags : [ ] v3 . AttributeKey {
{ Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } ,
{ Key : "host" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
} ,
2023-07-12 15:34:21 +05:30
SelectLabels : " resourceTagsMap['user.name'] as `user.name`, stringTagMap['host'] as `host`," ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "select keys for groupBy fixed columns" ,
AggregateOperator : v3 . AggregateOperatorCount ,
GroupByTags : [ ] v3 . AttributeKey { { Key : "host" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
2023-07-12 15:34:21 +05:30
SelectLabels : " host as `host`," ,
2023-04-25 21:53:46 +05:30
} ,
}
func TestGetSelectLabels ( t * testing . T ) {
for _ , tt := range testGetSelectLabelsData {
Convey ( "testGetSelectLabelsData" , t , func ( ) {
2024-09-13 16:43:56 +05:30
selectLabels := getSelectLabels ( tt . AggregateOperator , tt . GroupByTags )
2023-04-25 21:53:46 +05:30
So ( selectLabels , ShouldEqual , tt . SelectLabels )
} )
}
}
2023-07-05 06:57:39 +05:30
var testGetSelectColumnsData = [ ] struct {
Name string
sc [ ] v3 . AttributeKey
SelectColumns string
} {
{
Name : "select columns attribute" ,
sc : [ ] v3 . AttributeKey { { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
SelectColumns : "stringTagMap['user.name'] as `user.name` " ,
} ,
{
Name : "select columns resource" ,
sc : [ ] v3 . AttributeKey { { Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } } ,
SelectColumns : "resourceTagsMap['user.name'] as `user.name` " ,
} ,
{
Name : "select columns attribute and resource" ,
sc : [ ] v3 . AttributeKey {
{ Key : "user.name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } ,
{ Key : "host" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
} ,
SelectColumns : "resourceTagsMap['user.name'] as `user.name` ,stringTagMap['host'] as `host` " ,
} ,
{
Name : "select columns fixed column" ,
sc : [ ] v3 . AttributeKey { { Key : "host" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
SelectColumns : "host as `host` " ,
} ,
}
func TestGetSelectColumns ( t * testing . T ) {
for _ , tt := range testGetSelectColumnsData {
Convey ( "testGetSelectColumnsData" , t , func ( ) {
2024-09-13 16:43:56 +05:30
selectColumns := getSelectColumns ( tt . sc )
2023-07-05 06:57:39 +05:30
So ( selectColumns , ShouldEqual , tt . SelectColumns )
} )
}
}
2023-04-25 21:53:46 +05:30
var testGetZerosForEpochNanoData = [ ] struct {
Name string
Epoch int64
Multiplier int64
Result int64
} {
{
Name : "Test 1" ,
Epoch : 1680712080000 ,
Multiplier : 1000000 ,
Result : 1680712080000000000 ,
} ,
{
Name : "Test 2" ,
Epoch : 1680712080000000000 ,
Multiplier : 1 ,
Result : 1680712080000000000 ,
} ,
}
func TestGetZerosForEpochNano ( t * testing . T ) {
for _ , tt := range testGetZerosForEpochNanoData {
Convey ( "testGetZerosForEpochNanoData" , t , func ( ) {
multiplier := getZerosForEpochNano ( tt . Epoch )
So ( multiplier , ShouldEqual , tt . Multiplier )
So ( tt . Epoch * multiplier , ShouldEqual , tt . Result )
} )
}
}
var testOrderBy = [ ] struct {
2023-07-05 06:57:39 +05:30
Name string
PanelType v3 . PanelType
Items [ ] v3 . OrderBy
2023-07-19 09:54:27 +05:30
Tags [ ] v3 . AttributeKey
Result string
2023-04-25 21:53:46 +05:30
} {
{
2023-07-05 06:57:39 +05:30
Name : "Test 1" ,
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
Items : [ ] v3 . OrderBy {
{
ColumnName : "name" ,
Order : "asc" ,
} ,
{
ColumnName : constants . SigNozOrderByValue ,
Order : "desc" ,
} ,
} ,
2023-07-19 09:54:27 +05:30
Tags : [ ] v3 . AttributeKey {
{ Key : "name" } ,
} ,
Result : "`name` asc,value desc" ,
2023-04-25 21:53:46 +05:30
} ,
{
2023-07-05 06:57:39 +05:30
Name : "Test 2" ,
PanelType : v3 . PanelTypeList ,
2023-04-25 21:53:46 +05:30
Items : [ ] v3 . OrderBy {
{
ColumnName : "name" ,
Order : "asc" ,
} ,
{
ColumnName : "bytes" ,
Order : "asc" ,
} ,
} ,
2023-07-19 09:54:27 +05:30
Tags : [ ] v3 . AttributeKey {
{ Key : "name" } ,
{ Key : "bytes" } ,
} ,
Result : "`name` asc,`bytes` asc" ,
2023-04-25 21:53:46 +05:30
} ,
{
2023-07-05 06:57:39 +05:30
Name : "Test 3" ,
PanelType : v3 . PanelTypeList ,
2023-04-25 21:53:46 +05:30
Items : [ ] v3 . OrderBy {
{
ColumnName : "name" ,
Order : "asc" ,
} ,
{
ColumnName : constants . SigNozOrderByValue ,
Order : "asc" ,
} ,
{
ColumnName : "bytes" ,
Order : "asc" ,
} ,
} ,
2023-07-19 09:54:27 +05:30
Tags : [ ] v3 . AttributeKey {
{ Key : "name" } ,
{ Key : "bytes" } ,
} ,
Result : "`name` asc,value asc,`bytes` asc" ,
2023-07-05 06:57:39 +05:30
} ,
{
Name : "Test 4" ,
PanelType : v3 . PanelTypeList ,
Items : [ ] v3 . OrderBy {
{
ColumnName : "name" ,
Order : "asc" ,
} ,
{
ColumnName : "bytes" ,
Order : "asc" ,
} ,
{
ColumnName : "response_time" ,
Order : "desc" ,
Key : "response_time" ,
Type : v3 . AttributeKeyTypeTag ,
DataType : v3 . AttributeKeyDataTypeString ,
} ,
} ,
2023-07-19 09:54:27 +05:30
Tags : [ ] v3 . AttributeKey {
{ Key : "name" } ,
{ Key : "bytes" } ,
} ,
Result : "`name` asc,`bytes` asc,stringTagMap['response_time'] desc" ,
2023-07-05 06:57:39 +05:30
} ,
{
2023-07-05 11:20:46 +05:30
Name : "Test 5" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeList ,
Items : [ ] v3 . OrderBy {
{
ColumnName : "name" ,
Order : "asc" ,
2023-07-05 11:20:46 +05:30
Key : "name" ,
Type : v3 . AttributeKeyTypeTag ,
DataType : v3 . AttributeKeyDataTypeString ,
IsColumn : true ,
2023-07-05 06:57:39 +05:30
} ,
{
ColumnName : "bytes" ,
Order : "asc" ,
2023-07-05 11:20:46 +05:30
Key : "bytes" ,
Type : v3 . AttributeKeyTypeTag ,
DataType : v3 . AttributeKeyDataTypeString ,
IsColumn : true ,
2023-07-05 06:57:39 +05:30
} ,
{
ColumnName : "response_time" ,
Order : "desc" ,
} ,
} ,
2023-07-19 09:54:27 +05:30
Tags : [ ] v3 . AttributeKey { } ,
Result : "`name` asc,`bytes` asc,stringTagMap['response_time'] desc" ,
2023-04-25 21:53:46 +05:30
} ,
}
func TestOrderBy ( t * testing . T ) {
2024-09-13 16:43:56 +05:30
keys := map [ string ] v3 . AttributeKey {
"name" : { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
"bytes" : { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
"response_time" : { Key : "response_time" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : false } ,
}
2023-04-25 21:53:46 +05:30
for _ , tt := range testOrderBy {
Convey ( "testOrderBy" , t , func ( ) {
2024-09-13 16:43:56 +05:30
tt . Items = enrichOrderBy ( tt . Items , keys )
res := orderByAttributeKeyTags ( tt . PanelType , tt . Items , tt . Tags )
2023-07-05 06:57:39 +05:30
So ( res , ShouldResemble , tt . Result )
2023-04-25 21:53:46 +05:30
} )
}
}
var testBuildTracesQueryData = [ ] struct {
Name string
Start int64
End int64
Step int64
BuilderQuery * v3 . BuilderQuery
GroupByTags [ ] v3 . AttributeKey
TableName string
AggregateOperator v3 . AggregateOperator
ExpectedQuery string
2023-07-05 06:57:39 +05:30
PanelType v3 . PanelType
2024-10-22 16:46:58 +05:30
Options v3 . QBOptions
2023-04-25 21:53:46 +05:30
} {
{
2023-05-16 19:32:50 +05:30
Name : "Test aggregate count on fixed column of float64 type" ,
2023-04-25 21:53:46 +05:30
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
2023-05-16 19:32:50 +05:30
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-05-16 19:32:50 +05:30
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "durationNano" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-05-16 19:32:50 +05:30
} ,
2023-05-18 17:16:06 +05:30
{
Name : "Test aggregate rate without aggregate attribute" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-05-18 17:16:06 +05:30
AggregateOperator : v3 . AggregateOperatorRate ,
Expression : "A" ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
2023-08-18 07:32:05 +05:30
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, count()/1.000000 as value from" +
2023-05-18 17:16:06 +05:30
" signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <=" +
2023-07-19 09:54:27 +05:30
" '1680066458000000000') group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions { GraphLimitQtype : "" , PreferRPM : true } ,
2023-05-18 17:16:06 +05:30
} ,
2023-05-16 19:32:50 +05:30
{
Name : "Test aggregate count on fixed column of float64 type with filter" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-05-16 19:32:50 +05:30
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "durationNano" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { { Key : v3 . AttributeKey { Key : "customer_id" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "10001" , Operator : "=" } } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" toFloat64(count()) as value from signoz_traces.distributed_signoz_index_v2" +
" where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" AND stringTagMap['customer_id'] = '10001' group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-05-16 19:32:50 +05:30
} ,
{
Name : "Test aggregate count on fixed column of bool type" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-05-16 19:32:50 +05:30
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "hasError" , DataType : v3 . AttributeKeyDataTypeBool , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
2023-04-25 21:53:46 +05:30
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count on a attribute" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "user_name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" AND has(stringTagMap, 'user_name') group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
2023-05-16 19:32:50 +05:30
Name : "Test aggregate count on a fixed column of string type" ,
2023-04-25 21:53:46 +05:30
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" AND name != '' group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count with filter" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "user_name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCount ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } , Value : 100 , Operator : ">" } ,
} } ,
Expression : "A" ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" AND numberTagMap['bytes'] > 100.000000 AND has(stringTagMap, 'user_name') group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count distinct and order by value" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "#SIGNOZ_VALUE" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(name))) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" group by ts order by value ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count distinct on string key" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(stringTagMap['name'])))" +
" as value from signoz_traces.distributed_signoz_index_v2 where" +
2023-07-19 09:54:27 +05:30
" (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') group by ts order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count distinct with filter and groupBy" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "http.method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
{ Key : v3 . AttributeKey { Key : "x" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } , Value : "abc" , Operator : "!=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "http.method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
2023-07-19 09:54:27 +05:30
OrderBy : [ ] v3 . OrderBy { { ColumnName : "http.method" , Order : "ASC" } } ,
2023-04-25 21:53:46 +05:30
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['http.method'] as `http.method`, " +
"toFloat64(count(distinct(name))) as value from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['http.method'] = 'GET' AND resourceTagsMap['x'] != 'abc' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'http.method') group by `http.method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `http.method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate count with multiple filter,groupBy and orderBy" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
{ Key : v3 . AttributeKey { Key : "x" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } , Value : "abc" , Operator : "!=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey {
{ Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
{ Key : "x" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeResource } ,
} ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } , { ColumnName : "x" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"resourceTagsMap['x'] as `x`, " +
"toFloat64(count(distinct(name))) as value from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' AND resourceTagsMap['x'] != 'abc' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') AND has(resourceTagsMap, 'x') group by `method`,`x`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC,`x` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate avg" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorAvg ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } , { ColumnName : "x" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"avg(numberTagMap['bytes']) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate sum" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorSum ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"sum(bytes) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate min" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorMin ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"min(bytes) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate max" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorMax ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"max(bytes) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate PXX" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorP05 ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts," +
" stringTagMap['method'] as `method`, " +
"quantile(0.05)(bytes) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate RateSum" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorRateSum ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, stringTagMap['method'] as `method`" +
2023-08-18 07:32:05 +05:30
", sum(bytes)/60.000000 as value from signoz_traces.distributed_signoz_index_v2 " +
2023-04-25 21:53:46 +05:30
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" AND has(stringTagMap, 'method') group by `method`,ts order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions { GraphLimitQtype : "" ,
2023-08-18 07:32:05 +05:30
PreferRPM : false ,
} ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate rate" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , Type : v3 . AttributeKeyTypeTag , DataType : v3 . AttributeKeyDataTypeFloat64 } ,
AggregateOperator : v3 . AggregateOperatorRate ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, stringTagMap['method'] as `method`" +
2023-08-18 07:32:05 +05:30
", count(numberTagMap['bytes'])/1.000000 as value " +
2023-04-25 21:53:46 +05:30
"from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions { GraphLimitQtype : "" , PreferRPM : true } ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate RateSum without fixed column" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "bytes" , Type : v3 . AttributeKeyTypeTag , DataType : v3 . AttributeKeyDataTypeFloat64 } ,
AggregateOperator : v3 . AggregateOperatorRateSum ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, " +
"stringTagMap['method'] as `method`, " +
2023-08-18 07:32:05 +05:30
"sum(numberTagMap['bytes'])/1.000000 as value " +
2023-04-25 21:53:46 +05:30
"from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-05 11:20:46 +05:30
"AND has(stringTagMap, 'method') group by `method`,ts " +
2023-07-19 09:54:27 +05:30
"order by `method` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions { GraphLimitQtype : "" , PreferRPM : true } ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test aggregate with having clause" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Having : [ ] v3 . Having {
{
ColumnName : "name" ,
Operator : ">" ,
Value : 10 ,
} ,
} ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(stringTagMap['name']))) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
2023-07-19 09:54:27 +05:30
" group by ts having value > 10 order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test count aggregate with having clause and filters" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
Having : [ ] v3 . Having {
{
ColumnName : "name" ,
Operator : ">" ,
Value : 10 ,
} ,
} ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value from " +
"signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-19 09:54:27 +05:30
"AND stringTagMap['method'] = 'GET' AND has(stringTagMap, 'name') group by ts having value > 10 order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
2023-04-25 21:53:46 +05:30
} ,
{
Name : "Test count distinct aggregate with having clause and filters" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-04-25 21:53:46 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
Having : [ ] v3 . Having {
{
ColumnName : "name" ,
Operator : ">" ,
Value : 10 ,
} ,
} ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count(distinct(stringTagMap['name']))) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-19 09:54:27 +05:30
"AND stringTagMap['method'] = 'GET' group by ts having value > 10 order by value DESC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeGraph ,
} ,
2023-07-12 15:34:21 +05:30
{
Name : "Test count with having clause and filters" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-07-12 15:34:21 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCount ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
Having : [ ] v3 . Having {
{
ColumnName : "name" ,
Operator : ">" ,
Value : 10 ,
} ,
} ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, toFloat64(count()) as value" +
" from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2023-07-19 09:54:27 +05:30
"AND stringTagMap['method'] = 'GET' AND has(stringTagMap, 'name') group by ts having value > 10" ,
2023-07-12 15:34:21 +05:30
PanelType : v3 . PanelTypeValue ,
} ,
{
2024-04-25 14:15:33 +05:30
Name : "Test aggregate PXX with groupby" ,
2023-07-12 15:34:21 +05:30
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-07-12 15:34:21 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "durationNano" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorP05 ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT now() as ts, stringTagMap['method'] as `method`, " +
"quantile(0.05)(durationNano) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND has(stringTagMap, 'method') group by `method` " +
"order by `method` ASC" ,
PanelType : v3 . PanelTypeTable ,
} ,
{
Name : "Test aggregate PXX" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
2023-08-22 17:09:58 +05:30
StepInterval : 60 ,
2023-07-12 15:34:21 +05:30
AggregateAttribute : v3 . AttributeKey { Key : "durationNano" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorP05 ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { } ,
OrderBy : [ ] v3 . OrderBy { } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT now() as ts, quantile(0.05)(durationNano) as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" ,
2024-04-25 14:15:33 +05:30
PanelType : v3 . PanelTypeTable ,
} ,
{
Name : "Test aggregate rate table panel" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
StepInterval : 60 ,
AggregateAttribute : v3 . AttributeKey { Key : "durationNano" , IsColumn : true , DataType : v3 . AttributeKeyDataTypeFloat64 , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorRate ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
GroupBy : [ ] v3 . AttributeKey { } ,
OrderBy : [ ] v3 . OrderBy { } ,
} ,
TableName : "signoz_traces.distributed_signoz_index_v2" ,
ExpectedQuery : "SELECT now() as ts, count(durationNano)/97.000000 as value " +
"from signoz_traces.distributed_signoz_index_v2 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" ,
2023-07-12 15:34:21 +05:30
PanelType : v3 . PanelTypeTable ,
} ,
2023-07-05 06:57:39 +05:30
{
Name : "Test Noop list view" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
SelectColumns : [ ] v3 . AttributeKey {
{ Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
} ,
QueryName : "A" ,
AggregateOperator : v3 . AggregateOperatorNoOp ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
} ,
ExpectedQuery : "SELECT timestamp as timestamp_datetime, spanID, traceID," +
" name as `name` from signoz_traces.distributed_signoz_index_v2 where " +
"(timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') order by timestamp DESC" ,
PanelType : v3 . PanelTypeList ,
} ,
{
Name : "Test Noop list view with order by" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
SelectColumns : [ ] v3 . AttributeKey {
{ Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
} ,
QueryName : "A" ,
AggregateOperator : v3 . AggregateOperatorNoOp ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem { } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "name" , Order : "ASC" } } ,
} ,
ExpectedQuery : "SELECT timestamp as timestamp_datetime, spanID, traceID," +
" name as `name` from signoz_traces.distributed_signoz_index_v2 where " +
2023-07-05 11:20:46 +05:30
"(timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') order by `name` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeList ,
} ,
{
Name : "Test Noop list view with order by and filter" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
SelectColumns : [ ] v3 . AttributeKey {
{ Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
} ,
QueryName : "A" ,
AggregateOperator : v3 . AggregateOperatorNoOp ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "name" , Order : "ASC" } } ,
} ,
ExpectedQuery : "SELECT timestamp as timestamp_datetime, spanID, traceID," +
" name as `name` from signoz_traces.distributed_signoz_index_v2 where " +
2023-07-05 11:20:46 +05:30
"(timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000')" +
" AND stringTagMap['method'] = 'GET' order by `name` ASC" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeList ,
} ,
{
Name : "Test Noop trace view" ,
Start : 1680066360726210000 ,
End : 1680066458000000000 ,
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateOperator : v3 . AggregateOperatorNoOp ,
Expression : "A" ,
Filters : & v3 . FilterSet {
Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
} ,
2024-10-10 18:16:11 +05:30
ExpectedQuery : "SELECT subQuery.serviceName, subQuery.name, count() AS span_count, subQuery.durationNano, subQuery.traceID" +
" AS traceID FROM signoz_traces.distributed_signoz_index_v2 INNER JOIN" +
" ( SELECT * FROM (SELECT traceID, durationNano, serviceName, name " +
"FROM signoz_traces.signoz_index_v2 WHERE parentSpanID = '' AND (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND stringTagMap['method'] = 'GET' ORDER BY durationNano DESC LIMIT 1 BY traceID LIMIT 100)" +
" AS inner_subquery ) AS subQuery " +
"ON signoz_traces.distributed_signoz_index_v2.traceID = subQuery.traceID WHERE (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
2024-11-22 22:48:35 +05:30
"GROUP BY subQuery.traceID, subQuery.durationNano, subQuery.name, subQuery.serviceName ORDER BY subQuery.durationNano desc LIMIT 1 BY subQuery.traceID" ,
2023-07-05 06:57:39 +05:30
PanelType : v3 . PanelTypeTrace ,
2023-04-25 21:53:46 +05:30
} ,
}
func TestBuildTracesQuery ( t * testing . T ) {
2024-09-13 16:43:56 +05:30
keys := map [ string ] v3 . AttributeKey {
"name" : { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
}
2023-04-25 21:53:46 +05:30
for _ , tt := range testBuildTracesQueryData {
2024-09-13 16:43:56 +05:30
tt . BuilderQuery . DataSource = v3 . DataSourceTraces
params := & v3 . QueryRangeParamsV3 {
Version : "v4" ,
CompositeQuery : & v3 . CompositeQuery {
QueryType : v3 . QueryTypeBuilder ,
BuilderQueries : map [ string ] * v3 . BuilderQuery {
"A" : tt . BuilderQuery ,
} ,
} ,
}
Enrich ( params , keys )
2023-04-25 21:53:46 +05:30
Convey ( "TestBuildTracesQuery" , t , func ( ) {
2024-09-13 16:43:56 +05:30
query , err := buildTracesQuery ( tt . Start , tt . End , tt . BuilderQuery . StepInterval , tt . BuilderQuery , tt . TableName , tt . PanelType , tt . Options )
2023-07-19 09:54:27 +05:30
So ( err , ShouldBeNil )
So ( query , ShouldEqual , tt . ExpectedQuery )
} )
}
}
var testPrepTracesQueryData = [ ] struct {
Name string
PanelType v3 . PanelType
Start int64
End int64
BuilderQuery * v3 . BuilderQuery
ExpectedQuery string
Keys map [ string ] v3 . AttributeKey
2024-10-22 16:46:58 +05:30
Options v3 . QBOptions
2023-07-19 09:54:27 +05:30
} {
{
Name : "Test TS with limit- first" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
Limit : 10 ,
StepInterval : 60 ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
} ,
ExpectedQuery : "SELECT `method` from (SELECT stringTagMap['method'] as `method`," +
" toFloat64(count(distinct(stringTagMap['name']))) as value from signoz_traces.distributed_signoz_index_v2" +
2023-08-22 17:09:58 +05:30
" where (timestamp >= '1680066360000000000' AND timestamp <= '1680066420000000000') AND" +
2023-07-19 09:54:27 +05:30
" stringTagMap['method'] = 'GET' AND has(stringTagMap, 'method') group by `method` order by value DESC) LIMIT 10" ,
Keys : map [ string ] v3 . AttributeKey { "name" : { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . FirstQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit- first - with order by value" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
Limit : 10 ,
StepInterval : 60 ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : constants . SigNozOrderByValue , Order : "ASC" } } ,
} ,
ExpectedQuery : "SELECT `method` from (SELECT stringTagMap['method'] as `method`," +
" toFloat64(count(distinct(stringTagMap['name']))) as value from " +
2023-08-22 17:09:58 +05:30
"signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') AND stringTagMap['method'] = 'GET' AND" +
2023-07-19 09:54:27 +05:30
" has(stringTagMap, 'method') group by `method` order by value ASC) LIMIT 10" ,
Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . FirstQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit- first - with order by attribute" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "serviceName" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { } ,
Limit : 10 ,
StepInterval : 60 ,
GroupBy : [ ] v3 . AttributeKey { { Key : "serviceName" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "serviceName" , Order : "ASC" } } ,
} ,
ExpectedQuery : "SELECT `serviceName` from (SELECT serviceName as `serviceName`," +
" toFloat64(count(distinct(serviceName))) as value from " +
2023-08-22 17:09:58 +05:30
"signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') " +
2023-07-19 09:54:27 +05:30
"group by `serviceName` order by `serviceName` ASC) LIMIT 10" ,
Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . FirstQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit- first - with 2 group by and 2 order by" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "serviceName" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { } ,
Limit : 10 ,
StepInterval : 60 ,
GroupBy : [ ] v3 . AttributeKey {
{ Key : "serviceName" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag , IsColumn : true } ,
{ Key : "http.method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
} ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "serviceName" , Order : "ASC" } , { ColumnName : constants . SigNozOrderByValue , Order : "ASC" } } ,
} ,
ExpectedQuery : "SELECT `serviceName`,`http.method` from (SELECT serviceName as `serviceName`," +
" stringTagMap['http.method'] as `http.method`," +
" toFloat64(count(distinct(serviceName))) as value from " +
2023-08-22 17:09:58 +05:30
"signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') AND has(stringTagMap, 'http.method') " +
2023-07-19 09:54:27 +05:30
"group by `serviceName`,`http.method` order by `serviceName` ASC,value ASC) LIMIT 10" ,
Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . FirstQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit- second" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
Limit : 2 ,
StepInterval : 60 ,
} ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, " +
"stringTagMap['method'] as `method`, toFloat64(count(distinct(stringTagMap['name'])))" +
2023-08-22 17:09:58 +05:30
" as value from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') AND stringTagMap['method'] = 'GET' AND" +
2023-07-19 09:54:27 +05:30
" has(stringTagMap, 'method') AND (`method`) GLOBAL IN (%s) group by `method`,ts order by value DESC" ,
Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . SecondQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit- second - with order by" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey { { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } } ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } } ,
Limit : 2 ,
StepInterval : 60 ,
} ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, " +
"stringTagMap['method'] as `method`, toFloat64(count(distinct(stringTagMap['name'])))" +
2023-08-22 17:09:58 +05:30
" as value from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') AND stringTagMap['method'] = 'GET' AND" +
2023-07-19 09:54:27 +05:30
" has(stringTagMap, 'method') AND (`method`) GLOBAL IN (%s) group by `method`,ts order by `method` ASC" , Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . SecondQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
{
Name : "Test TS with limit - second - with two group by and two order by" ,
PanelType : v3 . PanelTypeGraph ,
2023-08-22 17:09:58 +05:30
Start : 1680066360726 ,
End : 1680066458000 ,
2023-07-19 09:54:27 +05:30
BuilderQuery : & v3 . BuilderQuery {
QueryName : "A" ,
AggregateAttribute : v3 . AttributeKey { Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
AggregateOperator : v3 . AggregateOperatorCountDistinct ,
Expression : "A" ,
Filters : & v3 . FilterSet { Operator : "AND" , Items : [ ] v3 . FilterItem {
{ Key : v3 . AttributeKey { Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } , Value : "GET" , Operator : "=" } ,
} ,
} ,
GroupBy : [ ] v3 . AttributeKey {
{ Key : "method" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
{ Key : "name" , DataType : v3 . AttributeKeyDataTypeString , Type : v3 . AttributeKeyTypeTag } ,
} ,
OrderBy : [ ] v3 . OrderBy { { ColumnName : "method" , Order : "ASC" } , { ColumnName : "name" , Order : "ASC" } } ,
Limit : 2 ,
StepInterval : 60 ,
} ,
ExpectedQuery : "SELECT toStartOfInterval(timestamp, INTERVAL 60 SECOND) AS ts, " +
"stringTagMap['method'] as `method`, stringTagMap['name'] as `name`," +
" toFloat64(count(distinct(stringTagMap['name'])))" +
2023-08-22 17:09:58 +05:30
" as value from signoz_traces.distributed_signoz_index_v2 where (timestamp >= '1680066360000000000'" +
" AND timestamp <= '1680066420000000000') AND stringTagMap['method'] = 'GET' AND" +
2023-07-19 09:54:27 +05:30
" has(stringTagMap, 'method') AND has(stringTagMap, 'name') " +
"AND (`method`,`name`) GLOBAL IN (%s) group by `method`,`name`,ts " +
"order by `method` ASC,`name` ASC" ,
Keys : map [ string ] v3 . AttributeKey { } ,
2024-10-22 16:46:58 +05:30
Options : v3 . QBOptions {
2023-08-18 07:32:05 +05:30
GraphLimitQtype : constants . SecondQueryGraphLimit ,
} ,
2023-07-19 09:54:27 +05:30
} ,
}
func TestPrepareTracesQuery ( t * testing . T ) {
for _ , tt := range testPrepTracesQueryData {
Convey ( "TestPrepareTracesQuery" , t , func ( ) {
2024-09-13 16:43:56 +05:30
query , err := PrepareTracesQuery ( tt . Start , tt . End , tt . PanelType , tt . BuilderQuery , tt . Options )
2023-04-25 21:53:46 +05:30
So ( err , ShouldBeNil )
So ( query , ShouldEqual , tt . ExpectedQuery )
} )
}
}