mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-20 02:51:27 +00:00
perf: 修改组件状态
This commit is contained in:
@@ -1,10 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.forms.models import model_to_dict
|
||||
from django.core.cache import cache
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils import get_logger
|
||||
@@ -22,56 +18,12 @@ class Status(models.Model):
|
||||
connections = models.IntegerField(verbose_name=_("Connections"), default=0)
|
||||
threads = models.IntegerField(verbose_name=_("Threads"), default=0)
|
||||
boot_time = models.FloatField(verbose_name=_("Boot Time"), default=0)
|
||||
terminal = models.ForeignKey('terminal.Terminal', null=True, on_delete=models.CASCADE, related_name='status')
|
||||
terminal = models.ForeignKey('terminal.Terminal', null=True, on_delete=models.CASCADE)
|
||||
date_created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
CACHE_KEY = 'TERMINAL_STATUS_{}'
|
||||
|
||||
class Meta:
|
||||
db_table = 'terminal_status'
|
||||
get_latest_by = 'date_created'
|
||||
verbose_name = _("Status")
|
||||
|
||||
def save_to_cache(self):
|
||||
if not self.terminal:
|
||||
return
|
||||
key = self.CACHE_KEY.format(self.terminal.id)
|
||||
data = model_to_dict(self)
|
||||
cache.set(key, data, 60*3)
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def get_terminal_latest_status(cls, terminal):
|
||||
from ...utils import ComputeStatUtil
|
||||
stat = cls.get_terminal_latest_stat(terminal)
|
||||
return ComputeStatUtil.compute_component_status(stat)
|
||||
|
||||
@classmethod
|
||||
def get_terminal_latest_stat(cls, terminal):
|
||||
key = cls.CACHE_KEY.format(terminal.id)
|
||||
data = cache.get(key)
|
||||
if not data:
|
||||
return None
|
||||
data.pop('terminal', None)
|
||||
stat = cls(**data)
|
||||
stat.terminal = terminal
|
||||
stat.is_alive = terminal.is_alive
|
||||
stat.keep_one_decimal_place()
|
||||
return stat
|
||||
|
||||
def keep_one_decimal_place(self):
|
||||
keys = ['cpu_load', 'memory_used', 'disk_used']
|
||||
for key in keys:
|
||||
value = getattr(self, key, 0)
|
||||
if not isinstance(value, (int, float)):
|
||||
continue
|
||||
value = '%.1f' % value
|
||||
setattr(self, key, float(value))
|
||||
|
||||
def save(self, force_insert=False, force_update=False, using=None,
|
||||
update_fields=None):
|
||||
self.terminal.set_alive(ttl=120)
|
||||
return self.save_to_cache()
|
||||
# return super().save()
|
||||
|
||||
|
||||
|
@@ -53,21 +53,21 @@ class CommonStorageModelMixin(models.Model):
|
||||
|
||||
class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.CommandStorageTypeChoices.choices,
|
||||
default=const.CommandStorageTypeChoices.server.value, verbose_name=_('Type'),
|
||||
max_length=16, choices=const.CommandStorageType.choices,
|
||||
default=const.CommandStorageType.server.value, verbose_name=_('Type'),
|
||||
)
|
||||
|
||||
@property
|
||||
def type_null(self):
|
||||
return self.type == const.CommandStorageTypeChoices.null.value
|
||||
return self.type == const.CommandStorageType.null.value
|
||||
|
||||
@property
|
||||
def type_server(self):
|
||||
return self.type == const.CommandStorageTypeChoices.server.value
|
||||
return self.type == const.CommandStorageType.server.value
|
||||
|
||||
@property
|
||||
def type_es(self):
|
||||
return self.type == const.CommandStorageTypeChoices.es.value
|
||||
return self.type == const.CommandStorageType.es.value
|
||||
|
||||
@property
|
||||
def type_null_or_server(self):
|
||||
@@ -138,17 +138,17 @@ class CommandStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
|
||||
class ReplayStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
type = models.CharField(
|
||||
max_length=16, choices=const.ReplayStorageTypeChoices.choices,
|
||||
default=const.ReplayStorageTypeChoices.server.value, verbose_name=_('Type')
|
||||
max_length=16, choices=const.ReplayStorageType.choices,
|
||||
default=const.ReplayStorageType.server.value, verbose_name=_('Type')
|
||||
)
|
||||
|
||||
@property
|
||||
def type_null(self):
|
||||
return self.type == const.ReplayStorageTypeChoices.null.value
|
||||
return self.type == const.ReplayStorageType.null.value
|
||||
|
||||
@property
|
||||
def type_server(self):
|
||||
return self.type == const.ReplayStorageTypeChoices.server.value
|
||||
return self.type == const.ReplayStorageType.server.value
|
||||
|
||||
@property
|
||||
def type_null_or_server(self):
|
||||
@@ -156,11 +156,11 @@ class ReplayStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
|
||||
@property
|
||||
def type_swift(self):
|
||||
return self.type == const.ReplayStorageTypeChoices.swift.value
|
||||
return self.type == const.ReplayStorageType.swift.value
|
||||
|
||||
@property
|
||||
def type_ceph(self):
|
||||
return self.type == const.ReplayStorageTypeChoices.ceph.value
|
||||
return self.type == const.ReplayStorageType.ceph.value
|
||||
|
||||
@property
|
||||
def config(self):
|
||||
@@ -168,7 +168,7 @@ class ReplayStorage(CommonStorageModelMixin, CommonModelMixin):
|
||||
|
||||
# add type config
|
||||
if self.type_ceph:
|
||||
_type = const.ReplayStorageTypeChoices.s3.value
|
||||
_type = const.ReplayStorageType.s3.value
|
||||
else:
|
||||
_type = self.type
|
||||
_config.update({'TYPE': _type})
|
||||
|
@@ -1,16 +1,15 @@
|
||||
import uuid
|
||||
|
||||
from django.utils import timezone
|
||||
from django.db import models
|
||||
from django.core.cache import cache
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.conf import settings
|
||||
|
||||
from common.utils import get_logger
|
||||
from common.utils import get_logger, lazyproperty
|
||||
from users.models import User
|
||||
from orgs.utils import tmp_to_root_org
|
||||
from .status import Status
|
||||
from terminal.const import TerminalTypeChoices as TypeChoices
|
||||
from terminal.const import ComponentStatusChoices as StatusChoice
|
||||
from terminal.const import TerminalType as TypeChoices, ComponentLoad as StatusChoice
|
||||
from ..session import Session
|
||||
|
||||
|
||||
@@ -18,42 +17,24 @@ logger = get_logger(__file__)
|
||||
|
||||
|
||||
class TerminalStatusMixin:
|
||||
ALIVE_KEY = 'TERMINAL_ALIVE_{}'
|
||||
id: str
|
||||
ALIVE_KEY = 'TERMINAL_ALIVE_{}'
|
||||
status_set: models.Manager
|
||||
|
||||
@property
|
||||
def latest_status(self):
|
||||
return Status.get_terminal_latest_status(self)
|
||||
@lazyproperty
|
||||
def last_stat(self):
|
||||
return self.status_set.order_by('date_created').last()
|
||||
|
||||
@property
|
||||
def latest_status_display(self):
|
||||
return self.latest_status.label
|
||||
|
||||
@property
|
||||
def latest_stat(self):
|
||||
return Status.get_terminal_latest_stat(self)
|
||||
|
||||
@property
|
||||
def is_normal(self):
|
||||
return self.latest_status == StatusChoice.normal
|
||||
|
||||
@property
|
||||
def is_high(self):
|
||||
return self.latest_status == StatusChoice.high
|
||||
|
||||
@property
|
||||
def is_critical(self):
|
||||
return self.latest_status == StatusChoice.critical
|
||||
@lazyproperty
|
||||
def load(self):
|
||||
from ...utils import ComputeLoadUtil
|
||||
return ComputeLoadUtil.compute_load(self.last_stat)
|
||||
|
||||
@property
|
||||
def is_alive(self):
|
||||
key = self.ALIVE_KEY.format(self.id)
|
||||
# return self.latest_status != StatusChoice.offline
|
||||
return cache.get(key, False)
|
||||
|
||||
def set_alive(self, ttl=120):
|
||||
key = self.ALIVE_KEY.format(self.id)
|
||||
cache.set(key, True, ttl)
|
||||
if not self.last_stat:
|
||||
return False
|
||||
return self.last_stat.date_created > timezone.now() - timezone.timedelta(seconds=120)
|
||||
|
||||
|
||||
class StorageMixin:
|
||||
|
Reference in New Issue
Block a user