""" Statistics Blueprintoutput_dir Provides API statistics and monitoring endpoints. """ import time from flask import Blueprint, current_app from ..shared import _format_response, log_performance, logger, stats_collector # Create blueprint stats_bp = Blueprint('stats', __name__, url_prefix='/stats') @stats_bp.route('', methods=['GET']) @log_performance def get_stats(): """Get detailed API statistics and monitoring data.""" logger.debug("Statistics requested") try: # Get detailed statistics stats_data = stats_collector.get_summary() # Add current system information try: import psutil memory = psutil.virtual_memory() disk = psutil.disk_usage(str(current_app.config['OUTPUT_FOLDER'])) stats_data['system'] = { 'memory_usage_percent': memory.percent, 'memory_used_gb': round(memory.used / (1024**3), 2), 'memory_total_gb': round(memory.total / (1024**3), 2), 'disk_usage_percent': disk.percent, 'disk_used_gb': round(disk.used / (1024**3), 2), 'disk_total_gb': round(disk.total / (1024**3), 2) } except ImportError: # psutil not available stats_data['system'] = { 'note': 'System metrics unavailable - install psutil for detailed monitoring' } except Exception as e: logger.warning(f"Failed to collect system metrics: {e}") stats_data['system'] = {'error': str(e)} # Add recent task information from database recent_tasks = [] try: from ..db import get_db db = get_db() current_time = time.time() rows = db.execute(""" SELECT task_id, status, message, updated_at FROM tasks WHERE deleted_at IS NULL ORDER BY updated_at DESC LIMIT 20 """).fetchall() for row in rows: updated_at = row[3] if row[3] else 0 age = current_time - updated_at recent_tasks.append({ 'task_id': row[0], # task_id 'status': row[1], # status 'age_seconds': round(age, 1), 'message': (row[2] or '')[:100] # message, truncate long messages }) except Exception as e: logger.warning(f"Failed to get recent tasks from database: {e}") recent_tasks = [] stats_data['recent_tasks'] = recent_tasks return _format_response(200, "统计信息获取成功", stats_data) except Exception as e: logger.error(f"Failed to retrieve statistics: {str(e)}", exc_info=True) return _format_response(500, "获取统计信息失败", { "error_details": str(e) }) @stats_bp.route('/reset', methods=['POST']) @log_performance def reset_stats(): """Reset API statistics (admin function).""" logger.warning("Statistics reset requested") try: # Reset statistics stats_collector.reset_stats() # Log the reset logger.info("API statistics have been reset") return _format_response(200, "统计信息重置成功", { "timestamp": time.time() }) except Exception as e: logger.error(f"Failed to reset statistics: {str(e)}", exc_info=True) return _format_response(500, "重置统计信息失败", { "error_details": str(e) })