11import logging
22
3+ from rest_framework import serializers
34from rest_framework .request import Request
45from rest_framework .response import Response
56
67from sentry .api .api_owners import ApiOwner
78from sentry .api .api_publish_status import ApiPublishStatus
89from sentry .api .base import region_silo_endpoint
910from sentry .api .bases import NoProjects , OrganizationEventsV2EndpointBase
10- from sentry .exceptions import InvalidSearchQuery
1111from sentry .models .organization import Organization
1212from sentry .search .eap .constants import SUPPORTED_STATS_TYPES
1313from sentry .search .eap .resolver import SearchResolver
1919logger = logging .getLogger (__name__ )
2020
2121
22+ class OrganizationTraceItemsStatsSerializer (serializers .Serializer ):
23+ query = serializers .CharField (required = False )
24+ statsType = serializers .ListField (
25+ child = serializers .ChoiceField (SUPPORTED_STATS_TYPES ), required = True
26+ )
27+
28+
2229@region_silo_endpoint
2330class OrganizationTraceItemsStatsEndpoint (OrganizationEventsV2EndpointBase ):
2431 publish_status = {
@@ -32,28 +39,20 @@ def get(self, request: Request, organization: Organization) -> Response:
3239 except NoProjects :
3340 return Response ({"data" : []})
3441
35- stats_types = set (request .GET .getlist ("statsType" , default = ["attributeDistributions" ]))
36- if not stats_types :
37- raise InvalidSearchQuery (
38- f"Please specify `statsType`. Supported stats types are: { SUPPORTED_STATS_TYPES } ."
39- )
40-
41- for stats_type in stats_types :
42- if stats_type not in SUPPORTED_STATS_TYPES :
43- raise InvalidSearchQuery (
44- f"{ stats_type } is not a valid statsType. Please use one of the allowed stats types: { SUPPORTED_STATS_TYPES } ."
45- )
42+ serializer = OrganizationTraceItemsStatsSerializer (data = request .GET )
43+ if not serializer .is_valid ():
44+ return Response (serializer .errors , status = 400 )
45+ serialized = serializer .validated_data
4646
4747 resolver_config = SearchResolverConfig ()
4848 resolver = SearchResolver (
4949 params = snuba_params , config = resolver_config , definitions = SPAN_DEFINITIONS
5050 )
5151
52- query = request .GET .get ("query" , "" )
5352 stats_results = Spans .run_stats_query (
5453 params = snuba_params ,
55- stats_types = stats_types ,
56- query_string = query ,
54+ stats_types = serialized . get ( "statsType" ) ,
55+ query_string = serialized . get ( " query" , "" ) ,
5756 referrer = Referrer .API_SPANS_FREQUENCY_STATS_RPC .value ,
5857 config = resolver_config ,
5958 search_resolver = resolver ,
0 commit comments