@@ -46,61 +46,64 @@ async def update_user_group_info(
4646 """
4747 Update the prometheus exporter with user group memberships fetched from the JupyterHub API.
4848 """
49+ logger .info ("This is the update_user_group_info coroutine." )
4950 session = app ["session" ]
5051 hub_url = app ["hub_url" ]
5152 allowed_groups = app ["allowed_groups" ]
5253 double_count = app ["double_count" ]
5354 namespace = app ["namespace" ]
54- data = await fetch_page (session , hub_url , "hub/api/groups" )
55- if "_pagination" in data :
56- logger .debug (f"Received paginated data: { data ['_pagination' ]} " )
57- items = data ["items" ]
58- next_info = data ["_pagination" ]["next" ]
59- while next_info :
60- data = await fetch_page (session , next_info ["url" ])
55+ endpoints = ["hub/api/users" , "hub/api/groups" ]
56+ results = []
57+ for i in range (len (endpoints )):
58+ endpoint = endpoints [i ]
59+ data = await fetch_page (session , hub_url , endpoint )
60+ if "_pagination" in data :
61+ logger .debug (f"Received paginated data: { data ['_pagination' ]} " )
62+ items = data ["items" ]
6163 next_info = data ["_pagination" ]["next" ]
62- items . extend ( data [ "items" ])
63- else :
64- logger . debug ( "Received non-paginated data." )
65- items = data
66-
67- logger .debug (f"Items: { items } " )
68- list_groups = (
69- [ group [ "name" ] for group in items ] if allowed_groups is None else allowed_groups
70- )
71- list_users = (
72- [
73- user
74- for group in items
75- if group [ "name" ] in allowed_groups
76- for user in group [ "users" ]
77- ]
78- if allowed_groups
79- else [ user for group in items for user in group [ "users" ]]
80- )
64+ while next_info :
65+ data = await fetch_page ( session , next_info [ "url" ])
66+ next_info = data [ "_pagination" ][ "next" ]
67+ items . extend ( data [ "items" ])
68+ else :
69+ logger .debug ("Received non-paginated data. " )
70+ items = data
71+ results . extend ( items )
72+ list_groups = []
73+ list_users = []
74+ for r in results :
75+ if r [ "kind" ] == "group" and (
76+ r [ "name" ] in allowed_groups or allowed_groups == []
77+ ):
78+ list_groups . append ( r [ "name" ])
79+ elif r [ "kind" ] == "user" :
80+ for group in r [ "groups" ]:
81+ if group in allowed_groups or allowed_groups == []:
82+ list_users . append ( r [ "name" ] )
8183 user_counts = Counter (list_users )
8284 users_in_multiple_groups = [
8385 user for user , count in user_counts .items () if count > 1
8486 ]
8587 unique_users = list (set (list_users ))
8688 logger .debug (f"List groups: { list_groups } " )
89+ logger .debug (f"List users: { list_users } " )
8790 logger .debug (f"Users in multiple groups: { users_in_multiple_groups } " )
8891 logger .info (
8992 f"Updating { len (list_groups )} groups and { len (unique_users )} users for metric user_group_info."
9093 )
91- # Clear previous prometheus metrics
92- USER_GROUP .clear ()
93- # Filter out groups not in the allowed list
94- for group in items .copy ():
95- if group ["name" ] not in list_groups :
96- logger .debug (f"Group { group ['name' ]} is not in allowed groups, skipping." )
97- items .remove (group )
98- # Invert the mapping from groups -> users to user -> groups
9994 user_to_groups = {}
100- for group in items :
101- for user in group ["users" ]:
102- user_to_groups .setdefault (user , []).append (group ["name" ])
103- # Loop over users
95+ for r in results :
96+ user = r ["name" ]
97+ if r ["kind" ] == "user" and user in unique_users :
98+ if r ["groups" ] != []:
99+ for group in r ["groups" ]:
100+ user_to_groups .setdefault (user , []).append (group )
101+ elif r ["kind" ] == "user" :
102+ logger .debug (f"User { user } has no groups." )
103+ user_to_groups .setdefault (user , ["none" ])
104+ logger .debug (f"User to groups mapping: { user_to_groups } " )
105+ # Loop over users to export
106+ USER_GROUP .clear ()
104107 for user in list (user_to_groups .keys ()):
105108 if user in users_in_multiple_groups :
106109 user_to_groups [user ].append ("multiple" )
@@ -167,9 +170,9 @@ async def update_group_usage(app: web.Application, config: dict):
167170 groups = user_group_map .get (username , [])
168171 if not groups :
169172 r_copy = copy .deepcopy (r )
170- r_copy ["metric" ]["usergroup" ] = "nogroup "
173+ r_copy ["metric" ]["usergroup" ] = "none "
171174 joined .append (r_copy )
172- logger .debug (f"User { username } has no groups, assigning to 'nogroup '." )
175+ logger .debug (f"User { username } has no groups, assigning to 'none '." )
173176 else :
174177 for group in groups :
175178 r_copy = copy .deepcopy (r )
0 commit comments