Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/sentry/api/endpoints/organization_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from sentry.models.dashboard_widget import DashboardWidget, DashboardWidgetTypes
from sentry.models.organization import Organization
from sentry.ratelimits.config import RateLimitConfig
from sentry.search.eap.types import FieldsACL, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, FieldsACL, SearchResolverConfig
from sentry.snuba import (
discover,
errors,
Expand Down Expand Up @@ -498,6 +498,11 @@ def paginator_factory(scoped_dataset):
scoped_query = request.GET.get("query")
dashboard_widget_id = request.GET.get("dashboardWidgetId", None)
discover_saved_query_id = request.GET.get("discoverSavedQueryId", None)
additional_queries = AdditionalQueries(
span=request.GET.getlist("spanQueries"),
log=request.GET.getlist("logQueries"),
metric=request.GET.getlist("metricQueries"),
)

def get_rpc_config():
if scoped_dataset not in RPC_DATASETS:
Expand Down Expand Up @@ -548,6 +553,7 @@ def flex_time_data_fn(limit, page_token):
config=config,
sampling_mode=snuba_params.sampling_mode,
page_token=page_token,
additional_queries=additional_queries,
)

return EAPPageTokenPaginator(data_fn=flex_time_data_fn), EAPPageTokenCursor
Expand All @@ -567,6 +573,7 @@ def data_fn(offset, limit):
referrer=referrer,
config=config,
sampling_mode=snuba_params.sampling_mode,
additional_queries=additional_queries,
)

if save_discover_dataset_decision and discover_saved_query_id:
Expand Down
7 changes: 7 additions & 0 deletions src/sentry/search/eap/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,10 @@ class TraceItemAttribute(TypedDict):
class EAPResponse(EventsResponse):
confidence: ConfidenceData
page_token: NotRequired[PageToken]


@dataclass()
class AdditionalQueries:
span: list[str] | None
log: list[str] | None
metric: list[str] | None
4 changes: 3 additions & 1 deletion src/sentry/snuba/ourlogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from sentry.search.eap.ourlogs.definitions import OURLOG_DEFINITIONS
from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.sampling import handle_downsample_meta
from sentry.search.eap.types import EAPResponse, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, EAPResponse, SearchResolverConfig
from sentry.search.events.types import SAMPLING_MODES, EventsMeta, SnubaParams
from sentry.snuba import rpc_dataset_common
from sentry.snuba.discover import zerofill
Expand Down Expand Up @@ -39,6 +39,7 @@ def run_table_query(
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
debug: bool = False,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
"""timestamp_precise is always displayed in the UI in lieu of timestamp but since the TraceItem table isn't a DateTime64
so we need to always order by it regardless of what is actually passed to the orderby.
Expand Down Expand Up @@ -76,6 +77,7 @@ def run_table_query(
config=config,
),
page_token=page_token,
additional_queries=additional_queries,
),
debug=debug,
)
Expand Down
68 changes: 65 additions & 3 deletions src/sentry/snuba/rpc_dataset_common.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
import math
from collections import defaultdict
from dataclasses import dataclass, field
from dataclasses import dataclass, field, replace
from datetime import datetime, timedelta
from typing import Any

Expand All @@ -18,7 +18,12 @@
TraceItemTableRequest,
TraceItemTableResponse,
)
from sentry_protos.snuba.v1.request_common_pb2 import PageToken, ResponseMeta
from sentry_protos.snuba.v1.request_common_pb2 import (
PageToken,
ResponseMeta,
TraceItemFilterWithType,
TraceItemType,
)
from sentry_protos.snuba.v1.trace_item_attribute_pb2 import AttributeKey, AttributeValue, Function
from sentry_protos.snuba.v1.trace_item_filter_pb2 import (
AndFilter,
Expand All @@ -43,7 +48,13 @@
from sentry.search.eap.constants import DOUBLE, MAX_ROLLUP_POINTS, VALID_GRANULARITIES
from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.sampling import handle_downsample_meta
from sentry.search.eap.types import CONFIDENCES, ConfidenceData, EAPResponse, SearchResolverConfig
from sentry.search.eap.types import (
CONFIDENCES,
AdditionalQueries,
ConfidenceData,
EAPResponse,
SearchResolverConfig,
)
from sentry.search.events.fields import get_function_alias, is_function
from sentry.search.events.types import SAMPLING_MODES, EventsMeta, SnubaData, SnubaParams
from sentry.snuba.discover import OTHER_KEY, create_groupby_dict, create_result_key
Expand Down Expand Up @@ -74,6 +85,7 @@ class TableQuery:
equations: list[str] | None = None
name: str | None = None
page_token: PageToken | None = None
additional_queries: AdditionalQueries | None = None


@dataclass
Expand Down Expand Up @@ -138,6 +150,52 @@ def categorize_aggregate(
else:
raise Exception(f"Unknown column type {type(column)}")

@classmethod
def get_cross_trace_queries(cls, query: TableQuery) -> list[TraceItemFilterWithType]:
from sentry.search.eap.ourlogs.definitions import OURLOG_DEFINITIONS
from sentry.search.eap.spans.definitions import SPAN_DEFINITIONS
from sentry.search.eap.trace_metrics.definitions import TRACE_METRICS_DEFINITIONS

if query.additional_queries is None:
return []

# resolve cross trace queries
# Copy the existing resolver, but we don't allow aggregate conditions for cross trace filters
cross_trace_config = replace(query.resolver.config, use_aggregate_conditions=False)

cross_trace_queries = []
for queries, definitions, item_type in [
(
query.additional_queries.log,
OURLOG_DEFINITIONS,
TraceItemType.TRACE_ITEM_TYPE_LOG,
),
(query.additional_queries.span, SPAN_DEFINITIONS, TraceItemType.TRACE_ITEM_TYPE_SPAN),
(
query.additional_queries.metric,
TRACE_METRICS_DEFINITIONS,
TraceItemType.TRACE_ITEM_TYPE_METRIC,
),
]:
if queries is not None:
# Create a resolver for the subqueries
cross_resolver = SearchResolver(
params=query.resolver.params,
config=cross_trace_config,
definitions=definitions,
)
for query_string in queries:
# Having and VCCs aren't relevant from these queries
cross_query_where, _, _ = cross_resolver.resolve_query(query_string)
if cross_query_where is not None:
cross_trace_queries.append(
TraceItemFilterWithType(
filter=cross_query_where,
item_type=item_type,
)
)
return cross_trace_queries

""" Table Methods """

@classmethod
Expand All @@ -148,6 +206,8 @@ def get_table_rpc_request(cls, query: TableQuery) -> TableRequest:
meta = resolver.resolve_meta(referrer=query.referrer, sampling_mode=query.sampling_mode)
where, having, query_contexts = resolver.resolve_query(query.query_string)

cross_trace_queries = cls.get_cross_trace_queries(query)

trace_column, _ = resolver.resolve_column("trace")
if isinstance(trace_column, ResolvedAttribute) and has_top_level_trace_condition(
where, trace_column
Expand Down Expand Up @@ -223,6 +283,7 @@ def get_table_rpc_request(cls, query: TableQuery) -> TableRequest:
limit=query.limit,
page_token=page_token,
virtual_column_contexts=[context for context in contexts if context is not None],
trace_filters=cross_trace_queries,
),
all_columns,
)
Expand Down Expand Up @@ -260,6 +321,7 @@ def run_table_query(
equations: list[str] | None = None,
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
raise NotImplementedError()

Expand Down
4 changes: 3 additions & 1 deletion src/sentry/snuba/spans_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.sampling import handle_downsample_meta
from sentry.search.eap.spans.definitions import SPAN_DEFINITIONS
from sentry.search.eap.types import EAPResponse, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, EAPResponse, SearchResolverConfig
from sentry.search.events.types import SAMPLING_MODES, EventsMeta, SnubaParams
from sentry.snuba import rpc_dataset_common
from sentry.snuba.discover import zerofill
Expand Down Expand Up @@ -42,6 +42,7 @@ def run_table_query(
equations: list[str] | None = None,
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
return cls._run_table_query(
rpc_dataset_common.TableQuery(
Expand All @@ -55,6 +56,7 @@ def run_table_query(
sampling_mode=sampling_mode,
page_token=page_token,
resolver=search_resolver or cls.get_resolver(params, config),
additional_queries=additional_queries,
),
params.debug,
)
Expand Down
4 changes: 3 additions & 1 deletion src/sentry/snuba/trace_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.sampling import handle_downsample_meta
from sentry.search.eap.trace_metrics.definitions import TRACE_METRICS_DEFINITIONS
from sentry.search.eap.types import EAPResponse, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, EAPResponse, SearchResolverConfig
from sentry.search.events.types import SAMPLING_MODES, EventsMeta, SnubaParams
from sentry.snuba import rpc_dataset_common
from sentry.snuba.discover import zerofill
Expand Down Expand Up @@ -40,6 +40,7 @@ def run_table_query(
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
debug: bool = False,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
"""timestamp_precise is always displayed in the UI in lieu of timestamp but since the TraceItem table isn't a DateTime64
so we need to always order by it regardless of what is actually passed to the orderby."""
Expand Down Expand Up @@ -68,6 +69,7 @@ def run_table_query(
config=config,
),
page_token=page_token,
additional_queries=additional_queries,
),
debug=debug,
)
Expand Down
3 changes: 2 additions & 1 deletion src/sentry/snuba/uptime_checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sentry_protos.snuba.v1.request_common_pb2 import PageToken

from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.types import EAPResponse, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, EAPResponse, SearchResolverConfig
from sentry.search.eap.uptime_checks.definitions import UPTIME_CHECK_DEFINITIONS
from sentry.search.events.types import SAMPLING_MODES, SnubaParams
from sentry.snuba import rpc_dataset_common
Expand Down Expand Up @@ -33,6 +33,7 @@ def run_table_query(
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
debug: bool = False,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
return cls._run_table_query(
rpc_dataset_common.TableQuery(
Expand Down
3 changes: 2 additions & 1 deletion src/sentry/snuba/uptime_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from sentry_protos.snuba.v1.request_common_pb2 import PageToken

from sentry.search.eap.resolver import SearchResolver
from sentry.search.eap.types import EAPResponse, SearchResolverConfig
from sentry.search.eap.types import AdditionalQueries, EAPResponse, SearchResolverConfig
from sentry.search.eap.uptime_results.definitions import UPTIME_RESULT_DEFINITIONS
from sentry.search.events.types import SAMPLING_MODES, SnubaParams
from sentry.snuba import rpc_dataset_common
Expand Down Expand Up @@ -33,6 +33,7 @@ def run_table_query(
search_resolver: SearchResolver | None = None,
page_token: PageToken | None = None,
debug: bool = False,
additional_queries: AdditionalQueries | None = None,
) -> EAPResponse:
return cls._run_table_query(
rpc_dataset_common.TableQuery(
Expand Down
Loading
Loading