mirror of https://github.com/jumpserver/jumpserver
perf: 接口sql优化 /api/v1/index/
parent
d3d8fcbbb3
commit
9ad8e53743
|
@ -50,6 +50,10 @@ class DateTimeMixin:
|
|||
t = local_now() - timezone.timedelta(days=days)
|
||||
return t
|
||||
|
||||
@lazyproperty
|
||||
def date_start_end(self):
|
||||
return self.days_to_datetime.date(), local_now().date()
|
||||
|
||||
@lazyproperty
|
||||
def dates_list(self):
|
||||
now = local_now()
|
||||
|
@ -143,101 +147,36 @@ class DatesLoginMetricMixin:
|
|||
operate_logs_queryset: OperateLog.objects
|
||||
password_change_logs_queryset: PasswordChangeLog.objects
|
||||
|
||||
@staticmethod
|
||||
def get_cache_key(date, tp):
|
||||
date_str = date.strftime("%Y%m%d")
|
||||
key = "SESSION_DATE_{}_{}_{}".format(current_org.id, tp, date_str)
|
||||
return key
|
||||
|
||||
def __get_data_from_cache(self, date, tp):
|
||||
if date == timezone.now().date():
|
||||
return None
|
||||
cache_key = self.get_cache_key(date, tp)
|
||||
count = cache.get(cache_key)
|
||||
return count
|
||||
|
||||
def __set_data_to_cache(self, date, tp, count):
|
||||
cache_key = self.get_cache_key(date, tp)
|
||||
cache.set(cache_key, count, 3600)
|
||||
|
||||
@staticmethod
|
||||
def get_date_start_2_end(d):
|
||||
time_min = timezone.datetime.min.time()
|
||||
time_max = timezone.datetime.max.time()
|
||||
tz = timezone.get_current_timezone()
|
||||
ds = timezone.datetime.combine(d, time_min).replace(tzinfo=tz)
|
||||
de = timezone.datetime.combine(d, time_max).replace(tzinfo=tz)
|
||||
return ds, de
|
||||
|
||||
def get_date_login_count(self, date):
|
||||
tp = "LOGIN-USER"
|
||||
count = self.__get_data_from_cache(date, tp)
|
||||
if count is not None:
|
||||
return count
|
||||
ds, de = self.get_date_start_2_end(date)
|
||||
count = UserLoginLog.objects.filter(datetime__range=(ds, de)).count()
|
||||
self.__set_data_to_cache(date, tp, count)
|
||||
return count
|
||||
|
||||
def get_dates_metrics_total_count_login(self):
|
||||
data = []
|
||||
for d in self.dates_list:
|
||||
count = self.get_date_login_count(d)
|
||||
data.append(count)
|
||||
if len(data) == 0:
|
||||
data = [0]
|
||||
return data
|
||||
|
||||
def get_date_user_count(self, date):
|
||||
tp = "USER"
|
||||
count = self.__get_data_from_cache(date, tp)
|
||||
if count is not None:
|
||||
return count
|
||||
ds, de = self.get_date_start_2_end(date)
|
||||
count = len(set(Session.objects.filter(date_start__range=(ds, de)).values_list('user_id', flat=True)))
|
||||
self.__set_data_to_cache(date, tp, count)
|
||||
return count
|
||||
queryset = UserLoginLog.objects.filter(datetime__range=(self.date_start_end)) \
|
||||
.values('datetime__date').annotate(id__count=Count(id)) \
|
||||
.order_by('datetime__date')
|
||||
map_date_logincount = {i['datetime__date']: i['id__count'] for i in queryset}
|
||||
return [map_date_logincount.get(d, 0) for d in self.dates_list]
|
||||
|
||||
def get_dates_metrics_total_count_active_users(self):
|
||||
data = []
|
||||
for d in self.dates_list:
|
||||
count = self.get_date_user_count(d)
|
||||
data.append(count)
|
||||
return data
|
||||
|
||||
def get_date_asset_count(self, date):
|
||||
tp = "ASSET"
|
||||
count = self.__get_data_from_cache(date, tp)
|
||||
if count is not None:
|
||||
return count
|
||||
ds, de = self.get_date_start_2_end(date)
|
||||
count = len(set(Session.objects.filter(date_start__range=(ds, de)).values_list('asset', flat=True)))
|
||||
self.__set_data_to_cache(date, tp, count)
|
||||
return count
|
||||
queryset = Session.objects.filter(date_start__range=(self.date_start_end)) \
|
||||
.values('date_start__date') \
|
||||
.annotate(id__count=Count('user_id', distinct=True)) \
|
||||
.order_by('date_start__date')
|
||||
map_date_usercount = {i['date_start__date']: i['id__count'] for i in queryset}
|
||||
return [map_date_usercount.get(d, 0) for d in self.dates_list]
|
||||
|
||||
def get_dates_metrics_total_count_active_assets(self):
|
||||
data = []
|
||||
for d in self.dates_list:
|
||||
count = self.get_date_asset_count(d)
|
||||
data.append(count)
|
||||
return data
|
||||
|
||||
def get_date_session_count(self, date):
|
||||
tp = "SESSION"
|
||||
count = self.__get_data_from_cache(date, tp)
|
||||
if count is not None:
|
||||
return count
|
||||
ds, de = self.get_date_start_2_end(date)
|
||||
count = Session.objects.filter(date_start__range=(ds, de)).count()
|
||||
self.__set_data_to_cache(date, tp, count)
|
||||
return count
|
||||
queryset = Session.objects.filter(date_start__range=(self.date_start_end)) \
|
||||
.values('date_start__date') \
|
||||
.annotate(id__count=Count('asset_id', distinct=True)) \
|
||||
.order_by('date_start__date')
|
||||
map_date_assetcount = {i['date_start__date']: i['id__count'] for i in queryset}
|
||||
return [map_date_assetcount.get(d, 0) for d in self.dates_list]
|
||||
|
||||
def get_dates_metrics_total_count_sessions(self):
|
||||
data = []
|
||||
for d in self.dates_list:
|
||||
count = self.get_date_session_count(d)
|
||||
data.append(count)
|
||||
return data
|
||||
queryset = Session.objects.filter(date_start__range=(self.date_start_end)) \
|
||||
.values('date_start__date') \
|
||||
.annotate(id__count=Count(id)) \
|
||||
.order_by('date_start__date')
|
||||
map_date_usercount = {i['date_start__date']: i['id__count'] for i in queryset}
|
||||
return [map_date_usercount.get(d, 0) for d in self.dates_list]
|
||||
|
||||
@lazyproperty
|
||||
def get_type_to_assets(self):
|
||||
|
|
Loading…
Reference in New Issue