fix: changes in code to support ch 25.5 (#8615)

* fix: changes in code to support ch 25.5

* fix: address comments

* fix: make changes in funnels
This commit is contained in:
Nityananda Gohain 2025-07-28 19:49:52 +05:30 committed by GitHub
parent 210393e281
commit 86057cad9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 264 additions and 163 deletions

View File

@ -31,15 +31,15 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -93,16 +93,16 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
minIf(timestamp, serviceName = step3.1 AND name = step3.2) AS t3_time minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s)
OR (serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]s) OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]s)
OR (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s) OR (resource_string_service$$name = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -157,17 +157,17 @@ WITH
, funnel AS ( , funnel AS (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS s1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS s2_error toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[11]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[11]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[12]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[12]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -246,19 +246,19 @@ WITH
, funnel AS ( , funnel AS (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
minIf(timestamp, serviceName = step3.1 AND name = step3.2) AS t3_time, minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS s1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS s2_error, toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_error,
toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS s3_error toUInt8(anyIf(has_error, resource_string_service$$name = step3.1 AND name = step3.2)) AS s3_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s)
OR (serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]s) OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]s)
OR (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s) OR (resource_string_service$$name = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -341,17 +341,17 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS t1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS t2_error toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS t2_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -409,19 +409,19 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
minIf(timestamp, serviceName = step3.1 AND name = step3.2) AS t3_time, minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS t1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS t2_error, toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS t2_error,
toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS t3_error toUInt8(anyIf(has_error, resource_string_service$$name = step3.1 AND name = step3.2)) AS t3_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s)
OR (serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]s) OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]s)
OR (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s) OR (resource_string_service$$name = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -474,16 +474,16 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
count() AS span_count count() AS span_count
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 AND t2_time > t1_time HAVING t1_time > 0 AND t2_time > t1_time
@ -534,18 +534,18 @@ SELECT
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS t1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS t2_error, toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS t2_error,
count() AS span_count count() AS span_count
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[9]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[10]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 AND t2_time > t1_time HAVING t1_time > 0 AND t2_time > t1_time
@ -621,17 +621,17 @@ FROM (
FROM ( FROM (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS s1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS s2_error toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[11]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[11]s)
OR OR
(serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[12]s) (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[12]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0
@ -696,19 +696,19 @@ WITH
funnel AS ( funnel AS (
SELECT SELECT
trace_id, trace_id,
minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time,
minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time,
minIf(timestamp, serviceName = step3.1 AND name = step3.2) AS t3_time, minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time,
toUInt8(anyIf(has_error, serviceName = step1.1 AND name = step1.2)) AS s1_error, toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error,
toUInt8(anyIf(has_error, serviceName = step2.1 AND name = step2.2)) AS s2_error, toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_error,
toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS s3_error toUInt8(anyIf(has_error, resource_string_service$$name = step3.1 AND name = step3.2)) AS s3_error
FROM signoz_traces.distributed_signoz_index_v3 FROM signoz_traces.distributed_signoz_index_v3
WHERE WHERE
timestamp BETWEEN start_ts AND end_ts timestamp BETWEEN start_ts AND end_ts
AND ( AND (
(serviceName = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s) (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s)
OR (serviceName = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]s) OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]s)
OR (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s) OR (resource_string_service$$name = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s)
) )
GROUP BY trace_id GROUP BY trace_id
HAVING t1_time > 0 HAVING t1_time > 0

View File

@ -41,17 +41,17 @@ func ValidateTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefunn
} }
// Build filter clauses for each step // Build filter clauses for each step
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep3 := "" clauseStep3 := ""
if len(funnel.Steps) > 2 { if len(funnel.Steps) > 2 {
clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -125,17 +125,17 @@ func GetFunnelAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange trace
} }
// Build filter clauses for each step // Build filter clauses for each step
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep3 := "" clauseStep3 := ""
if len(funnel.Steps) > 2 { if len(funnel.Steps) > 2 {
clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -238,17 +238,17 @@ func GetFunnelStepAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange t
} }
// Build filter clauses for each step // Build filter clauses for each step
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep3 := "" clauseStep3 := ""
if len(funnel.Steps) > 2 { if len(funnel.Steps) > 2 {
clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -322,17 +322,17 @@ func GetStepAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu
} }
// Build filter clauses for each step // Build filter clauses for each step
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep3 := "" clauseStep3 := ""
if len(funnel.Steps) > 2 { if len(funnel.Steps) > 2 {
clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -399,11 +399,11 @@ func GetSlowestTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu
} }
// Build filter clauses for the steps // Build filter clauses for the steps
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[stepStartOrder].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepStartOrder].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[stepEndOrder].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepEndOrder].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -446,11 +446,11 @@ func GetErroredTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu
} }
// Build filter clauses for the steps // Build filter clauses for the steps
clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[stepStartOrder].Filters) clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepStartOrder].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[stepEndOrder].Filters) clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepEndOrder].Filters, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -897,7 +897,7 @@ func (r *ClickHouseReader) GetWaterfallSpansForTraceWithMetadata(ctx context.Con
if err != nil { if err != nil {
zap.L().Info("cache miss for getWaterfallSpansForTraceWithMetadata", zap.String("traceID", traceID)) zap.L().Info("cache miss for getWaterfallSpansForTraceWithMetadata", zap.String("traceID", traceID))
searchScanResponses, err := r.GetSpansForTrace(ctx, traceID, fmt.Sprintf("SELECT DISTINCT ON (span_id) timestamp, duration_nano, span_id, trace_id, has_error, kind, resource_string_service$$name, name, references, attributes_string, attributes_number, attributes_bool, resources_string, events, status_message, status_code_string, kind_string FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3 ORDER BY timestamp ASC, name ASC", r.TraceDB, r.traceTableName)) searchScanResponses, err := r.GetSpansForTrace(ctx, traceID, fmt.Sprintf("SELECT DISTINCT ON (span_id) timestamp, duration_nano, span_id, trace_id, has_error, kind, resource_string_service$$name, name, links as references, attributes_string, attributes_number, attributes_bool, resources_string, events, status_message, status_code_string, kind_string FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3 ORDER BY timestamp ASC, name ASC", r.TraceDB, r.traceTableName))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1104,7 +1104,7 @@ func (r *ClickHouseReader) GetFlamegraphSpansForTrace(ctx context.Context, orgID
if err != nil { if err != nil {
zap.L().Info("cache miss for getFlamegraphSpansForTrace", zap.String("traceID", traceID)) zap.L().Info("cache miss for getFlamegraphSpansForTrace", zap.String("traceID", traceID))
searchScanResponses, err := r.GetSpansForTrace(ctx, traceID, fmt.Sprintf("SELECT timestamp, duration_nano, span_id, trace_id, has_error,references, resource_string_service$$name, name, events FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3 ORDER BY timestamp ASC, name ASC", r.TraceDB, r.traceTableName)) searchScanResponses, err := r.GetSpansForTrace(ctx, traceID, fmt.Sprintf("SELECT timestamp, duration_nano, span_id, trace_id, has_error,links as references, resource_string_service$$name, name, events FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3 ORDER BY timestamp ASC, name ASC", r.TraceDB, r.traceTableName))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -5977,7 +5977,7 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, params *model.Searc
var startTime, endTime, durationNano uint64 var startTime, endTime, durationNano uint64
var searchScanResponses []model.SpanItemV2 var searchScanResponses []model.SpanItemV2
query := fmt.Sprintf("SELECT timestamp, duration_nano, span_id, trace_id, has_error, kind, resource_string_service$$name, name, references, attributes_string, attributes_number, attributes_bool, resources_string, events, status_message, status_code_string, kind_string FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3", r.TraceDB, r.traceTableName) query := fmt.Sprintf("SELECT timestamp, duration_nano, span_id, trace_id, has_error, kind, resource_string_service$$name, name, links as references, attributes_string, attributes_number, attributes_bool, resources_string, events, status_message, status_code_string, kind_string FROM %s.%s WHERE trace_id=$1 and ts_bucket_start>=$2 and ts_bucket_start<=$3", r.TraceDB, r.traceTableName)
err = r.db.Select(ctx, &searchScanResponses, query, params.TraceID, strconv.FormatInt(traceSummary.Start.Unix()-1800, 10), strconv.FormatInt(traceSummary.End.Unix(), 10)) err = r.db.Select(ctx, &searchScanResponses, query, params.TraceID, strconv.FormatInt(traceSummary.Start.Unix()-1800, 10), strconv.FormatInt(traceSummary.End.Unix(), 10))
if err != nil { if err != nil {
zap.L().Error("Error in processing sql query", zap.Error(err)) zap.L().Error("Error in processing sql query", zap.Error(err))

View File

@ -49,7 +49,15 @@ func getClickHouseTracesColumnDataType(columnDataType v3.AttributeKeyDataType) s
return "string" return "string"
} }
func getColumnName(key v3.AttributeKey) string { func getColumnName(key v3.AttributeKey, replaceAlias bool) string {
if replaceAlias {
if _, ok := constants.DeprecatedStaticFieldsTraces[key.Key]; ok {
if _, ok := constants.NewStaticFieldsTraces[key.Key]; !ok {
key = constants.NewStaticFieldsTraces[constants.OldToNewTraceFieldsMap[key.Key]]
}
}
}
// if key present in static return as it is // if key present in static return as it is
if _, ok := constants.StaticFieldsTraces[key.Key]; ok { if _, ok := constants.StaticFieldsTraces[key.Key]; ok {
return key.Key return key.Key
@ -68,7 +76,7 @@ func getColumnName(key v3.AttributeKey) string {
func getSelectLabels(groupBy []v3.AttributeKey) string { func getSelectLabels(groupBy []v3.AttributeKey) string {
var labels []string var labels []string
for _, tag := range groupBy { for _, tag := range groupBy {
name := getColumnName(tag) name := getColumnName(tag, true)
labels = append(labels, fmt.Sprintf(" %s as `%s`", name, tag.Key)) labels = append(labels, fmt.Sprintf(" %s as `%s`", name, tag.Key))
} }
return strings.Join(labels, ",") return strings.Join(labels, ",")
@ -78,29 +86,30 @@ func getSelectLabels(groupBy []v3.AttributeKey) string {
func existsSubQueryForFixedColumn(key v3.AttributeKey, op v3.FilterOperator) (string, error) { func existsSubQueryForFixedColumn(key v3.AttributeKey, op v3.FilterOperator) (string, error) {
if key.DataType == v3.AttributeKeyDataTypeString { if key.DataType == v3.AttributeKeyDataTypeString {
if op == v3.FilterOperatorExists { if op == v3.FilterOperatorExists {
return fmt.Sprintf("%s %s ''", getColumnName(key), tracesOperatorMappingV3[v3.FilterOperatorNotEqual]), nil return fmt.Sprintf("%s %s ''", getColumnName(key, true), tracesOperatorMappingV3[v3.FilterOperatorNotEqual]), nil
} else { } else {
return fmt.Sprintf("%s %s ''", getColumnName(key), tracesOperatorMappingV3[v3.FilterOperatorEqual]), nil return fmt.Sprintf("%s %s ''", getColumnName(key, true), tracesOperatorMappingV3[v3.FilterOperatorEqual]), nil
} }
} else { } else {
return "", fmt.Errorf("unsupported operation, exists and not exists can only be applied on custom attributes or string type columns") return "", fmt.Errorf("unsupported operation, exists and not exists can only be applied on custom attributes or string type columns")
} }
} }
func BuildTracesFilterQuery(fs *v3.FilterSet) (string, error) { func BuildTracesFilterQuery(fs *v3.FilterSet, skipAllowed bool) (string, error) {
var conditions []string var conditions []string
if fs != nil && len(fs.Items) != 0 { if fs != nil && len(fs.Items) != 0 {
for _, item := range fs.Items { for _, item := range fs.Items {
// skip if it's a resource attribute or Span search scope attribute // skip if it's a resource attribute or Span search scope attribute
if item.Key.Type == v3.AttributeKeyTypeResource || item.Key.Type == v3.AttributeKeyTypeSpanSearchScope { // adding skipAllowed because traceFunnels requires the resource one as well.
if skipAllowed && (item.Key.Type == v3.AttributeKeyTypeResource || item.Key.Type == v3.AttributeKeyTypeSpanSearchScope) {
continue continue
} }
val := item.Value val := item.Value
// generate the key // generate the key
columnName := getColumnName(item.Key) columnName := getColumnName(item.Key, true)
var fmtVal string var fmtVal string
item.Operator = v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator)))) item.Operator = v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator))))
if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNotExists { if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNotExists {
@ -148,60 +157,6 @@ func BuildTracesFilterQuery(fs *v3.FilterSet) (string, error) {
return queryString, nil return queryString, nil
} }
// TODO: remove this function as this is identical to BuildTracesFilterQuery
func BuildTracesFilter(fs *v3.FilterSet) (string, error) {
var conditions []string
if fs != nil && len(fs.Items) != 0 {
for _, item := range fs.Items {
val := item.Value
// generate the key
columnName := getColumnName(item.Key)
var fmtVal string
item.Operator = v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator))))
if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNotExists {
var err error
val, err = utils.ValidateAndCastValue(val, item.Key.DataType)
if err != nil {
return "", fmt.Errorf("invalid value for key %s: %v", item.Key.Key, err)
}
}
if val != nil {
fmtVal = utils.ClickHouseFormattedValue(val)
}
if operator, ok := tracesOperatorMappingV3[item.Operator]; ok {
switch item.Operator {
case v3.FilterOperatorContains, v3.FilterOperatorNotContains:
// we also want to treat %, _ as literals for contains
val := utils.QuoteEscapedStringForContains(fmt.Sprintf("%s", item.Value), false)
conditions = append(conditions, fmt.Sprintf("%s %s '%%%s%%'", columnName, operator, val))
case v3.FilterOperatorRegex, v3.FilterOperatorNotRegex:
conditions = append(conditions, fmt.Sprintf(operator, columnName, fmtVal))
case v3.FilterOperatorExists, v3.FilterOperatorNotExists:
if item.Key.IsColumn {
subQuery, err := existsSubQueryForFixedColumn(item.Key, item.Operator)
if err != nil {
return "", err
}
conditions = append(conditions, subQuery)
} else {
cType := getClickHouseTracesColumnType(item.Key.Type)
cDataType := getClickHouseTracesColumnDataType(item.Key.DataType)
col := fmt.Sprintf("%s_%s", cType, cDataType)
conditions = append(conditions, fmt.Sprintf(operator, col, item.Key.Key))
}
default:
conditions = append(conditions, fmt.Sprintf("%s %s %s", columnName, operator, fmtVal))
}
} else {
return "", fmt.Errorf("unsupported operator %s", item.Operator)
}
}
}
return strings.Join(conditions, " AND "), nil
}
func handleEmptyValuesInGroupBy(groupBy []v3.AttributeKey) (string, error) { func handleEmptyValuesInGroupBy(groupBy []v3.AttributeKey) (string, error) {
// TODO(nitya): in future when we support user based mat column handle them // TODO(nitya): in future when we support user based mat column handle them
// skipping now as we don't support creating them // skipping now as we don't support creating them
@ -221,7 +176,7 @@ func handleEmptyValuesInGroupBy(groupBy []v3.AttributeKey) (string, error) {
Operator: "AND", Operator: "AND",
Items: filterItems, Items: filterItems,
} }
return BuildTracesFilterQuery(&filterSet) return BuildTracesFilterQuery(&filterSet, true)
} }
return "", nil return "", nil
} }
@ -239,7 +194,9 @@ func orderBy(panelType v3.PanelType, items []v3.OrderBy, tagLookup map[string]st
orderBy = append(orderBy, fmt.Sprintf("`%s` %s", item.ColumnName, item.Order)) orderBy = append(orderBy, fmt.Sprintf("`%s` %s", item.ColumnName, item.Order))
} else if panelType == v3.PanelTypeList { } else if panelType == v3.PanelTypeList {
attr := v3.AttributeKey{Key: item.ColumnName, DataType: item.DataType, Type: item.Type, IsColumn: item.IsColumn} attr := v3.AttributeKey{Key: item.ColumnName, DataType: item.DataType, Type: item.Type, IsColumn: item.IsColumn}
name := getColumnName(attr) // we want to keep the original name as it will be already corrected by the select query
// so we are setting replaceAlias = false
name := getColumnName(attr, false)
orderBy = append(orderBy, fmt.Sprintf("%s %s", name, item.Order)) orderBy = append(orderBy, fmt.Sprintf("%s %s", name, item.Order))
} }
} }
@ -302,7 +259,7 @@ func buildTracesQuery(start, end, step int64, mq *v3.BuilderQuery, panelType v3.
timeFilter := fmt.Sprintf("(timestamp >= '%d' AND timestamp <= '%d') AND (ts_bucket_start >= %d AND ts_bucket_start <= %d)", tracesStart, tracesEnd, bucketStart, bucketEnd) timeFilter := fmt.Sprintf("(timestamp >= '%d' AND timestamp <= '%d') AND (ts_bucket_start >= %d AND ts_bucket_start <= %d)", tracesStart, tracesEnd, bucketStart, bucketEnd)
filterSubQuery, err := BuildTracesFilterQuery(mq.Filters) filterSubQuery, err := BuildTracesFilterQuery(mq.Filters, true)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -379,7 +336,7 @@ func buildTracesQuery(start, end, step int64, mq *v3.BuilderQuery, panelType v3.
} }
selectLabels = getSelectLabels(mq.SelectColumns) selectLabels = getSelectLabels(mq.SelectColumns)
// add it to the select labels // add it to the select labels
queryNoOpTmpl := fmt.Sprintf("SELECT timestamp as timestamp_datetime, spanID, traceID,%s ", selectLabels) + "from " + constants.SIGNOZ_TRACE_DBNAME + "." + constants.SIGNOZ_SPAN_INDEX_V3 + " where %s %s" + "%s" queryNoOpTmpl := fmt.Sprintf("SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID,%s ", selectLabels) + "from " + constants.SIGNOZ_TRACE_DBNAME + "." + constants.SIGNOZ_SPAN_INDEX_V3 + " where %s %s" + "%s"
query = fmt.Sprintf(queryNoOpTmpl, timeFilter, filterSubQuery, orderBy) query = fmt.Sprintf(queryNoOpTmpl, timeFilter, filterSubQuery, orderBy)
} else { } else {
return "", fmt.Errorf("unsupported aggregate operator %s for panelType %s", mq.AggregateOperator, panelType) return "", fmt.Errorf("unsupported aggregate operator %s for panelType %s", mq.AggregateOperator, panelType)
@ -400,7 +357,7 @@ func buildTracesQuery(start, end, step int64, mq *v3.BuilderQuery, panelType v3.
aggregationKey := "" aggregationKey := ""
if mq.AggregateAttribute.Key != "" { if mq.AggregateAttribute.Key != "" {
aggregationKey = getColumnName(mq.AggregateAttribute) aggregationKey = getColumnName(mq.AggregateAttribute, true)
if mq.AggregateAttribute.Key == "timestamp" { if mq.AggregateAttribute.Key == "timestamp" {
aggregationKey = "toUnixTimestamp64Nano(timestamp)" aggregationKey = "toUnixTimestamp64Nano(timestamp)"
} }

View File

@ -89,7 +89,8 @@ func Test_getClickHouseTracesColumnDataType(t *testing.T) {
func Test_getColumnName(t *testing.T) { func Test_getColumnName(t *testing.T) {
type args struct { type args struct {
key v3.AttributeKey key v3.AttributeKey
replaceAlias bool
} }
tests := []struct { tests := []struct {
name string name string
@ -113,7 +114,8 @@ func Test_getColumnName(t *testing.T) {
{ {
name: "static column", name: "static column",
args: args{ args: args{
key: v3.AttributeKey{Key: "spanKind", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}, key: v3.AttributeKey{Key: "spanKind", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true},
replaceAlias: false,
}, },
want: "spanKind", want: "spanKind",
}, },
@ -145,10 +147,26 @@ func Test_getColumnName(t *testing.T) {
}, },
want: "`attribute_string_http$$route`", want: "`attribute_string_http$$route`",
}, },
{
name: "static column with replace alias",
args: args{
key: v3.AttributeKey{Key: "spanKind", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true},
replaceAlias: true,
},
want: "kind_string",
},
{
name: "static column with replace alias 2",
args: args{
key: v3.AttributeKey{Key: "serviceName", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true},
replaceAlias: true,
},
want: "resource_string_service$$name",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := getColumnName(tt.args.key); got != tt.want { if got := getColumnName(tt.args.key, tt.args.replaceAlias); got != tt.want {
t.Errorf("getColumnName() = %v, want %v", got, tt.want) t.Errorf("getColumnName() = %v, want %v", got, tt.want)
} }
}) })
@ -181,6 +199,30 @@ func Test_getSelectLabels(t *testing.T) {
}, },
want: " name as `name`, `resource_string_service_name` as `service_name`", want: " name as `name`, `resource_string_service_name` as `service_name`",
}, },
{
name: "depricated Columns",
args: args{
groupBy: []v3.AttributeKey{
{Key: "spanKind", DataType: v3.AttributeKeyDataTypeString},
{Key: "statusMessage", DataType: v3.AttributeKeyDataTypeString},
{Key: "traceID", DataType: v3.AttributeKeyDataTypeString},
{Key: "spanID", DataType: v3.AttributeKeyDataTypeString},
{Key: "serviceName", DataType: v3.AttributeKeyDataTypeString},
{Key: "httpRoute", DataType: v3.AttributeKeyDataTypeString},
},
},
want: " kind_string as `spanKind`, status_message as `statusMessage`, trace_id as `traceID`, span_id as `spanID`, resource_string_service$$name as `serviceName`, attribute_string_http$$route as `httpRoute`",
},
{
name: "non depricated Columns",
args: args{
groupBy: []v3.AttributeKey{
{Key: "name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag},
{Key: "kind", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag},
},
},
want: " name as `name`, kind as `kind`",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
@ -271,10 +313,20 @@ func Test_buildTracesFilterQuery(t *testing.T) {
}, },
want: "mapContains(attributes_string, 'host') AND mapContains(attributes_number, 'duration') AND NOT mapContains(attributes_bool, 'isDone') AND NOT mapContains(attributes_string, 'host1') AND `attribute_string_path` = '' AND http_url = '' AND `attribute_string_http$$route` = ''", want: "mapContains(attributes_string, 'host') AND mapContains(attributes_number, 'duration') AND NOT mapContains(attributes_bool, 'isDone') AND NOT mapContains(attributes_string, 'host1') AND `attribute_string_path` = '' AND http_url = '' AND `attribute_string_http$$route` = ''",
}, },
{
name: "Test exists, nexists",
args: args{
fs: &v3.FilterSet{Operator: "AND", Items: []v3.FilterItem{
{Key: v3.AttributeKey{Key: "httpMethod", DataType: v3.AttributeKeyDataTypeString, IsColumn: true}, Operator: v3.FilterOperatorExists},
{Key: v3.AttributeKey{Key: "serviceName", DataType: v3.AttributeKeyDataTypeString, IsColumn: true}, Operator: v3.FilterOperatorExists},
}},
},
want: "http_method != '' AND resource_string_service$$name != ''",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := BuildTracesFilterQuery(tt.args.fs) got, err := BuildTracesFilterQuery(tt.args.fs, true)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("BuildTracesFilterQuery() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("BuildTracesFilterQuery() error = %v, wantErr %v", err, tt.wantErr)
return return
@ -401,6 +453,18 @@ func Test_orderByAttributeKeyTags(t *testing.T) {
}, },
want: "value DESC", want: "value DESC",
}, },
{
name: "test",
args: args{
panelType: v3.PanelTypeList,
items: []v3.OrderBy{
{ColumnName: "spanKind", Order: "DESC", DataType: v3.AttributeKeyDataTypeString},
{ColumnName: "statusMessage", Order: "DESC", DataType: v3.AttributeKeyDataTypeString},
{ColumnName: "traceID", Order: "DESC", DataType: v3.AttributeKeyDataTypeString},
},
},
want: "spanKind DESC,statusMessage DESC,traceID DESC",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
@ -549,7 +613,7 @@ func Test_buildTracesQuery(t *testing.T) {
OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}}, OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) order by timestamp ASC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) order by timestamp ASC",
}, },
{ {
@ -565,7 +629,7 @@ func Test_buildTracesQuery(t *testing.T) {
OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}}, OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND ((name, `resource_string_service$$name`) GLOBAL IN ( SELECT DISTINCT name, serviceName from signoz_traces.distributed_top_level_operations )) AND parent_span_id != '' order by timestamp ASC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND ((name, `resource_string_service$$name`) GLOBAL IN ( SELECT DISTINCT name, serviceName from signoz_traces.distributed_top_level_operations )) AND parent_span_id != '' order by timestamp ASC",
}, },
{ {
@ -581,7 +645,7 @@ func Test_buildTracesQuery(t *testing.T) {
OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}}, OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND parent_span_id = '' order by timestamp ASC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND parent_span_id = '' order by timestamp ASC",
}, },
{ {
@ -597,7 +661,7 @@ func Test_buildTracesQuery(t *testing.T) {
OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}}, OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND parent_span_id = '' order by timestamp ASC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND parent_span_id = '' order by timestamp ASC",
}, },
{ {
@ -613,7 +677,7 @@ func Test_buildTracesQuery(t *testing.T) {
OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}}, OrderBy: []v3.OrderBy{{ColumnName: "timestamp", Order: "ASC"}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND (resource_fingerprint GLOBAL IN (SELECT fingerprint FROM signoz_traces.distributed_traces_v3_resource WHERE (seen_at_ts_bucket_start >= 1680064560) AND (seen_at_ts_bucket_start <= 1680066458) AND simpleJSONExtractString(labels, 'service.name') = 'cartservice' AND labels like '%service.name\":\"cartservice%')) AND parent_span_id = '' order by timestamp ASC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND (resource_fingerprint GLOBAL IN (SELECT fingerprint FROM signoz_traces.distributed_traces_v3_resource WHERE (seen_at_ts_bucket_start >= 1680064560) AND (seen_at_ts_bucket_start <= 1680066458) AND simpleJSONExtractString(labels, 'service.name') = 'cartservice' AND labels like '%service.name\":\"cartservice%')) AND parent_span_id = '' order by timestamp ASC",
}, },
{ {
@ -628,7 +692,7 @@ func Test_buildTracesQuery(t *testing.T) {
SelectColumns: []v3.AttributeKey{{Key: "name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}}, SelectColumns: []v3.AttributeKey{{Key: "name", DataType: v3.AttributeKeyDataTypeString, Type: v3.AttributeKeyTypeTag, IsColumn: true}},
}, },
}, },
want: "SELECT timestamp as timestamp_datetime, spanID, traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " + want: "SELECT timestamp as timestamp_datetime, span_id as spanID, trace_id as traceID, name as `name` from signoz_traces.distributed_signoz_index_v3 where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') " +
"AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) order by timestamp DESC", "AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) order by timestamp DESC",
}, },
{ {
@ -902,7 +966,7 @@ func TestPrepareTracesQuery(t *testing.T) {
GraphLimitQtype: constants.SecondQueryGraphLimit, GraphLimitQtype: constants.SecondQueryGraphLimit,
}, },
}, },
want: "SELECT `attribute_string_function` as `function`, serviceName as `serviceName`, toFloat64(count(distinct(name))) as value from signoz_traces.distributed_signoz_index_v3 " + want: "SELECT `attribute_string_function` as `function`, resource_string_service$$name as `serviceName`, toFloat64(count(distinct(name))) as value from signoz_traces.distributed_signoz_index_v3 " +
"where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND attributes_number['line'] = 100 " + "where (timestamp >= '1680066360726210000' AND timestamp <= '1680066458000000000') AND (ts_bucket_start >= 1680064560 AND ts_bucket_start <= 1680066458) AND attributes_number['line'] = 100 " +
"AND (resource_fingerprint GLOBAL IN (SELECT fingerprint FROM signoz_traces.distributed_traces_v3_resource WHERE (seen_at_ts_bucket_start >= 1680064560) AND (seen_at_ts_bucket_start <= 1680066458) " + "AND (resource_fingerprint GLOBAL IN (SELECT fingerprint FROM signoz_traces.distributed_traces_v3_resource WHERE (seen_at_ts_bucket_start >= 1680064560) AND (seen_at_ts_bucket_start <= 1680066458) " +
"AND simpleJSONExtractString(labels, 'hostname') = 'server1' AND labels like '%hostname\":\"server1%')) AND (`function`,`serviceName`) GLOBAL IN (#LIMIT_PLACEHOLDER) group by `function`,`serviceName` order by value DESC", "AND simpleJSONExtractString(labels, 'hostname') = 'server1' AND labels like '%hostname\":\"server1%')) AND (`function`,`serviceName`) GLOBAL IN (#LIMIT_PLACEHOLDER) group by `function`,`serviceName` order by value DESC",

View File

@ -444,8 +444,53 @@ var NewStaticFieldsTraces = map[string]v3.AttributeKey{
DataType: v3.AttributeKeyDataTypeString, DataType: v3.AttributeKeyDataTypeString,
IsColumn: true, IsColumn: true,
}, },
// the simple attributes are not present here as
// they are taken care by new format <attribute_type>_<attribute_datatype>_'<attribute_key>' // these are just added so that we don't use the aliased columns
"resource_string_service$$name": {
Key: "resource_string_service$$name",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_http$$route": {
Key: "attribute_string_http$$route",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_messaging$$system": {
Key: "attribute_string_messaging$$system",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_messaging$$operation": {
Key: "attribute_string_messaging$$operation",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_db$$system": {
Key: "attribute_string_db$$system",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_rpc$$system": {
Key: "attribute_string_rpc$$system",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_rpc$$service": {
Key: "attribute_string_rpc$$service",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_rpc$$method": {
Key: "attribute_string_rpc$$method",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
"attribute_string_peer$$service": {
Key: "attribute_string_peer$$service",
DataType: v3.AttributeKeyDataTypeString,
IsColumn: true,
},
} }
var DeprecatedStaticFieldsTraces = map[string]v3.AttributeKey{ var DeprecatedStaticFieldsTraces = map[string]v3.AttributeKey{
@ -607,6 +652,41 @@ var DeprecatedStaticFieldsTraces = map[string]v3.AttributeKey{
}, },
} }
// TODO(nitya): remove this later
var OldToNewTraceFieldsMap = map[string]string{
// deprecated intrinsic -> new intrinsic
"traceID": "trace_id",
"spanID": "span_id",
"parentSpanID": "parent_span_id",
"spanKind": "kind_string",
"durationNano": "duration_nano",
"statusCode": "status_code",
"statusMessage": "status_message",
"statusCodeString": "status_code_string",
// deprecated derived -> new derived / materialized
"references": "links",
"responseStatusCode": "response_status_code",
"externalHttpUrl": "external_http_url",
"httpUrl": "http_url",
"externalHttpMethod": "external_http_method",
"httpMethod": "http_method",
"httpHost": "http_host",
"dbName": "db_name",
"dbOperation": "db_operation",
"hasError": "has_error",
"isRemote": "is_remote",
"serviceName": "resource_string_service$$name",
"httpRoute": "attribute_string_http$$route",
"msgSystem": "attribute_string_messaging$$system",
"msgOperation": "attribute_string_messaging$$operation",
"dbSystem": "attribute_string_db$$system",
"rpcSystem": "attribute_string_rpc$$system",
"rpcService": "attribute_string_rpc$$service",
"rpcMethod": "attribute_string_rpc$$method",
"peerService": "attribute_string_peer$$service",
}
var StaticFieldsTraces = map[string]v3.AttributeKey{} var StaticFieldsTraces = map[string]v3.AttributeKey{}
var IsDotMetricsEnabled = false var IsDotMetricsEnabled = false