|
| 1 | +"""STATUS MONITORING TASKS""" |
| 2 | + |
| 3 | +from __future__ import absolute_import, division, print_function |
| 4 | + |
| 5 | +import logging |
| 6 | + |
| 7 | +import psutil |
| 8 | +import rollbar |
| 9 | +from celery import Task |
| 10 | +from sqlalchemy import func |
| 11 | + |
| 12 | +from gefapi import celery, db |
| 13 | +from gefapi.models import Execution, Script, StatusLog, User |
| 14 | + |
| 15 | +logger = logging.getLogger() |
| 16 | + |
| 17 | + |
| 18 | +class StatusMonitoringTask(Task): |
| 19 | + """Base task for status monitoring""" |
| 20 | + |
| 21 | + def on_failure(self, exc, task_id, args, kwargs, einfo): |
| 22 | + logger.error(f"Status monitoring task failed: {exc}") |
| 23 | + rollbar.report_exc_info() |
| 24 | + |
| 25 | + |
| 26 | +@celery.task(base=StatusMonitoringTask, bind=True) |
| 27 | +def collect_system_status(self): |
| 28 | + """Collect system status and save to status_log table""" |
| 29 | + logger.info("[TASK]: Collecting system status") |
| 30 | + |
| 31 | + try: |
| 32 | + # Count executions by status |
| 33 | + execution_counts = ( |
| 34 | + db.session.query(Execution.status, func.count(Execution.id)) |
| 35 | + .group_by(Execution.status) |
| 36 | + .all() |
| 37 | + ) |
| 38 | + |
| 39 | + execution_status_map = dict(execution_counts) |
| 40 | + executions_active = execution_status_map.get("ACTIVE", 0) |
| 41 | + executions_ready = execution_status_map.get("READY", 0) |
| 42 | + executions_running = execution_status_map.get("RUNNING", 0) |
| 43 | + executions_finished = execution_status_map.get("FINISHED", 0) |
| 44 | + |
| 45 | + # Count users and scripts |
| 46 | + users_count = db.session.query(func.count(User.id)).scalar() |
| 47 | + scripts_count = db.session.query(func.count(Script.id)).scalar() |
| 48 | + |
| 49 | + # Get system metrics |
| 50 | + memory = psutil.virtual_memory() |
| 51 | + memory_available_percent = memory.available / memory.total * 100 |
| 52 | + cpu_usage_percent = psutil.cpu_percent(interval=1) |
| 53 | + |
| 54 | + # Create status log entry |
| 55 | + status_log = StatusLog( |
| 56 | + executions_active=executions_active, |
| 57 | + executions_ready=executions_ready, |
| 58 | + executions_running=executions_running, |
| 59 | + executions_finished=executions_finished, |
| 60 | + users_count=users_count, |
| 61 | + scripts_count=scripts_count, |
| 62 | + memory_available_percent=memory_available_percent, |
| 63 | + cpu_usage_percent=cpu_usage_percent, |
| 64 | + ) |
| 65 | + |
| 66 | + logger.info("[DB]: ADD") |
| 67 | + db.session.add(status_log) |
| 68 | + db.session.commit() |
| 69 | + |
| 70 | + logger.info(f"[TASK]: Status log created with ID {status_log.id}") |
| 71 | + return status_log.serialize() |
| 72 | + |
| 73 | + except Exception as error: |
| 74 | + logger.error(f"[TASK]: Error collecting system status: {str(error)}") |
| 75 | + rollbar.report_exc_info() |
| 76 | + db.session.rollback() |
| 77 | + raise error |
0 commit comments