django-orchestra/orchestra/apps/resources/backends.py

70 lines
2.2 KiB
Python

import datetime
from django.contrib.contenttypes.models import ContentType
from django.utils import timezone
from django.utils.functional import cached_property
from orchestra.apps.orchestration import ServiceBackend
class ServiceMonitor(ServiceBackend):
TRAFFIC = 'traffic'
DISK = 'disk'
MEMORY = 'memory'
CPU = 'cpu'
# TODO UNITS
actions = ('monitor', 'exceeded', 'recovery')
@classmethod
def get_backends(cls):
""" filter monitor classes """
for backend in cls.plugins:
if backend != ServiceMonitor and ServiceMonitor in backend.__mro__:
yield backend
@cached_property
def current_date(self):
return timezone.now()
@cached_property
def content_type(self):
app_label, model = self.model.split('.')
model = model.lower()
return ContentType.objects.get_by_natural_key(app_label, model)
def get_last_data(self, object_id):
from .models import MonitorData
try:
return MonitorData.objects.filter(content_type=self.content_type,
object_id=object_id).latest()
except MonitorData.DoesNotExist:
return None
def get_last_date(self, object_id):
data = self.get_last_data(object_id)
if data is None:
return self.current_date - datetime.timedelta(days=1)
return data.date
def process(self, line):
""" line -> object_id, value """
return line.split()
def store(self, log):
""" stores monitored values from stdout """
from .models import MonitorData
name = self.get_name()
app_label, model_name = self.model.split('.')
ct = ContentType.objects.get_by_natural_key(app_label, model_name.lower())
for line in log.stdout.splitlines():
line = line.strip()
object_id, value = self.process(line)
MonitorData.objects.create(monitor=name, object_id=object_id,
content_type=ct, value=value, date=self.current_date)
def execute(self, server):
log = super(ServiceMonitor, self).execute(server)
self.store(log)
return log