@@ -307,34 +307,47 @@ async def resource_usage(
307307 """
308308 Statistics at the level of individual users (only accessible by platform administrators)
309309 """
310+ # check permissions
310311 user = await asyncio .create_task (oauth .User .from_token (token .credentials ))
311312 if not user .is_admin :
312313 raise HTTPException (
313314 status_code = status_codes .HTTP_403_FORBIDDEN ,
314315 detail = "Only admins can access per-user statistics" ,
315316 )
317+ # get data from the DB
316318 jobs = await db .query_jobs (
317319 status = ["finished" , "error" ],
318320 date_range_start = start ,
319321 date_range_end = end ,
320322 size = 100000 ,
321- fields = ["user_id" ],
323+ fields = ["user_id" , "hardware_platform" ],
322324 )
323325 sessions = await db .query_sessions (
324326 status = ["finished" , "error" ],
325327 date_range_start = start ,
326328 date_range_end = end ,
327329 size = 100000 ,
328- fields = ["user_id" ],
330+ fields = ["user_id" , "hardware_platform" ],
329331 )
330- jobs_per_user = Counter (job ["user_id" ] for job in jobs )
331- sessions_per_user = Counter (ses ["user_id" ] for ses in sessions )
332- all_users = set (jobs_per_user ).union (sessions_per_user )
333- return [
334- UserStatistics (
335- user = user_name ,
336- jobs = jobs_per_user .get (user_name , 0 ),
337- sessions = sessions_per_user .get (user_name , 0 ),
332+ # count jobs/sessions by user and by platform
333+ jobs_per_user = {}
334+ sessions_per_user = {}
335+ all_users = set ()
336+ for platform in STANDARD_QUEUES :
337+ jobs_per_user [platform ] = Counter (
338+ job ["user_id" ] for job in jobs if job ["hardware_platform" ] == platform
338339 )
339- for user_name in all_users
340- ]
340+ sessions_per_user [platform ] = Counter (
341+ ses ["user_id" ] for ses in sessions if ses ["hardware_platform" ] == platform
342+ )
343+ all_users = all_users .union (jobs_per_user [platform ]).union (sessions_per_user [platform ])
344+ # restructure the data for returning
345+ stats = []
346+ for user_name in all_users :
347+ user_jobs = {}
348+ user_sessions = {}
349+ for platform in STANDARD_QUEUES :
350+ user_jobs [platform ] = jobs_per_user [platform ].get (user_name , 0 )
351+ user_sessions [platform ] = sessions_per_user [platform ].get (user_name , 0 )
352+ stats .append (UserStatistics (user = user_name , jobs = user_jobs , sessions = user_sessions ))
353+ return stats
0 commit comments