old_console/dashboard/tasks.py
2024-11-02 14:12:45 +03:00

75 lines
3.4 KiB
Python

import json
import logging
import redis
from celery import shared_task
from django.conf import settings
from core.utils import dtnow
from dashboard.utils import RedisInstances
from incident.models import Incident
_log = logging.getLogger(__name__)
redis_instance = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)
def update_incs_by_time_statistics():
""" Task for updating data for incidents by time widget """
_log.info('Starting update of the incidents statistics')
# Getting day data from REDIS
day_data = redis_instance.get(RedisInstances.WIDGET_INCS_BY_TIME_DAY)
week_data = redis_instance.get(RedisInstances.WIDGET_INCS_BY_TIME_WEEK)
month_data = redis_instance.get(RedisInstances.WIDGET_INCS_BY_TIME_MONTH)
year_data = redis_instance.get(RedisInstances.WIDGET_INCS_BY_TIME_YEAR)
day_data = json.loads(day_data)
week_data = json.loads(week_data)
month_data = json.loads(month_data)
year_data = json.loads(year_data)
# Getting amount of incidents happened in last 1 minute
now = dtnow()
one_minute_gap = dtnow(minutes=-1)
amount_of_incidents_within_a_minute = Incident.objects.filter(timestamp__range=(one_minute_gap, now)).count()
# Check if hour is changed
if one_minute_gap.hour != now.hour:
day_data.pop(0)
# Appending new number to the list
day_data.append(amount_of_incidents_within_a_minute)
# Updating redis data for the day
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_DAY, json.dumps(day_data))
else:
day_data[-1] = day_data[-1] + amount_of_incidents_within_a_minute
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_DAY, json.dumps(day_data))
# Check if day is changed
if one_minute_gap.day != now.day:
# Popping the first element of week and month data and appending sum of last day incidents
week_data.pop(0)
month_data.pop(0)
week_data.append(amount_of_incidents_within_a_minute)
month_data.append(amount_of_incidents_within_a_minute)
# Setting new REDIS value of week and month incidents list
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_WEEK, json.dumps(week_data))
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_MONTH, json.dumps(month_data))
else:
week_data[-1] = week_data[-1] + amount_of_incidents_within_a_minute
month_data[-1] = month_data[-1] + amount_of_incidents_within_a_minute
# Setting new REDIS value of week and month incidents list
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_WEEK, json.dumps(week_data))
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_MONTH, json.dumps(month_data))
# Check if year is changed
if one_minute_gap.month != now.month:
# Popping first element in year list
year_data.pop(0)
year_data.append(amount_of_incidents_within_a_minute)
# Setting new REDIS value of year incidents list
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_YEAR, json.dumps(year_data))
else:
year_data[-1] = year_data[-1] + amount_of_incidents_within_a_minute
# Setting new REDIS value of year incidents list
redis_instance.set(RedisInstances.WIDGET_INCS_BY_TIME_YEAR, json.dumps(year_data))
@shared_task
def update_statistics_task():
# update_events_by_time_statistics()
update_incs_by_time_statistics()