Skip to content
Open
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
33 changes: 33 additions & 0 deletions tests/trace/test_client_trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -4704,6 +4704,39 @@ def parent_op():
assert result.total_storage_size_bytes is not None


def test_calls_query_stats_thread_ids_filter_not_minimal(client):
"""Ensure that we do not optimize away the thread_ids filter when it is present."""
client.set_wandb_run_context(run_id="stats-thread-run", step=0)

@weave.op
def stats_thread_op() -> int:
return 1

# Create calls in one thread (so project has calls with wb_run_id; optimized path would return 1)
with weave.thread("thread_with_calls"):
stats_thread_op()
stats_thread_op()

# Query a different thread that has zero calls. Full path -> 0. Buggy optimized path -> 1.
thread_id_with_no_calls = "thread_with_zero_calls_xyz"
wb_run_id_not_null_query = tsi.Query(
**{
"$expr": {
"$not": [{"$eq": [{"$getField": "wb_run_id"}, {"$literal": None}]}]
}
}
)
res = client.server.calls_query_stats(
tsi.CallsQueryStatsReq(
project_id=get_client_project_id(client),
limit=1,
query=wb_run_id_not_null_query,
filter=tsi.CallsFilter(thread_ids=[thread_id_with_no_calls]),
)
)
assert res.count == 0


def test_calls_query_stats_total_storage_size_clickhouse(client, clickhouse_client):
"""Test querying calls with total storage size."""
if client_is_sqlite(client):
Expand Down
32 changes: 32 additions & 0 deletions tests/trace_server/query_builder/test_calls_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
AggregatedDataSizeField,
CallsQuery,
HardCodedFilter,
_is_minimal_filter,
build_calls_complete_delete_query,
build_calls_complete_update_end_query,
build_calls_complete_update_query,
Expand Down Expand Up @@ -3165,3 +3166,34 @@ def test_query_with_queue_filter_calls_complete() -> None:
"pb_1": "project",
},
)


# -----------------------------------------------------------------------------
# _is_minimal_filter()
# -----------------------------------------------------------------------------


def test_is_minimal_filter_none() -> None:
assert _is_minimal_filter(None) is True


def test_is_minimal_filter_empty() -> None:
assert _is_minimal_filter(tsi.CallsFilter()) is True


def test_is_minimal_filter_thread_ids_not_minimal() -> None:
"""Filter with thread_ids set must not be considered minimal (optimized path must not apply)."""
assert _is_minimal_filter(tsi.CallsFilter(thread_ids=["thread_1"])) is False


def test_is_minimal_filter_turn_ids_not_minimal() -> None:
assert _is_minimal_filter(tsi.CallsFilter(turn_ids=["turn_1"])) is False


def test_is_minimal_filter_wb_user_ids_not_minimal() -> None:
assert _is_minimal_filter(tsi.CallsFilter(wb_user_ids=["user_1"])) is False


def test_is_minimal_filter_empty_thread_ids_still_minimal() -> None:
"""Empty thread_ids list is treated as unset."""
assert _is_minimal_filter(tsi.CallsFilter(thread_ids=[])) is True
Original file line number Diff line number Diff line change
Expand Up @@ -2357,13 +2357,16 @@ def _is_minimal_filter(filter: tsi.CallsFilter | None) -> bool:
return True
return (
filter.wb_run_ids is None
and filter.wb_user_ids is None
and filter.op_names is None
and filter.call_ids is None
and filter.trace_ids is None
and filter.parent_ids is None
and filter.trace_roots_only is None
and filter.input_refs is None
and filter.output_refs is None
and (filter.thread_ids is None or len(filter.thread_ids) == 0)
and (filter.turn_ids is None or len(filter.turn_ids) == 0)
)


Expand Down