From e234385802950dd55c8e4c0761197bab43bb61c3 Mon Sep 17 00:00:00 2001 From: lagertonne Date: Thu, 26 Dec 2024 20:40:25 +0100 Subject: [PATCH 1/5] metrics: Fix bug when running migrate on empty db --- core/core/metrics.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core/metrics.py b/core/core/metrics.py index 149829c..4964968 100644 --- a/core/core/metrics.py +++ b/core/core/metrics.py @@ -32,4 +32,7 @@ class ItemCountCollector(object): yield counter -REGISTRY.register(ItemCountCollector()) \ No newline at end of file +try: + REGISTRY.register(ItemCountCollector()) +except Exception as e: + print(e) From c569d29d8a0e56015480a4f40620734879ddbf1b Mon Sep 17 00:00:00 2001 From: lagertonne Date: Fri, 27 Dec 2024 09:34:54 +0100 Subject: [PATCH 2/5] metrics: Add ticket counters --- core/core/metrics.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/core/metrics.py b/core/core/metrics.py index 4964968..22041bf 100644 --- a/core/core/metrics.py +++ b/core/core/metrics.py @@ -2,6 +2,8 @@ from django.apps import apps from prometheus_client.core import CounterMetricFamily, REGISTRY from django.db.models import Case, Value, When, BooleanField, Count from inventory.models import Item +from tickets.models import IssueThread + class ItemCountCollector(object): @@ -32,7 +34,29 @@ class ItemCountCollector(object): yield counter +class TicketCountCollector(object): + + def collect(self): + counter = CounterMetricFamily("c3lf_ticket_count", "Current number of tickets", labels=['event', 'event_id']) + + yield counter + + if not apps.models_ready or not apps.apps_ready: + return + + queryset = ( + IssueThread.objects + .values('event__slug', 'event_id') + .annotate(amount=Count('id')) + ) + + for e in queryset: + counter.add_metric([e["event__slug"].lower()], e["amount"]) + + yield counter + try: REGISTRY.register(ItemCountCollector()) + REGISTRY.register(TicketCountCollector()) except Exception as e: print(e) From 3068597f3da951ad55d73eaac95f8f0c029be93a Mon Sep 17 00:00:00 2001 From: jedi Date: Fri, 27 Dec 2024 15:08:45 +0100 Subject: [PATCH 3/5] metrics: also export ticket state --- core/core/metrics.py | 36 +++++++++++++++---------------- deploy/dev/docker-compose.yml | 1 + deploy/testing/docker-compose.yml | 1 + 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/core/core/metrics.py b/core/core/metrics.py index 22041bf..2b1f4a6 100644 --- a/core/core/metrics.py +++ b/core/core/metrics.py @@ -4,6 +4,8 @@ from django.db.models import Case, Value, When, BooleanField, Count from inventory.models import Item from tickets.models import IssueThread +from itertools import groupby + class ItemCountCollector(object): @@ -17,16 +19,16 @@ class ItemCountCollector(object): queryset = ( Item.all_objects - .annotate( - returned=Case( - When(returned_at__isnull=True, then=Value(False)), - default=Value(True), - output_field=BooleanField() - ) + .annotate( + returned=Case( + When(returned_at__isnull=True, then=Value(False)), + default=Value(True), + output_field=BooleanField() ) - .values('event__slug', 'returned', 'event_id') - .annotate(amount=Count('id')) - .order_by('event__slug', 'returned') # Optional: order by slug and returned + ) + .values('event__slug', 'returned', 'event_id') + .annotate(amount=Count('id')) + .order_by('event__slug', 'returned') # Optional: order by slug and returned ) for e in queryset: @@ -34,27 +36,23 @@ class ItemCountCollector(object): yield counter + class TicketCountCollector(object): def collect(self): counter = CounterMetricFamily("c3lf_ticket_count", "Current number of tickets", labels=['event', 'event_id']) - yield counter - if not apps.models_ready or not apps.apps_ready: return - queryset = ( - IssueThread.objects - .values('event__slug', 'event_id') - .annotate(amount=Count('id')) - ) - - for e in queryset: - counter.add_metric([e["event__slug"].lower()], e["amount"]) + g = groupby(IssueThread.objects.all().prefetch_related('event', 'state_changes'), + lambda x: (x.event.slug, x.state)) + for (event, state), v in g: + counter.add_metric([event.lower(), state.lower()], len(list(v))) yield counter + try: REGISTRY.register(ItemCountCollector()) REGISTRY.register(TicketCountCollector()) diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml index e44c276..30c8c88 100644 --- a/deploy/dev/docker-compose.yml +++ b/deploy/dev/docker-compose.yml @@ -7,6 +7,7 @@ services: environment: - HTTP_HOST=core - DB_FILE=dev.db + - DEBUG_MODE_ACTIVE=yup volumes: - ../../core:/code - ../testdata.py:/code/testdata.py diff --git a/deploy/testing/docker-compose.yml b/deploy/testing/docker-compose.yml index b41dd63..91eb540 100644 --- a/deploy/testing/docker-compose.yml +++ b/deploy/testing/docker-compose.yml @@ -30,6 +30,7 @@ services: - DB_USER=system3 - DB_PASSWORD=system3 - MAIL_DOMAIN=mail:1025 + - DEBUG_MODE_ACTIVE=certainly volumes: - ../../core:/code - ../testdata.py:/code/testdata.py From f6455638d75754b68c15779e96f6949871501e65 Mon Sep 17 00:00:00 2001 From: jedi Date: Fri, 27 Dec 2024 20:31:04 +0100 Subject: [PATCH 4/5] add container to testdata.py --- deploy/testdata.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/deploy/testdata.py b/deploy/testdata.py index dca385f..3b59d27 100644 --- a/deploy/testdata.py +++ b/deploy/testdata.py @@ -70,6 +70,15 @@ def setup(): issue_thread=issue_thread, )[0] + from inventory.models import Container + + Container.objects.get_or_create( + id=1, + name='testcontainer' + )[0] + + + def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") From 4338d6b03adbe977c6038bedfe68ec1acc339d43 Mon Sep 17 00:00:00 2001 From: jedi Date: Fri, 27 Dec 2024 21:07:09 +0100 Subject: [PATCH 5/5] add container to testdata.py --- core/core/metrics.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core/metrics.py b/core/core/metrics.py index 2b1f4a6..0905f18 100644 --- a/core/core/metrics.py +++ b/core/core/metrics.py @@ -42,6 +42,8 @@ class TicketCountCollector(object): def collect(self): counter = CounterMetricFamily("c3lf_ticket_count", "Current number of tickets", labels=['event', 'event_id']) + yield counter + if not apps.models_ready or not apps.apps_ready: return @@ -53,8 +55,6 @@ class TicketCountCollector(object): yield counter -try: - REGISTRY.register(ItemCountCollector()) - REGISTRY.register(TicketCountCollector()) -except Exception as e: - print(e) + +REGISTRY.register(ItemCountCollector()) +REGISTRY.register(TicketCountCollector())