Skip to content

Commit

Permalink
Monitorar celery / redis (#599)
Browse files Browse the repository at this point in the history
* Criar tracker.models.Hello

* Cria tracker.wagtail_hooks.HelloModelAdmin

* Cria a tarefa para registrar hello

* Adiciona user_id porque obrigatoriamente todas as tarefas recebem este parâmetro

* Adiciona a migração do modelo Hello

* Adiciona uma migração de journal (merged)
  • Loading branch information
robertatakenaka authored Feb 7, 2024
1 parent 49f8255 commit 426a237
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 111 deletions.
12 changes: 12 additions & 0 deletions journal/migrations/0016_merge_20240207_1816.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Generated by Django 4.2.7 on 2024-02-07 18:16

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("journal", "0015_alter_journalsocialnetwork_name_and_more"),
("journal", "0015_alter_subjectdescriptor_value"),
]

operations = []
58 changes: 58 additions & 0 deletions tracker/migrations/0002_hello.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Generated by Django 4.2.7 on 2024-02-07 18:17

from django.db import migrations, models
import uuid


class Migration(migrations.Migration):
dependencies = [
("tracker", "0001_initial"),
]

operations = [
migrations.CreateModel(
name="Hello",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("status", models.BooleanField(blank=True, default=None, null=True)),
(
"created",
models.DateTimeField(
auto_now_add=True, verbose_name="Creation date"
),
),
(
"exception_type",
models.TextField(
blank=True, null=True, verbose_name="Exception Type"
),
),
(
"exception_msg",
models.TextField(
blank=True, null=True, verbose_name="Exception Msg"
),
),
("traceback", models.JSONField(blank=True, null=True)),
("detail", models.JSONField(blank=True, null=True)),
],
options={
"indexes": [
models.Index(
fields=["status"], name="tracker_hel_status_cfcbfa_idx"
),
models.Index(
fields=["exception_type"], name="tracker_hel_excepti_a64469_idx"
),
],
},
),
]
167 changes: 61 additions & 106 deletions tracker/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,14 @@ def create(
logging.exception(exception)

obj = cls()
obj.exception_msg = exception
obj.exception_type = type(exception)
obj.detail = detail
obj.exception_msg = str(exception)
obj.exception_type = str(type(exception))
try:
json.dumps(detail)
obj.detail = detail
except Exception as e:
obj.detail = str(detail)

if exc_traceback:
obj.traceback = traceback.format_tb(exc_traceback)
obj.save()
Expand Down Expand Up @@ -215,107 +220,57 @@ def create(cls, user):
f"Unable to create EventReport. Exception: {e}"
)

class Hello(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
status = models.BooleanField(null=True, blank=True, default=None)
created = models.DateTimeField(verbose_name=_("Creation date"), auto_now_add=True)
exception_type = models.TextField(_("Exception Type"), null=True, blank=True)
exception_msg = models.TextField(_("Exception Msg"), null=True, blank=True)
traceback = models.JSONField(null=True, blank=True)
detail = models.JSONField(null=True, blank=True)

class Meta:
indexes = [
models.Index(fields=["status"]),
models.Index(fields=["exception_type"]),
]

def __str__(self):
return f"{self.status or self.exception_type} {self.created.isoformat()}"

# class EventLogger:

# def archive_report(self, user, ext=None):
# events = ProcEvent.objects.filter(proc_event_logger=self).iterator()
# try:
# obj = ProcEventReport.archive(user, events, ext)
# obj.proc_event_logger = self
# obj.save()
# except Exception as e:
# raise ArchiveProcEventReportError(
# f"Unable to archive events {self}. Exception: {e}"
# )
# return obj

# def create_event(
# self,
# user,
# message_type,
# message=None,
# e=None,
# exc_traceback=None,
# detail=None,
# ):
# try:
# obj = ProcEvent.create(
# creator=user,
# message=message,
# message_type=message_type,
# detail=detail,
# exception=e,
# exc_traceback=exc_traceback,
# )
# obj.proc_event_logger = self
# obj.save()
# except Exception as exc:
# raise ProcEventCreateError(
# f"Unable to create ProcEvent ({proc_event_logger} {message} {e}). EXCEPTION: {exc}")
# return obj


# class ProcEventReport(EventReport, Orderable):
# proc_event_logger = ParentalKey(
# EventLogger, on_delete=models.SET_NULL, related_name="proc_event_file",
# null=True, blank=True,
# )

# base_form_class = CoreAdminModelForm

# panels = [
# # FieldPanel("created"),
# FieldPanel("file"),
# ]

# # @classmethod
# # def archive_with_parent(cls, user, proc_event_logger, events, ext=None):
# # obj = cls.archive(user, events, ext)
# # obj.proc_event_logger = proc_event_logger
# # obj.save()
# # return obj


# class ProcEvent(Event, Orderable):
# event_parent = ParentalKey(
# EventLogger, on_delete=models.SET_NULL, related_name="proc_event",
# null=True, blank=True,
# )

# base_form_class = CoreAdminModelForm

# panels = [
# # FieldPanel("created"),
# FieldPanel("message"),
# FieldPanel("message_type"),
# FieldPanel("detail"),
# FieldPanel("unexpected_event"),
# ]

# # @classmethod
# # def create_with_parent(
# # cls,
# # user,
# # proc_event_logger,
# # message_type,
# # message=None,
# # e=None,
# # exc_traceback=None,
# # detail=None,
# # ):
# # try:
# # obj = cls.create(
# # creator=user,
# # message=message,
# # message_type=message_type,
# # detail=detail,
# # exception=e,
# # exc_traceback=exc_traceback,
# # )
# # obj.proc_event_logger = proc_event_logger
# # obj.save()
# # except Exception as exc:
# # raise ProcEventCreateError(
# # f"Unable to create Event ({proc_event_logger} {message} {e}). EXCEPTION: {exc}")
# # return obj
@property
def data(self):
return dict(
status=self.status,
created=self.created.isoformat(),
exception_type=self.exception_type,
exception_msg=self.exception_msg,
traceback=json.dumps(self.traceback),
detail=json.dumps(self.detail),
)

@classmethod
def create(
cls,
exception=None,
exc_traceback=None,
detail=None,
status=None
):
if exception:
logging.exception(exception)

obj = cls()
obj.status = status or not exception and not exc_traceback
obj.exception_msg = str(exception)
obj.exception_type = str(type(exception))
try:
json.dumps(detail)
obj.detail = detail
except Exception as e:
obj.detail = str(detail)

if exc_traceback:
obj.traceback = traceback.format_tb(exc_traceback)
obj.save()
return obj
40 changes: 37 additions & 3 deletions tracker/tasks.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
# tasks.py
from config import celery_app
from .models import UnexpectedEvent
import logging
import sys
from datetime import datetime

from django.contrib.auth import get_user_model

from config import celery_app
from .models import UnexpectedEvent, Hello


User = get_user_model()


def _get_user(request, username=None, user_id=None):
try:
return User.objects.get(pk=request.user.id)
except AttributeError:
if user_id:
return User.objects.get(pk=user_id)
if username:
return User.objects.get(username=username)


@celery_app.task(bind=True, name="cleanup_unexpected_events")
def delete_unexpected_events(self, exception_type, start_date=None, end_date=None, user_id=None, username=None):
Expand All @@ -22,4 +40,20 @@ def delete_unexpected_events(self, exception_type, start_date=None, end_date=Non
end_date = datetime.fromisoformat(end_date)
filters['created__lte'] = end_date

UnexpectedEvent.objects.filter(**filters).delete()
UnexpectedEvent.objects.filter(**filters).delete()


@celery_app.task(bind=True)
def hello(self, user_id=None):
"""
Register Hello records
"""
try:
logging.info("Hello!")
Hello.create()
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
Hello.create(
exception=e,
exc_traceback=exc_traceback,
)
34 changes: 32 additions & 2 deletions tracker/wagtail_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from config.menu import get_menu_order

from .models import UnexpectedEvent
from .models import UnexpectedEvent, Hello


class UnexpectedEventModelAdmin(ModelAdmin):
Expand Down Expand Up @@ -41,12 +41,42 @@ class UnexpectedEventModelAdmin(ModelAdmin):
)


class HelloModelAdmin(ModelAdmin):
model = Hello
inspect_view_enabled = True
menu_label = _("Hello events")
menu_icon = "folder"
menu_order = 200
add_to_settings_menu = False
exclude_from_explorer = False

list_display = (
"status",
"exception_type",
"exception_msg",
"traceback",
"created",
)
list_filter = ("status", "exception_type",)
search_fields = (
"exception_msg",
"detail",
)
inspect_view_fields = (
"exception_type",
"exception_msg",
"traceback",
"detail",
"created",
)


class UnexpectedEventModelAdminGroup(ModelAdminGroup):
menu_icon = "folder"
menu_label = _("Unexpected errors")
# menu_order = get_menu_order("journal")
menu_order = 200
items = (UnexpectedEventModelAdmin,)
items = (UnexpectedEventModelAdmin, HelloModelAdmin)
menu_order = get_menu_order("unexpected-error")


Expand Down

0 comments on commit 426a237

Please sign in to comment.