Browse Source

feat(trace): Try the optimization only on transactions (#69922)

- Only get the min/max timestamps for the transaction query, the slowest
of the 3 queries in query_trace_data
- This way the query for min/max should be faster too
- Option to turn this on:
https://github.com/getsentry/sentry-options-automator/pull/1261
William Mak 10 months ago
parent
commit
b8149dd02e
1 changed files with 20 additions and 12 deletions
  1. 20 12
      src/sentry/api/endpoints/organization_events_trace.py

+ 20 - 12
src/sentry/api/endpoints/organization_events_trace.py

@@ -472,14 +472,16 @@ def count_performance_issues(trace_id: str, params: Mapping[str, str]) -> int:
 
 
 @sentry_sdk.tracing.trace
-def update_params_with_trace_timestamp_projects(
+def create_transaction_params(
     trace_id: str,
     params: Mapping[str, str],
-) -> None:
+) -> Mapping[str, str]:
+    """Can't use the transaction params for errors since traces can be errors only"""
+    transaction_params = params.copy()
     query_metadata = options.get("performance.traces.query_timestamp_projects")
     sentry_sdk.set_tag("trace_view.queried_timestamp_projects", query_metadata)
     if not query_metadata:
-        return
+        return transaction_params
 
     metadata_query = QueryBuilder(
         Dataset.Discover,
@@ -519,17 +521,22 @@ def update_params_with_trace_timestamp_projects(
     # Reusing this option for now
     time_buffer = options.get("performance.traces.span_query_timebuffer_hours")
     if min_timestamp:
-        params["start"] = min_timestamp - timedelta(hours=time_buffer)
+        transaction_params["start"] = min_timestamp - timedelta(hours=time_buffer)
     if max_timestamp:
-        params["end"] = max_timestamp + timedelta(hours=time_buffer)
-    params["project_objects"] = [p for p in params["project_objects"] if p.id in project_ids]
-    params["project_id"] = project_ids
+        transaction_params["end"] = max_timestamp + timedelta(hours=time_buffer)
+    transaction_params["project_objects"] = [
+        p for p in transaction_params["project_objects"] if p.id in project_ids
+    ]
+    transaction_params["project_id"] = project_ids
+
+    return transaction_params
 
 
 @sentry_sdk.tracing.trace
 def query_trace_data(
     trace_id: str,
     params: Mapping[str, str],
+    transaction_params: Mapping[str, str],
     limit: int,
     event_id: str | None,
     use_spans: bool,
@@ -567,7 +574,7 @@ def query_trace_data(
         )
     transaction_query = QueryBuilder(
         Dataset.Transactions,
-        params,
+        transaction_params,
         query=f"trace:{trace_id}",
         selected_columns=transaction_columns,
         orderby=transaction_orderby,
@@ -981,17 +988,19 @@ class OrganizationEventsTraceEndpointBase(OrganizationEventsV2EndpointBase):
             actor=request.user,
         )
         with handle_query_errors():
-            update_params_with_trace_timestamp_projects(trace_id, params)
+            transaction_params = create_transaction_params(trace_id, params)
 
             if use_spans:
                 transactions, errors = query_trace_data(
-                    trace_id, params, limit, event_id, use_spans
+                    trace_id, params, transaction_params, limit, event_id, use_spans
                 )
                 transactions = augment_transactions_with_spans(
                     transactions, errors, trace_id, params
                 )
             else:
-                transactions, errors = query_trace_data(trace_id, params, limit, None, False)
+                transactions, errors = query_trace_data(
+                    trace_id, params, transaction_params, limit, None, False
+                )
             if len(transactions) == 0 and not tracing_without_performance_enabled:
                 return Response(status=404)
             self.record_analytics(transactions, trace_id, self.request.user.id, organization.id)
@@ -1568,7 +1577,6 @@ class OrganizationEventsTraceMetaEndpoint(OrganizationEventsTraceEndpointBase):
         update_snuba_params_with_timestamp(request, params)
 
         with handle_query_errors():
-            update_params_with_trace_timestamp_projects(trace_id, params)
             result = discover.query(
                 selected_columns=[
                     "count_unique(project_id) as projects",