75 lines
3.4 KiB
Python
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()
|