From 4ebcba81e08fc92f34ca0499d2b69bf42e7a83fc Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Wed, 22 May 2024 15:25:38 +0800 Subject: [PATCH] perf: dates_metrics api speed (#13266) Co-authored-by: feng <1304903146@qq.com> --- apps/jumpserver/api.py | 59 ++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/apps/jumpserver/api.py b/apps/jumpserver/api.py index 6b5d162e5..6c706430f 100644 --- a/apps/jumpserver/api.py +++ b/apps/jumpserver/api.py @@ -159,31 +159,48 @@ class DatesLoginMetricMixin: query = {f'{field_name}__range': self.date_start_end} return queryset.filter(**query) - def get_date_metrics(self, queryset, field_name, count_field): + def get_date_metrics(self, queryset, field_name, count_fields): queryset = self.filter_date_start_end(queryset, field_name) - queryset = queryset.values_list(field_name, count_field) - date_group_map = defaultdict(set) - for datetime, count_field in queryset: + if not isinstance(count_fields, (list, tuple)): + count_fields = [count_fields] + + values_list = [field_name] + list(count_fields) + queryset = queryset.values_list(*values_list) + + date_group_map = defaultdict(lambda: defaultdict(set)) + + for row in queryset: + datetime = row[0] date_str = str(datetime.date()) - date_group_map[date_str].add(count_field) + for idx, count_field in enumerate(count_fields): + date_group_map[date_str][count_field].add(row[idx + 1]) - return [ - len(date_group_map.get(str(d), set())) - for d in self.dates_list - ] + date_metrics_dict = defaultdict(list) + for field in count_fields: + for date_str in self.dates_list: + count = len(date_group_map.get(str(date_str), {}).get(field, set())) + date_metrics_dict[field].append(count) + + return date_metrics_dict + + def get_dates_metrics_total_count_active_users_and_assets(self): + date_metrics_dict = self.get_date_metrics( + Session.objects, 'date_start', ('user_id', 'asset_id') + ) + return date_metrics_dict.get('user_id', []), date_metrics_dict.get('asset_id', []) def get_dates_metrics_total_count_login(self): - return self.get_date_metrics(UserLoginLog.objects, 'datetime', 'id') - - def get_dates_metrics_total_count_active_users(self): - return self.get_date_metrics(Session.objects, 'date_start', 'user_id') - - def get_dates_metrics_total_count_active_assets(self): - return self.get_date_metrics(Session.objects, 'date_start', 'asset_id') + date_metrics_dict = self.get_date_metrics( + UserLoginLog.objects, 'datetime', 'id' + ) + return date_metrics_dict.get('id', []) def get_dates_metrics_total_count_sessions(self): - return self.get_date_metrics(Session.objects, 'date_start', 'id') + date_metrics_dict = self.get_date_metrics( + Session.objects, 'date_start', 'id' + ) + return date_metrics_dict.get('id', []) def get_dates_login_times_assets(self): assets = self.sessions_queryset.values("asset") \ @@ -412,11 +429,13 @@ class IndexApi(DateTimeMixin, DatesLoginMetricMixin, APIView): }) if _all or query_params.get('dates_metrics'): + user_data, asset_data = self.get_dates_metrics_total_count_active_users_and_assets() + login_data = self.get_dates_metrics_total_count_login() data.update({ 'dates_metrics_date': self.get_dates_metrics_date(), - 'dates_metrics_total_count_login': self.get_dates_metrics_total_count_login(), - 'dates_metrics_total_count_active_users': self.get_dates_metrics_total_count_active_users(), - 'dates_metrics_total_count_active_assets': self.get_dates_metrics_total_count_active_assets(), + 'dates_metrics_total_count_login': login_data, + 'dates_metrics_total_count_active_users': user_data, + 'dates_metrics_total_count_active_assets': asset_data, }) if _all or query_params.get('dates_login_times_top10_assets'):