Skip to content

Commit

Permalink
feat: metrics tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
helllllllder committed Jul 12, 2023
1 parent 66fde2a commit 5074803
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 41 deletions.
12 changes: 11 additions & 1 deletion chats/apps/api/v1/external/rooms/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import json

from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import IntegrityError
from django.db import IntegrityError, transaction
from django.utils import timezone
from rest_framework import status, viewsets
from rest_framework.decorators import action
Expand All @@ -14,6 +15,7 @@
from chats.apps.api.v1.external.rooms.serializers import RoomFlowSerializer
from chats.apps.api.v1.internal.rest_clients.flows_rest_client import FlowRESTClient
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.dashboard.tasks import close_metrics
from chats.apps.rooms.models import Room


Expand Down Expand Up @@ -63,6 +65,14 @@ def close(
instance.close(None, "agent")
serialized_data = RoomFlowSerializer(instance=instance)
instance.notify_queue("close")
if not settings.ACTIVATE_CALC_METRICS:
return Response(serialized_data.data, status=status.HTTP_200_OK)

transaction.on_commit(
lambda: close_metrics.apply_async(
args=[str(instance.pk)], queue=settings.METRICS_CUSTOM_QUEUE
)
)
return Response(serialized_data.data, status=status.HTTP_200_OK)

def create(self, request, *args, **kwargs):
Expand Down
44 changes: 4 additions & 40 deletions chats/apps/api/v1/rooms/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import json

from django.conf import settings
from django.db.models import F, Max, Sum
from django.db.models import Max
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, mixins, permissions, status
Expand All @@ -18,8 +18,8 @@
TransferRoomSerializer,
)
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.msgs.models import Message
from chats.apps.rooms.models import Room
from chats.celery import app as celery_app


class RoomViewset(
Expand Down Expand Up @@ -111,44 +111,8 @@ def close(
if not settings.ACTIVATE_CALC_METRICS:
return Response(serialized_data.data, status=status.HTTP_200_OK)

messages_contact = (
Message.objects.filter(room=instance, contact__isnull=False)
.order_by("created_on")
.first()
)
messages_agent = (
Message.objects.filter(room=instance, user__isnull=False)
.order_by("created_on")
.first()
)

time_message_contact = 0
time_message_agent = 0

if messages_agent and messages_contact:
time_message_agent = messages_agent.created_on.timestamp()
time_message_contact = messages_contact.created_on.timestamp()
else:
time_message_agent = 0
time_message_contact = 0

difference_time = time_message_agent - time_message_contact

interation_time = (
Room.objects.filter(pk=instance.pk)
.aggregate(
avg_time=Sum(
F("ended_at") - F("created_on"),
)
)["avg_time"]
.total_seconds()
)

metric_room = RoomMetrics.objects.get_or_create(room=instance)[0]
metric_room.message_response_time = difference_time
metric_room.interaction_time = interation_time
metric_room.save()

close_metrics = celery_app.send_task("close_metrics", args=[str(instance.pk)])
close_metrics.wait()
return Response(serialized_data.data, status=status.HTTP_200_OK)

def perform_create(self, serializer):
Expand Down
32 changes: 32 additions & 0 deletions chats/apps/dashboard/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from chats.apps.dashboard.models import RoomMetrics
from chats.apps.rooms.models import Room
from chats.celery import app


@app.task(name="close_metrics")
def close_metrics(room: str):
room = Room.objects.get(pk=room)
messages_contact = (
room.messages.filter(contact__isnull=False).order_by("created_on").first()
)
messages_agent = (
room.messages.filter(user__isnull=False).order_by("created_on").first()
)

time_message_contact = 0
time_message_agent = 0

if messages_agent and messages_contact:
time_message_agent = messages_agent.created_on.timestamp()
time_message_contact = messages_contact.created_on.timestamp()
else:
time_message_agent = 0
time_message_contact = 0

difference_time = time_message_agent - time_message_contact
interaction_time = room.ended_at - room.created_on

metric_room = RoomMetrics.objects.get_or_create(room=room)[0]
metric_room.message_response_time = difference_time
metric_room.interaction_time = interaction_time.total_seconds()
metric_room.save()
2 changes: 2 additions & 0 deletions chats/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,8 @@

# Celery

METRICS_CUSTOM_QUEUE = env("METRICS_CUSTOM_QUEUE", default="celery")

CELERY_BROKER_URL = env.str("CELERY_BROKER_URL", default=REDIS_URL)
CELERY_RESULT_BACKEND = env.str("CELERY_RESULT_BACKEND", default="django-db")
CELERY_ACCEPT_CONTENT = ["application/json"]
Expand Down

0 comments on commit 5074803

Please sign in to comment.