Просмотр исходного кода

ref(querybuilder): Add snuba_params to all the snuba query modules (#74780)

- This updates all the snuba query modules so they can take the
  snuba_params instead of params
- Should also allow params={} since we can infer it from the
  snuba_params
William Mak 7 месяцев назад
Родитель
Сommit
6148f9762d

+ 5 - 5
src/sentry/api/endpoints/organization_events_histogram.py

@@ -79,11 +79,11 @@ class OrganizationEventsHistogramEndpoint(OrganizationEventsV2EndpointBase):
 
                 with handle_query_errors():
                     results = dataset.histogram_query(
-                        data["field"],
-                        data.get("query"),
-                        params,
-                        data["numBuckets"],
-                        data["precision"],
+                        fields=data["field"],
+                        user_query=data.get("query"),
+                        params=params,
+                        num_buckets=data["numBuckets"],
+                        precision=data["precision"],
                         min_value=data.get("min"),
                         max_value=data.get("max"),
                         data_filter=data.get("dataFilter"),

+ 3 - 1
src/sentry/search/events/builder/issue_platform.py

@@ -1,6 +1,6 @@
 from sentry.issues.query import manual_group_on_time_aggregation
 from sentry.search.events.builder.discover import TimeseriesQueryBuilder
-from sentry.search.events.types import ParamsType, QueryBuilderConfig, SelectType
+from sentry.search.events.types import ParamsType, QueryBuilderConfig, SelectType, SnubaParams
 from sentry.snuba.dataset import Dataset
 
 
@@ -12,6 +12,7 @@ class IssuePlatformTimeseriesQueryBuilder(TimeseriesQueryBuilder):
         dataset: Dataset,
         params: ParamsType,
         interval: int,
+        snuba_params: SnubaParams | None = None,
         query: str | None = None,
         selected_columns: list[str] | None = None,
         equations: list[str] | None = None,
@@ -22,6 +23,7 @@ class IssuePlatformTimeseriesQueryBuilder(TimeseriesQueryBuilder):
             dataset,
             params,
             interval,
+            snuba_params=snuba_params,
             query=query,
             selected_columns=selected_columns,
             equations=equations,

+ 5 - 0
src/sentry/search/events/builder/metrics.py

@@ -52,6 +52,7 @@ from sentry.search.events.types import (
     QueryBuilderConfig,
     QueryFramework,
     SelectType,
+    SnubaParams,
     WhereType,
 )
 from sentry.sentry_metrics import indexer
@@ -1552,6 +1553,7 @@ class TimeseriesMetricQueryBuilder(MetricsQueryBuilder):
         self,
         params: ParamsType,
         interval: int,
+        snuba_params: SnubaParams | None = None,
         dataset: Dataset | None = None,
         query: str | None = None,
         selected_columns: list[str] | None = None,
@@ -1564,6 +1566,7 @@ class TimeseriesMetricQueryBuilder(MetricsQueryBuilder):
         config.auto_fields = False
         super().__init__(
             params=params,
+            snuba_params=snuba_params,
             query=query,
             dataset=dataset,
             selected_columns=selected_columns,
@@ -1837,6 +1840,7 @@ class TopMetricsQueryBuilder(TimeseriesMetricQueryBuilder):
         params: ParamsType,
         interval: int,
         top_events: list[dict[str, Any]],
+        snuba_params: SnubaParams | None = None,
         other: bool = False,
         query: str | None = None,
         selected_columns: list[str] | None = None,
@@ -1851,6 +1855,7 @@ class TopMetricsQueryBuilder(TimeseriesMetricQueryBuilder):
         super().__init__(
             dataset=dataset,
             params=params,
+            snuba_params=snuba_params,
             interval=interval,
             query=query,
             selected_columns=list(set(selected_columns + timeseries_columns)),

+ 25 - 0
src/sentry/snuba/discover.py

@@ -242,6 +242,9 @@ def query(
     if not selected_columns:
         raise InvalidSearchQuery("No columns selected")
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     assert dataset in [
         Dataset.Discover,
         Dataset.Transactions,
@@ -284,6 +287,7 @@ def timeseries_query(
     query: str,
     params: ParamsType,
     rollup: int,
+    snuba_params: SnubaParams | None = None,
     referrer: str | None = None,
     zerofill_results: bool = True,
     comparison_delta: timedelta | None = None,
@@ -322,6 +326,10 @@ def timeseries_query(
         Dataset.Discover,
         Dataset.Transactions,
     ], "A dataset is required to query discover"
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if (
         "start" not in params
         or params["start"] is None
@@ -451,6 +459,7 @@ def top_events_timeseries(
     rollup: int,
     limit: int,
     organization: Organization,
+    snuba_params: SnubaParams | None = None,
     equations: list[str] | None = None,
     referrer: str | None = None,
     top_events: EventsResponse | None = None,
@@ -488,6 +497,10 @@ def top_events_timeseries(
         Dataset.Discover,
         Dataset.Transactions,
     ], "A dataset is required to query discover"
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if top_events is None:
         with sentry_sdk.start_span(op="discover.discover", description="top_events.fetch_events"):
             top_events = query(
@@ -613,6 +626,7 @@ def get_facets(
     query: str,
     params: ParamsType,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     per_page: int | None = TOP_KEYS_DEFAULT_LIMIT,
     cursor: int | None = 0,
 ) -> list[FacetResult]:
@@ -632,6 +646,9 @@ def get_facets(
     sample = len(params["project_id"]) > 2
     fetch_projects = len(params["project_id"]) > 1
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     with sentry_sdk.start_span(op="discover.discover", description="facets.frequent_tags"):
         key_name_builder = DiscoverQueryBuilder(
             Dataset.Discover,
@@ -775,6 +792,7 @@ def spans_histogram_query(
     user_query: str,
     params: ParamsType,
     num_buckets: int,
+    snuba_params: SnubaParams | None = None,
     precision: int = 0,
     min_value: float | None = None,
     max_value: float | None = None,
@@ -814,6 +832,9 @@ def spans_histogram_query(
         # to be inclusive. So we adjust the specified max_value using the multiplier.
         max_value -= 0.1 / multiplier
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     min_value, max_value = find_span_histogram_min_max(
         span, min_value, max_value, user_query, params, data_filter
     )
@@ -863,6 +884,7 @@ def histogram_query(
     params: ParamsType,
     num_buckets: int,
     precision: int = 0,
+    snuba_params: SnubaParams | None = None,
     min_value: float | None = None,
     max_value: float | None = None,
     data_filter: Literal["exclude_outliers"] | None = None,
@@ -903,6 +925,9 @@ def histogram_query(
     :param normalize_results: Indicate whether to normalize the results by column into bins.
     """
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     multiplier = int(10**precision)
     if max_value is not None:
         # We want the specified max_value to be exclusive, and the queried max_value

+ 7 - 1
src/sentry/snuba/errors.py

@@ -92,8 +92,9 @@ def query(
 def timeseries_query(
     selected_columns: Sequence[str],
     query: str,
-    params: dict[str, str],
+    params: ParamsType,
     rollup: int,
+    snuba_params: SnubaParams | None = None,
     referrer: str | None = None,
     zerofill_results: bool = True,
     comparison_delta: timedelta | None = None,
@@ -104,12 +105,17 @@ def timeseries_query(
     on_demand_metrics_enabled=False,
     on_demand_metrics_type: MetricSpecType | None = None,
 ):
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     with sentry_sdk.start_span(op="errors", description="timeseries.filter_transform"):
         equations, columns = categorize_columns(selected_columns)
         base_builder = ErrorsTimeseriesQueryBuilder(
             Dataset.Events,
             params,
             rollup,
+            snuba_params=snuba_params,
             query=query,
             selected_columns=columns,
             equations=equations,

+ 7 - 0
src/sentry/snuba/functions.py

@@ -78,6 +78,7 @@ def timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str = "",
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     comparison_delta: datetime | None = None,
     functions_acl: list[str] | None = None,
@@ -87,9 +88,14 @@ def timeseries_query(
     on_demand_metrics_enabled: bool = False,
     on_demand_metrics_type: MetricSpecType | None = None,
 ) -> Any:
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     builder = ProfileFunctionsTimeseriesQueryBuilder(
         dataset=Dataset.Functions,
         params=params,
+        snuba_params=snuba_params,
         query=query,
         interval=rollup,
         selected_columns=selected_columns,
@@ -210,6 +216,7 @@ def format_top_events_timeseries_results(
 ):
     if top_events is None:
         assert top_events, "Need to provide top events"  # TODO: support this use case
+
     if snuba_params is not None and len(params) == 0:
         # Compatibility so its easier to convert to SnubaParams
         params = snuba_params.filter_params

+ 7 - 1
src/sentry/snuba/issue_platform.py

@@ -9,7 +9,7 @@ from sentry.exceptions import InvalidSearchQuery
 from sentry.search.events.builder.discover import DiscoverQueryBuilder
 from sentry.search.events.builder.issue_platform import IssuePlatformTimeseriesQueryBuilder
 from sentry.search.events.fields import get_json_meta_type
-from sentry.search.events.types import EventsResponse, QueryBuilderConfig
+from sentry.search.events.types import EventsResponse, QueryBuilderConfig, SnubaParams
 from sentry.snuba.dataset import Dataset
 from sentry.snuba.discover import transform_tips, zerofill
 from sentry.snuba.metrics.extraction import MetricSpecType
@@ -110,6 +110,7 @@ def timeseries_query(
     query: str,
     params: dict[str, str],
     rollup: int,
+    snuba_params: SnubaParams | None = None,
     referrer: str | None = None,
     zerofill_results: bool = True,
     comparison_delta: timedelta | None = None,
@@ -143,12 +144,17 @@ def timeseries_query(
     time bucket. Requires that we only pass
     allow_metric_aggregates (bool) Ignored here, only used in metric enhanced performance
     """
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     with sentry_sdk.start_span(op="issueplatform", description="timeseries.filter_transform"):
         equations, columns = categorize_columns(selected_columns)
         base_builder = IssuePlatformTimeseriesQueryBuilder(
             Dataset.IssuePlatform,
             params,
             rollup,
+            snuba_params=snuba_params,
             query=query,
             selected_columns=columns,
             equations=equations,

+ 51 - 30
src/sentry/snuba/metrics_enhanced_performance.py

@@ -6,11 +6,12 @@ from datetime import timedelta
 from typing import Any
 
 import sentry_sdk
+from snuba_sdk import Column, Condition
 
 from sentry.discover.arithmetic import categorize_columns
 from sentry.exceptions import IncompatibleMetricsQuery, InvalidSearchQuery
 from sentry.models.organization import Organization
-from sentry.search.events.types import EventsResponse, ParamsType
+from sentry.search.events.types import EventsResponse, ParamsType, SnubaParams
 from sentry.snuba import discover, transactions
 from sentry.snuba.metrics.extraction import MetricSpecType
 from sentry.snuba.metrics_performance import histogram_query as metrics_histogram_query
@@ -21,27 +22,31 @@ from sentry.utils.snuba import SnubaTSResult
 
 
 def query(
-    selected_columns,
-    query,
-    params,
-    snuba_params=None,
-    equations=None,
-    orderby=None,
-    offset=None,
-    limit=50,
-    referrer=None,
-    auto_fields=False,
-    auto_aggregations=False,
-    use_aggregate_conditions=False,
-    allow_metric_aggregates=True,
-    conditions=None,
-    functions_acl=None,
-    transform_alias_to_input_format=False,
-    has_metrics: bool = True,
+    selected_columns: list[str],
+    query: str,
+    params: ParamsType,
+    snuba_params: SnubaParams | None = None,
+    equations: list[str] | None = None,
+    orderby: list[str] | None = None,
+    offset: int | None = None,
+    limit: int = 50,
+    referrer: str | None = None,
+    auto_fields: bool = False,
+    auto_aggregations: bool = False,
+    include_equation_fields: bool = False,
+    allow_metric_aggregates: bool = False,
+    use_aggregate_conditions: bool = False,
+    conditions: list[Condition] | None = None,
+    functions_acl: list[str] | None = None,
+    transform_alias_to_input_format: bool = False,
+    sample: float | None = None,
+    has_metrics: bool = False,
     use_metrics_layer: bool = False,
+    skip_tag_resolution: bool = False,
+    extra_columns: list[Column] | None = None,
     on_demand_metrics_enabled: bool = False,
-    on_demand_metrics_type=None,
-    fallback_to_transactions=False,
+    on_demand_metrics_type: MetricSpecType | None = None,
+    fallback_to_transactions: bool = False,
 ):
     metrics_compatible = not equations
     dataset_reason = discover.DEFAULT_DATASET_REASON
@@ -94,6 +99,7 @@ def query(
             selected_columns,
             query,
             params,
+            snuba_params=snuba_params,
             equations=equations,
             orderby=orderby,
             offset=offset,
@@ -122,6 +128,7 @@ def timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     allow_metric_aggregates=True,
     comparison_delta: timedelta | None = None,
@@ -138,6 +145,9 @@ def timeseries_query(
     equations, columns = categorize_columns(selected_columns)
     metrics_compatible = not equations
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if metrics_compatible:
         try:
             return metrics_timeseries_query(
@@ -145,11 +155,12 @@ def timeseries_query(
                 query,
                 params,
                 rollup,
-                referrer,
-                zerofill_results,
-                allow_metric_aggregates,
-                comparison_delta,
-                functions_acl,
+                snuba_params=snuba_params,
+                referrer=referrer,
+                zerofill_results=zerofill_results,
+                allow_metric_aggregates=allow_metric_aggregates,
+                comparison_delta=comparison_delta,
+                functions_acl=functions_acl,
                 use_metrics_layer=use_metrics_layer,
                 on_demand_metrics_enabled=on_demand_metrics_enabled,
                 on_demand_metrics_type=on_demand_metrics_type,
@@ -169,11 +180,12 @@ def timeseries_query(
             selected_columns,
             query,
             params,
-            rollup,
-            referrer,
-            zerofill_results,
-            comparison_delta,
-            functions_acl,
+            snuba_params=snuba_params,
+            rollup=rollup,
+            referrer=referrer,
+            zerofill_results=zerofill_results,
+            comparison_delta=comparison_delta,
+            functions_acl=functions_acl,
             has_metrics=has_metrics,
         )
     return SnubaTSResult(
@@ -197,6 +209,7 @@ def top_events_timeseries(
     rollup: int,
     limit: int,
     organization: Organization,
+    snuba_params: SnubaParams | None = None,
     equations: list[str] | None = None,
     referrer: str | None = None,
     top_events: EventsResponse | None = None,
@@ -212,6 +225,9 @@ def top_events_timeseries(
     if not equations:
         metrics_compatible = True
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if metrics_compatible:
         try:
             return metrics_top_events_timeseries(
@@ -223,6 +239,7 @@ def top_events_timeseries(
                 rollup,
                 limit,
                 organization,
+                snuba_params,
                 equations,
                 referrer,
                 top_events,
@@ -253,6 +270,7 @@ def top_events_timeseries(
             rollup,
             limit,
             organization,
+            snuba_params,
             equations,
             referrer,
             top_events,
@@ -278,6 +296,7 @@ def histogram_query(
     user_query,
     params,
     num_buckets,
+    snuba_params=None,
     precision=0,
     min_value=None,
     max_value=None,
@@ -306,6 +325,7 @@ def histogram_query(
                 user_query,
                 params,
                 num_buckets,
+                snuba_params,
                 precision,
                 min_value,
                 max_value,
@@ -335,6 +355,7 @@ def histogram_query(
             user_query,
             params,
             num_buckets,
+            snuba_params,
             precision,
             min_value,
             max_value,

+ 24 - 1
src/sentry/snuba/metrics_performance.py

@@ -17,7 +17,7 @@ from sentry.search.events.builder.metrics import (
     TopMetricsQueryBuilder,
 )
 from sentry.search.events.fields import get_function_alias
-from sentry.search.events.types import EventsResponse, ParamsType, QueryBuilderConfig
+from sentry.search.events.types import EventsResponse, ParamsType, QueryBuilderConfig, SnubaParams
 from sentry.snuba import discover
 from sentry.snuba.dataset import Dataset
 from sentry.snuba.metrics.extraction import MetricSpecType
@@ -95,6 +95,7 @@ def bulk_timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     allow_metric_aggregates=True,
     comparison_delta: timedelta | None = None,
@@ -117,6 +118,7 @@ def bulk_timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     allow_metric_aggregates=True,
     comparison_delta: timedelta | None = None,
@@ -136,6 +138,7 @@ def bulk_timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     allow_metric_aggregates=True,
     comparison_delta: timedelta | None = None,
@@ -157,6 +160,9 @@ def bulk_timeseries_query(
     if comparison_delta is None and not equations:
         metrics_compatible = True
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if metrics_compatible:
         with sentry_sdk.start_span(op="mep", description="TimeseriesMetricQueryBuilder"):
             metrics_queries = []
@@ -240,6 +246,7 @@ def timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str,
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     allow_metric_aggregates=True,
     comparison_delta: timedelta | None = None,
@@ -257,6 +264,9 @@ def timeseries_query(
     equations, columns = categorize_columns(selected_columns)
     metrics_compatible = not equations
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     def run_metrics_query(inner_params: ParamsType):
         with sentry_sdk.start_span(op="mep", description="TimeseriesMetricQueryBuilder"):
             metrics_query = TimeseriesMetricQueryBuilder(
@@ -384,6 +394,7 @@ def top_events_timeseries(
     rollup,
     limit,
     organization,
+    snuba_params=None,
     equations=None,
     referrer=None,
     top_events=None,
@@ -394,11 +405,16 @@ def top_events_timeseries(
     on_demand_metrics_enabled=False,
     on_demand_metrics_type: MetricSpecType | None = None,
 ) -> SnubaTSResult | dict[str, Any]:
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if top_events is None:
         top_events = query(
             selected_columns,
             query=user_query,
             params=params,
+            snuba_params=snuba_params,
             equations=equations,
             orderby=orderby,
             limit=limit,
@@ -414,6 +430,7 @@ def top_events_timeseries(
         params,
         rollup,
         top_events["data"],
+        snuba_params=snuba_params,
         other=False,
         query=user_query,
         selected_columns=selected_columns,
@@ -430,6 +447,7 @@ def top_events_timeseries(
             params,
             rollup,
             top_events["data"],
+            snuba_params=snuba_params,
             other=True,
             query=user_query,
             selected_columns=selected_columns,
@@ -514,6 +532,7 @@ def histogram_query(
     user_query,
     params,
     num_buckets,
+    snuba_params=None,
     precision=0,
     min_value=None,
     max_value=None,
@@ -553,6 +572,9 @@ def histogram_query(
     :param bool normalize_results: Indicate whether to normalize the results by column into bins.
     """
 
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     if data_filter == "exclude_outliers":
         if user_query is None:
             user_query = INLIER_QUERY_CLAUSE
@@ -578,6 +600,7 @@ def histogram_query(
         # Arguments for QueryBuilder
         dataset=Dataset.PerformanceMetrics,
         params=params,
+        snuba_params=snuba_params,
         query=user_query,
         selected_columns=[f"histogram({field})" for field in fields],
         orderby=order_by,

+ 6 - 0
src/sentry/snuba/profiles.py

@@ -67,6 +67,7 @@ def timeseries_query(
     params: ParamsType,
     rollup: int,
     referrer: str = "",
+    snuba_params: SnubaParams | None = None,
     zerofill_results: bool = True,
     comparison_delta: datetime | None = None,
     functions_acl: list[str] | None = None,
@@ -76,9 +77,14 @@ def timeseries_query(
     on_demand_metrics_enabled: bool = False,
     on_demand_metrics_type: MetricSpecType | None = None,
 ) -> Any:
+
+    if len(params) == 0 and snuba_params is not None:
+        params = snuba_params.filter_params
+
     builder = ProfilesTimeseriesQueryBuilder(
         dataset=Dataset.Profiles,
         params=params,
+        snuba_params=snuba_params,
         query=query,
         interval=rollup,
         selected_columns=selected_columns,

Некоторые файлы не были показаны из-за большого количества измененных файлов