From 86057cad9f93373942f64b46165f1542cb422e6b Mon Sep 17 00:00:00 2001 From: Nityananda Gohain Date: Mon, 28 Jul 2025 19:49:52 +0530 Subject: [PATCH] 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 --- pkg/modules/tracefunnel/clickhouse_queries.go | 130 +++++++++--------- pkg/modules/tracefunnel/query.go | 32 ++--- .../app/clickhouseReader/reader.go | 6 +- .../app/traces/v4/query_builder.go | 89 ++++-------- .../app/traces/v4/query_builder_test.go | 86 ++++++++++-- pkg/query-service/constants/constants.go | 84 ++++++++++- 6 files changed, 264 insertions(+), 163 deletions(-) diff --git a/pkg/modules/tracefunnel/clickhouse_queries.go b/pkg/modules/tracefunnel/clickhouse_queries.go index 9b683afc42db..3d6ec33b799f 100644 --- a/pkg/modules/tracefunnel/clickhouse_queries.go +++ b/pkg/modules/tracefunnel/clickhouse_queries.go @@ -31,15 +31,15 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = 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 = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time FROM signoz_traces.distributed_signoz_index_v3 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 @@ -93,16 +93,16 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = 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 = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time FROM signoz_traces.distributed_signoz_index_v3 WHERE timestamp BETWEEN start_ts AND end_ts AND ( - (serviceName = 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 (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s) + (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s) + OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]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 HAVING t1_time > 0 @@ -157,17 +157,17 @@ WITH , funnel AS ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS s2_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_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 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 @@ -246,19 +246,19 @@ WITH , funnel AS ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS s2_error, - toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS s3_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error, + toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_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 WHERE timestamp BETWEEN start_ts AND end_ts AND ( - (serviceName = 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 (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s) + (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s) + OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]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 HAVING t1_time > 0 @@ -341,17 +341,17 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS t2_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_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 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 @@ -409,19 +409,19 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS t2_error, - toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS t3_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_error, + toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS t2_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 WHERE timestamp BETWEEN start_ts AND end_ts AND ( - (serviceName = 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 (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[14]s) + (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[12]s) + OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[13]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 HAVING t1_time > 0 @@ -474,16 +474,16 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = 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 = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, count() AS span_count FROM signoz_traces.distributed_signoz_index_v3 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 AND t2_time > t1_time @@ -534,18 +534,18 @@ SELECT FROM ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS t2_error, + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS t1_error, + toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS t2_error, count() AS span_count FROM signoz_traces.distributed_signoz_index_v3 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 AND t2_time > t1_time @@ -621,17 +621,17 @@ FROM ( FROM ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS s2_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_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 WHERE timestamp BETWEEN start_ts AND end_ts 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 - (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 HAVING t1_time > 0 @@ -696,19 +696,19 @@ WITH funnel AS ( SELECT trace_id, - minIf(timestamp, serviceName = step1.1 AND name = step1.2) AS t1_time, - minIf(timestamp, serviceName = step2.1 AND name = step2.2) AS t2_time, - minIf(timestamp, serviceName = 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, serviceName = step2.1 AND name = step2.2)) AS s2_error, - toUInt8(anyIf(has_error, serviceName = step3.1 AND name = step3.2)) AS s3_error + minIf(timestamp, resource_string_service$$name = step1.1 AND name = step1.2) AS t1_time, + minIf(timestamp, resource_string_service$$name = step2.1 AND name = step2.2) AS t2_time, + minIf(timestamp, resource_string_service$$name = step3.1 AND name = step3.2) AS t3_time, + toUInt8(anyIf(has_error, resource_string_service$$name = step1.1 AND name = step1.2)) AS s1_error, + toUInt8(anyIf(has_error, resource_string_service$$name = step2.1 AND name = step2.2)) AS s2_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 WHERE timestamp BETWEEN start_ts AND end_ts AND ( - (serviceName = 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 (serviceName = step3.1 AND name = step3.2 AND (contains_error_t3 = 0 OR has_error = true) %[17]s) + (resource_string_service$$name = step1.1 AND name = step1.2 AND (contains_error_t1 = 0 OR has_error = true) %[15]s) + OR (resource_string_service$$name = step2.1 AND name = step2.2 AND (contains_error_t2 = 0 OR has_error = true) %[16]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 HAVING t1_time > 0 diff --git a/pkg/modules/tracefunnel/query.go b/pkg/modules/tracefunnel/query.go index 0ec98b6faae9..4a1b670bb047 100644 --- a/pkg/modules/tracefunnel/query.go +++ b/pkg/modules/tracefunnel/query.go @@ -41,17 +41,17 @@ func ValidateTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefunn } // Build filter clauses for each step - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false) if err != nil { return nil, err } clauseStep3 := "" if len(funnel.Steps) > 2 { - clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) + clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false) if err != nil { return nil, err } @@ -125,17 +125,17 @@ func GetFunnelAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange trace } // Build filter clauses for each step - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false) if err != nil { return nil, err } clauseStep3 := "" if len(funnel.Steps) > 2 { - clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) + clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false) if err != nil { return nil, err } @@ -238,17 +238,17 @@ func GetFunnelStepAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange t } // Build filter clauses for each step - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false) if err != nil { return nil, err } clauseStep3 := "" if len(funnel.Steps) > 2 { - clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) + clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false) if err != nil { return nil, err } @@ -322,17 +322,17 @@ func GetStepAnalytics(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu } // Build filter clauses for each step - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[0].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[0].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[1].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[1].Filters, false) if err != nil { return nil, err } clauseStep3 := "" if len(funnel.Steps) > 2 { - clauseStep3, err = tracev4.BuildTracesFilter(funnelSteps[2].Filters) + clauseStep3, err = tracev4.BuildTracesFilterQuery(funnelSteps[2].Filters, false) if err != nil { return nil, err } @@ -399,11 +399,11 @@ func GetSlowestTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu } // Build filter clauses for the steps - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[stepStartOrder].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepStartOrder].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[stepEndOrder].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepEndOrder].Filters, false) if err != nil { return nil, err } @@ -446,11 +446,11 @@ func GetErroredTraces(funnel *tracefunneltypes.StorableFunnel, timeRange tracefu } // Build filter clauses for the steps - clauseStep1, err := tracev4.BuildTracesFilter(funnelSteps[stepStartOrder].Filters) + clauseStep1, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepStartOrder].Filters, false) if err != nil { return nil, err } - clauseStep2, err := tracev4.BuildTracesFilter(funnelSteps[stepEndOrder].Filters) + clauseStep2, err := tracev4.BuildTracesFilterQuery(funnelSteps[stepEndOrder].Filters, false) if err != nil { return nil, err } diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index 9750d60437dd..b61dd9d13179 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -897,7 +897,7 @@ func (r *ClickHouseReader) GetWaterfallSpansForTraceWithMetadata(ctx context.Con if err != nil { 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 { return nil, err } @@ -1104,7 +1104,7 @@ func (r *ClickHouseReader) GetFlamegraphSpansForTrace(ctx context.Context, orgID if err != nil { 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 { return nil, err } @@ -5977,7 +5977,7 @@ func (r *ClickHouseReader) SearchTraces(ctx context.Context, params *model.Searc var startTime, endTime, durationNano uint64 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)) if err != nil { zap.L().Error("Error in processing sql query", zap.Error(err)) diff --git a/pkg/query-service/app/traces/v4/query_builder.go b/pkg/query-service/app/traces/v4/query_builder.go index 86158ed2e74b..451a0e4d72d0 100644 --- a/pkg/query-service/app/traces/v4/query_builder.go +++ b/pkg/query-service/app/traces/v4/query_builder.go @@ -49,7 +49,15 @@ func getClickHouseTracesColumnDataType(columnDataType v3.AttributeKeyDataType) s 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 _, ok := constants.StaticFieldsTraces[key.Key]; ok { return key.Key @@ -68,7 +76,7 @@ func getColumnName(key v3.AttributeKey) string { func getSelectLabels(groupBy []v3.AttributeKey) string { var labels []string for _, tag := range groupBy { - name := getColumnName(tag) + name := getColumnName(tag, true) labels = append(labels, fmt.Sprintf(" %s as `%s`", name, tag.Key)) } return strings.Join(labels, ",") @@ -78,29 +86,30 @@ func getSelectLabels(groupBy []v3.AttributeKey) string { func existsSubQueryForFixedColumn(key v3.AttributeKey, op v3.FilterOperator) (string, error) { if key.DataType == v3.AttributeKeyDataTypeString { 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 { - return fmt.Sprintf("%s %s ''", getColumnName(key), tracesOperatorMappingV3[v3.FilterOperatorEqual]), nil + return fmt.Sprintf("%s %s ''", getColumnName(key, true), tracesOperatorMappingV3[v3.FilterOperatorEqual]), nil } } else { 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 if fs != nil && len(fs.Items) != 0 { for _, item := range fs.Items { // 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 } val := item.Value // generate the key - columnName := getColumnName(item.Key) + columnName := getColumnName(item.Key, true) var fmtVal string item.Operator = v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator)))) if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNotExists { @@ -148,60 +157,6 @@ func BuildTracesFilterQuery(fs *v3.FilterSet) (string, error) { 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) { // TODO(nitya): in future when we support user based mat column handle them // skipping now as we don't support creating them @@ -221,7 +176,7 @@ func handleEmptyValuesInGroupBy(groupBy []v3.AttributeKey) (string, error) { Operator: "AND", Items: filterItems, } - return BuildTracesFilterQuery(&filterSet) + return BuildTracesFilterQuery(&filterSet, true) } 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)) } else if panelType == v3.PanelTypeList { 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)) } } @@ -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) - filterSubQuery, err := BuildTracesFilterQuery(mq.Filters) + filterSubQuery, err := BuildTracesFilterQuery(mq.Filters, true) if err != nil { return "", err } @@ -379,7 +336,7 @@ func buildTracesQuery(start, end, step int64, mq *v3.BuilderQuery, panelType v3. } selectLabels = getSelectLabels(mq.SelectColumns) // 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) } else { 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 := "" if mq.AggregateAttribute.Key != "" { - aggregationKey = getColumnName(mq.AggregateAttribute) + aggregationKey = getColumnName(mq.AggregateAttribute, true) if mq.AggregateAttribute.Key == "timestamp" { aggregationKey = "toUnixTimestamp64Nano(timestamp)" } diff --git a/pkg/query-service/app/traces/v4/query_builder_test.go b/pkg/query-service/app/traces/v4/query_builder_test.go index 1b08f4dbd99c..574df68970d2 100644 --- a/pkg/query-service/app/traces/v4/query_builder_test.go +++ b/pkg/query-service/app/traces/v4/query_builder_test.go @@ -89,7 +89,8 @@ func Test_getClickHouseTracesColumnDataType(t *testing.T) { func Test_getColumnName(t *testing.T) { type args struct { - key v3.AttributeKey + key v3.AttributeKey + replaceAlias bool } tests := []struct { name string @@ -113,7 +114,8 @@ func Test_getColumnName(t *testing.T) { { name: "static column", 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", }, @@ -145,10 +147,26 @@ func Test_getColumnName(t *testing.T) { }, 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 { 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) } }) @@ -181,6 +199,30 @@ func Test_getSelectLabels(t *testing.T) { }, 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 { 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` = ''", }, + { + 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 { 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 { t.Errorf("BuildTracesFilterQuery() error = %v, wantErr %v", err, tt.wantErr) return @@ -401,6 +453,18 @@ func Test_orderByAttributeKeyTags(t *testing.T) { }, 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 { 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"}}, }, }, - 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", }, { @@ -565,7 +629,7 @@ func Test_buildTracesQuery(t *testing.T) { 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", }, { @@ -581,7 +645,7 @@ func Test_buildTracesQuery(t *testing.T) { 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", }, { @@ -597,7 +661,7 @@ func Test_buildTracesQuery(t *testing.T) { 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", }, { @@ -613,7 +677,7 @@ func Test_buildTracesQuery(t *testing.T) { 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", }, { @@ -628,7 +692,7 @@ func Test_buildTracesQuery(t *testing.T) { 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", }, { @@ -902,7 +966,7 @@ func TestPrepareTracesQuery(t *testing.T) { 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 " + "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", diff --git a/pkg/query-service/constants/constants.go b/pkg/query-service/constants/constants.go index 07aae5112c88..5bb72805ac3e 100644 --- a/pkg/query-service/constants/constants.go +++ b/pkg/query-service/constants/constants.go @@ -444,8 +444,53 @@ var NewStaticFieldsTraces = map[string]v3.AttributeKey{ DataType: v3.AttributeKeyDataTypeString, IsColumn: true, }, - // the simple attributes are not present here as - // they are taken care by new format __'' + + // 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{ @@ -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 IsDotMetricsEnabled = false