diff --git a/lib/rucio/api/request.py b/lib/rucio/api/request.py index 98a229dfd3..ea6451709f 100644 --- a/lib/rucio/api/request.py +++ b/lib/rucio/api/request.py @@ -220,13 +220,14 @@ def list_requests_history(src_rses, dst_rses, states, issuer, vo='def', offset=N @read_session -def get_request_metrics(src_rse: Optional[str], dst_rse: Optional[str], activity: Optional[str], issuer, vo='def', *, session: "Session"): +def get_request_metrics(src_rse: Optional[str], dst_rse: Optional[str], activity: Optional[str], group_response_by: Optional[str], issuer, vo='def', *, session: "Session"): """ Get statistics of requests in a specific state grouped by source RSE, destination RSE, and activity. :param src_rse: source RSE. :param dst_rse: destination RSE. :param activity: activity + :param group_response_by: The parameter to group the RSEs by. :param issuer: Issuing account as a string. :param session: The database session in use. """ @@ -240,4 +241,4 @@ def get_request_metrics(src_rse: Optional[str], dst_rse: Optional[str], activity if not permission.has_permission(issuer=issuer, vo=vo, action='get_request_metrics', kwargs=kwargs, session=session): raise exception.AccessDenied(f'{issuer} cannot get request statistics') - return request.get_request_metrics(dest_rse_id=dst_rse_id, src_rse_id=src_rse_id, activity=activity, session=session) + return request.get_request_metrics(dest_rse_id=dst_rse_id, src_rse_id=src_rse_id, activity=activity, group_response_by=group_response_by, session=session) diff --git a/lib/rucio/core/request.py b/lib/rucio/core/request.py index 4921783944..bb75cb7218 100644 --- a/lib/rucio/core/request.py +++ b/lib/rucio/core/request.py @@ -1849,6 +1849,7 @@ def get_request_metrics( dest_rse_id: "Optional[str]" = None, src_rse_id: "Optional[str]" = None, activity: "Optional[str]" = None, + group_response_by: "Optional[str]" = None, *, session: "Session" ): @@ -1927,7 +1928,13 @@ def get_request_metrics( metric['src_rse'] = src_rse.name metric['dst_rse'] = dst_rse.name - response[f'{src_rse.name}:{dst_rse.name}'] = metric + if group_response_by: + src_rse_group = src_rse.attributes.get(group_response_by) + dst_rse_group = dst_rse.attributes.get(group_response_by) + if src_rse_group is not None and dst_rse_group is not None: + response[f'{src_rse_group}:{dst_rse_group}'] = metric + else: + response[f'{src_rse.name}:{dst_rse.name}'] = metric return response diff --git a/lib/rucio/web/rest/flaskapi/v1/requests.py b/lib/rucio/web/rest/flaskapi/v1/requests.py index 26b22bd4b1..2596c0cc7e 100644 --- a/lib/rucio/web/rest/flaskapi/v1/requests.py +++ b/lib/rucio/web/rest/flaskapi/v1/requests.py @@ -849,6 +849,11 @@ def get(self): description: The activity schema: type: string + - name: group_response_by + in: query + description: The parameter to group the RSEs by. + schema: + type: string responses: 200: description: OK @@ -949,12 +954,14 @@ def get(self): dst_rse = flask.request.args.get('dst_rse', default=None) src_rse = flask.request.args.get('src_rse', default=None) activity = flask.request.args.get('activity', default=None) + group_response_by = flask.request.args.get('group_response_by', default=None) format = flask.request.args.get('format', default=None) metrics = request.get_request_metrics( dst_rse=dst_rse, src_rse=src_rse, activity=activity, + group_response_by=group_response_by, issuer=flask.request.environ.get('issuer'), vo=flask.request.environ.get('vo') )