From 3d02c7a11186bac8013c90271e9f3b2cb7907b0d Mon Sep 17 00:00:00 2001 From: UserIsMH Date: Sat, 21 Jun 2025 19:16:47 +0200 Subject: [PATCH] Service Status im Dashboard --- v2_adminpanel/routes/admin_routes.py | 80 ++++++ v2_adminpanel/routes/monitoring_routes.py | 51 ---- v2_adminpanel/templates/base.html | 8 +- v2_adminpanel/templates/dashboard.html | 46 ++++ .../templates/monitoring/system_status.html | 240 ------------------ 5 files changed, 127 insertions(+), 298 deletions(-) delete mode 100644 v2_adminpanel/templates/monitoring/system_status.html diff --git a/v2_adminpanel/routes/admin_routes.py b/v2_adminpanel/routes/admin_routes.py index 775d277..3d23e55 100644 --- a/v2_adminpanel/routes/admin_routes.py +++ b/v2_adminpanel/routes/admin_routes.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta from zoneinfo import ZoneInfo from pathlib import Path from flask import Blueprint, render_template, request, redirect, session, url_for, flash, send_file, jsonify, current_app +import requests import config from auth.decorators import login_required @@ -16,6 +17,81 @@ from utils.export import create_excel_export, prepare_audit_export_data admin_bp = Blueprint('admin', __name__) +def check_service_health(): + """Check health status of critical services""" + services = [] + + # License Server Health Check + license_server = { + 'name': 'License Server', + 'status': 'unknown', + 'response_time': None, + 'icon': '🔐', + 'details': None + } + + try: + start_time = datetime.now() + response = requests.get('http://license-server:8443/health', timeout=2) + response_time = (datetime.now() - start_time).total_seconds() * 1000 + + if response.status_code == 200: + license_server['status'] = 'healthy' + license_server['response_time'] = round(response_time, 1) + license_server['details'] = 'Betriebsbereit' + else: + license_server['status'] = 'unhealthy' + license_server['details'] = f'HTTP {response.status_code}' + except requests.exceptions.Timeout: + license_server['status'] = 'down' + license_server['details'] = 'Timeout - Server antwortet nicht' + except requests.exceptions.ConnectionError: + license_server['status'] = 'down' + license_server['details'] = 'Verbindung fehlgeschlagen' + except Exception as e: + license_server['status'] = 'down' + license_server['details'] = f'Fehler: {str(e)}' + + services.append(license_server) + + # PostgreSQL Health Check + postgresql = { + 'name': 'PostgreSQL', + 'status': 'unknown', + 'response_time': None, + 'icon': '🗄️', + 'details': None + } + + try: + start_time = datetime.now() + with get_db_connection() as conn: + cur = conn.cursor() + cur.execute('SELECT 1') + cur.close() + response_time = (datetime.now() - start_time).total_seconds() * 1000 + + postgresql['status'] = 'healthy' + postgresql['response_time'] = round(response_time, 1) + postgresql['details'] = 'Datenbankverbindung aktiv' + except Exception as e: + postgresql['status'] = 'down' + postgresql['details'] = f'Verbindungsfehler: {str(e)}' + + services.append(postgresql) + + # Calculate overall health + healthy_count = sum(1 for s in services if s['status'] == 'healthy') + total_count = len(services) + + return { + 'services': services, + 'healthy_count': healthy_count, + 'total_count': total_count, + 'overall_status': 'healthy' if healthy_count == total_count else ('partial' if healthy_count > 0 else 'down') + } + + @admin_bp.route("/") @login_required def dashboard(): @@ -258,6 +334,9 @@ def dashboard(): license_distribution = [] hourly_sessions = [] + # Get service health status + service_health = check_service_health() + return render_template('dashboard.html', stats=stats, top_licenses=top_licenses, @@ -265,6 +344,7 @@ def dashboard(): license_distribution=license_distribution, hourly_sessions=hourly_sessions, resource_stats=resource_stats, + service_health=service_health, username=session.get('username')) finally: cur.close() diff --git a/v2_adminpanel/routes/monitoring_routes.py b/v2_adminpanel/routes/monitoring_routes.py index 08c3eba..bc3b115 100644 --- a/v2_adminpanel/routes/monitoring_routes.py +++ b/v2_adminpanel/routes/monitoring_routes.py @@ -182,57 +182,6 @@ def live_dashboard(): error_message='Fehler beim Laden des Dashboards', details=str(e)) -@monitoring_bp.route('/system-status') -@login_required -def system_status(): - """System status showing service health""" - services = [] - - # Check each service - service_checks = [ - {'name': 'License Server', 'url': 'http://license-server:8443/health', 'port': 8443}, - {'name': 'PostgreSQL', 'check': 'database'}, - ] - - for service in service_checks: - status = {'name': service['name'], 'status': 'unknown', 'response_time': None} - - try: - if service.get('check') == 'database': - # Check database - start = datetime.now() - conn = get_db_connection() - conn.close() - status['status'] = 'healthy' - status['response_time'] = (datetime.now() - start).total_seconds() * 1000 - elif service.get('url'): - # Check HTTP service - start = datetime.now() - response = requests.get(service['url'], timeout=2) - if response.status_code == 200: - status['status'] = 'healthy' - else: - status['status'] = 'unhealthy' - status['response_time'] = (datetime.now() - start).total_seconds() * 1000 - except Exception as e: - status['status'] = 'down' - logging.error(f"Health check failed for {service['name']}: {str(e)}") - - services.append(status) - - # Get Prometheus metrics if available - prometheus_data = None - try: - response = requests.get('http://prometheus:9090/api/v1/query', - params={'query': 'up'}, timeout=2) - if response.status_code == 200: - prometheus_data = response.json() - except: - pass - - return render_template('monitoring/system_status.html', - services=services, - prometheus_data=prometheus_data) @monitoring_bp.route('/alerts') @login_required diff --git a/v2_adminpanel/templates/base.html b/v2_adminpanel/templates/base.html index fe3580c..29b303c 100644 --- a/v2_adminpanel/templates/base.html +++ b/v2_adminpanel/templates/base.html @@ -415,18 +415,12 @@ -