This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
logtracker/logtracker/journal/models.py

46 lines
1.5 KiB
Python

from django.db import models
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.fields.jsonb import KeyTextTransform
from django.utils.functional import cached_property
class EntryManager(models.Manager):
def dump(self, timestamp=None, host=None, lines=100, **kwargs):
qs = Entry.objects.all()
if host:
qs = qs.filter(host=host)
qs = qs.filter(**self.parse_options(**kwargs))
if lines:
qs = qs.order_by('-timestamp')[:int(lines)][::-1]
return qs
def parse_options(self, mode='exact', **kwargs):
# todo mode='contains' require jsonb KeyTextTransform and probably annotations
options = {}
for k, v in kwargs.items():
options['data__' + k.upper() + '__%s' % mode] = v
return options
@cached_property
def hosts(self):
return self.model.objects.all().values_list('host', flat=True).distinct()
@cached_property
def units(self):
return self.model.objects.all().annotate(unit=KeyTextTransform('_SYSTEMD_UNIT', 'data')).values_list('unit', flat=True).distinct()
class Entry(models.Model):
timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
host = models.CharField(max_length=128, db_index=True)
data = JSONField()
objects = EntryManager()
def __str__(self):
return '%s %s %s' % (self.timestamp, self.host, self.data)
@property
def unit(self):
return self.data.get('_SYSTEMD_UNIT', '').replace('.service', '')