from dash import Output, Input, html import dash_bootstrap_components as dbc from utils.logger import get_logger import psutil from config.constants.system_health_constants import ( CAPACITY_GOOD_THRESHOLD, CAPACITY_WARNING_THRESHOLD, CPU_GOOD_THRESHOLD, CPU_WARNING_THRESHOLD, MEMORY_GOOD_THRESHOLD, MEMORY_WARNING_THRESHOLD, DISK_GOOD_THRESHOLD, DISK_WARNING_THRESHOLD, BYTE_TO_GB ) logger = get_logger() def register_system_performance_callbacks(app): """Register system performance metrics callbacks.""" # System Performance Metrics @app.callback( Output('system-performance-metrics', 'children'), Input('interval-component', 'n_intervals') ) def update_system_performance(n_intervals): """Update system performance metrics.""" try: return _get_system_performance_metrics() except Exception as e: logger.error(f"Error updating system performance: {e}") return dbc.Alert( f"Error: {str(e)}", color="danger", dismissable=True ) def _get_system_performance_metrics() -> html.Div: """Get system performance metrics.""" try: cpu_percent = psutil.cpu_percent(interval=0.1) cpu_count = psutil.cpu_count() memory = psutil.virtual_memory() disk = psutil.disk_usage('/') def get_color(percent): if percent < CAPACITY_GOOD_THRESHOLD: return "success" if percent < CAPACITY_WARNING_THRESHOLD: return "warning" return "danger" return html.Div([ html.Div([ html.Strong("CPU Usage: "), dbc.Badge(f"{cpu_percent:.1f}%", color=get_color(cpu_percent)), html.Span(f" ({cpu_count} cores)", className="text-muted ms-1") ], className="mb-2"), dbc.Progress(value=cpu_percent, color=get_color(cpu_percent), style={"height": "10px"}, className="mb-3"), html.Div([ html.Strong("Memory Usage: "), dbc.Badge(f"{memory.percent:.1f}%", color=get_color(memory.percent)), html.Span(f" ({memory.used / BYTE_TO_GB:.1f} / {memory.total / BYTE_TO_GB:.1f} GB)", className="text-muted ms-1") ], className="mb-2"), dbc.Progress(value=memory.percent, color=get_color(memory.percent), style={"height": "10px"}, className="mb-3"), html.Div([ html.Strong("Disk Usage: "), dbc.Badge(f"{disk.percent:.1f}%", color=get_color(disk.percent)), html.Span(f" ({disk.used / BYTE_TO_GB:.1f} / {disk.total / BYTE_TO_GB:.1f} GB)", className="text-muted ms-1") ], className="mb-2"), dbc.Progress(value=disk.percent, color=get_color(disk.percent), style={"height": "10px"}) ]) except Exception as e: return dbc.Alert(f"Error loading performance metrics: {e}", color="danger")