mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-06-24 22:12:00 +00:00
perf: dates_metrics api speed (#13266)
Co-authored-by: feng <1304903146@qq.com>
This commit is contained in:
parent
5616d31888
commit
4ebcba81e0
@ -159,31 +159,48 @@ class DatesLoginMetricMixin:
|
|||||||
query = {f'{field_name}__range': self.date_start_end}
|
query = {f'{field_name}__range': self.date_start_end}
|
||||||
return queryset.filter(**query)
|
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 = self.filter_date_start_end(queryset, field_name)
|
||||||
queryset = queryset.values_list(field_name, count_field)
|
|
||||||
|
|
||||||
date_group_map = defaultdict(set)
|
if not isinstance(count_fields, (list, tuple)):
|
||||||
for datetime, count_field in queryset:
|
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_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 [
|
date_metrics_dict = defaultdict(list)
|
||||||
len(date_group_map.get(str(d), set()))
|
for field in count_fields:
|
||||||
for d in self.dates_list
|
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):
|
def get_dates_metrics_total_count_login(self):
|
||||||
return self.get_date_metrics(UserLoginLog.objects, 'datetime', 'id')
|
date_metrics_dict = 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')
|
return date_metrics_dict.get('id', [])
|
||||||
|
|
||||||
def get_dates_metrics_total_count_active_assets(self):
|
|
||||||
return self.get_date_metrics(Session.objects, 'date_start', 'asset_id')
|
|
||||||
|
|
||||||
def get_dates_metrics_total_count_sessions(self):
|
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):
|
def get_dates_login_times_assets(self):
|
||||||
assets = self.sessions_queryset.values("asset") \
|
assets = self.sessions_queryset.values("asset") \
|
||||||
@ -412,11 +429,13 @@ class IndexApi(DateTimeMixin, DatesLoginMetricMixin, APIView):
|
|||||||
})
|
})
|
||||||
|
|
||||||
if _all or query_params.get('dates_metrics'):
|
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({
|
data.update({
|
||||||
'dates_metrics_date': self.get_dates_metrics_date(),
|
'dates_metrics_date': self.get_dates_metrics_date(),
|
||||||
'dates_metrics_total_count_login': self.get_dates_metrics_total_count_login(),
|
'dates_metrics_total_count_login': login_data,
|
||||||
'dates_metrics_total_count_active_users': self.get_dates_metrics_total_count_active_users(),
|
'dates_metrics_total_count_active_users': user_data,
|
||||||
'dates_metrics_total_count_active_assets': self.get_dates_metrics_total_count_active_assets(),
|
'dates_metrics_total_count_active_assets': asset_data,
|
||||||
})
|
})
|
||||||
|
|
||||||
if _all or query_params.get('dates_login_times_top10_assets'):
|
if _all or query_params.get('dates_login_times_top10_assets'):
|
||||||
|
Loading…
Reference in New Issue
Block a user