From d63a3d5ab6039142f3f5840dc54921285d342ad3 Mon Sep 17 00:00:00 2001 From: Rohan Agarwal Date: Sat, 11 Oct 2025 09:30:46 -0700 Subject: [PATCH] Use correct query mode --- src/sentry/seer/explorer/tools.py | 9 ++-- tests/sentry/seer/explorer/test_tools.py | 52 ++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/sentry/seer/explorer/tools.py b/src/sentry/seer/explorer/tools.py index 72b7ef87ed0add..1d2143e3b12b62 100644 --- a/src/sentry/seer/explorer/tools.py +++ b/src/sentry/seer/explorer/tools.py @@ -1,5 +1,5 @@ import logging -from typing import Any +from typing import Any, Literal from sentry.api import client from sentry.models.apikey import ApiKey @@ -75,6 +75,7 @@ def execute_trace_query_table( group_by: list[str] | None = None, y_axes: list[str] | None = None, per_page: int = 50, + mode: Literal["spans", "aggregates"] = "spans", ) -> dict[str, Any] | None: """ Execute a trace query to get table data by calling the events endpoint. @@ -92,9 +93,11 @@ def execute_trace_query_table( return None # Determine fields based on mode - if group_by and len(group_by) > 0: + if mode == "aggregates": # Aggregates mode: group_by fields + aggregate functions - fields = list(group_by) + fields = [] + if group_by: + fields.extend(group_by) if y_axes: fields.extend(y_axes) else: diff --git a/tests/sentry/seer/explorer/test_tools.py b/tests/sentry/seer/explorer/test_tools.py index cae0c8530fe4da..7aedf59d656b27 100644 --- a/tests/sentry/seer/explorer/test_tools.py +++ b/tests/sentry/seer/explorer/test_tools.py @@ -273,6 +273,7 @@ def test_execute_trace_query_table_with_groupby(self): group_by=["span.op"], y_axes=["count()"], per_page=10, + mode="aggregates", ) assert result is not None @@ -288,6 +289,57 @@ def test_execute_trace_query_table_with_groupby(self): assert "span.op" in row assert "count()" in row + def test_execute_trace_query_table_aggregates_mode_basic(self): + """Test table query in aggregates mode without group_by""" + result = execute_trace_query_table( + org_id=self.organization.id, + query="", + stats_period="1h", + sort="-count()", + y_axes=["count()", "avg(span.duration)"], + per_page=10, + mode="aggregates", + ) + + assert result is not None + assert "data" in result + assert "meta" in result + + rows = result["data"] + # Should have aggregate results + assert len(rows) > 0 + + # Each row should have the aggregate functions + for row in rows: + assert "count()" in row + assert "avg(span.duration)" in row + + def test_execute_trace_query_table_aggregates_mode_multiple_functions(self): + """Test table query in aggregates mode with multiple aggregate functions""" + result = execute_trace_query_table( + org_id=self.organization.id, + query="span.op:db", # Filter to only database operations + stats_period="1h", + sort="-sum(span.duration)", + y_axes=["count()", "sum(span.duration)", "avg(span.duration)"], + per_page=10, + mode="aggregates", + ) + + assert result is not None + assert "data" in result + assert "meta" in result + + rows = result["data"] + # Should have aggregate results for database spans + assert len(rows) > 0 + + # Each row should have all the aggregate functions + for row in rows: + assert "count()" in row + assert "sum(span.duration)" in row + assert "avg(span.duration)" in row + def test_get_organization_project_ids(self): """Test the get_organization_project_ids RPC method""" from sentry.seer.endpoints.seer_rpc import get_organization_project_ids