第一次提交
This commit is contained in:
166
app/api/monitoring.py
Normal file
166
app/api/monitoring.py
Normal file
@@ -0,0 +1,166 @@
|
||||
"""
|
||||
系统监控和健康检查API
|
||||
提供系统状态、性能指标和健康检查功能
|
||||
"""
|
||||
from flask import jsonify, current_app
|
||||
from datetime import datetime, timedelta
|
||||
import psutil
|
||||
import time
|
||||
from app import db
|
||||
from app.models import License, Product, Order, Ticket, Device
|
||||
from . import api_bp
|
||||
|
||||
|
||||
@api_bp.route('/health', methods=['GET'])
|
||||
def health_check():
|
||||
"""
|
||||
健康检查端点
|
||||
返回系统的基本健康状态
|
||||
"""
|
||||
try:
|
||||
# 检查数据库连接
|
||||
db.session.execute('SELECT 1')
|
||||
|
||||
health_status = {
|
||||
'status': 'healthy',
|
||||
'timestamp': datetime.utcnow().isoformat(),
|
||||
'version': current_app.config.get('API_VERSION', 'v1'),
|
||||
'environment': 'production' if not current_app.debug else 'development'
|
||||
}
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': health_status
|
||||
}), 200
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"健康检查失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'status': 'unhealthy',
|
||||
'error': str(e),
|
||||
'timestamp': datetime.utcnow().isoformat()
|
||||
}), 503
|
||||
|
||||
|
||||
@api_bp.route('/metrics', methods=['GET'])
|
||||
def system_metrics():
|
||||
"""
|
||||
系统性能指标端点
|
||||
返回系统的性能指标(Prometheus格式)
|
||||
"""
|
||||
try:
|
||||
# CPU使用率
|
||||
cpu_percent = psutil.cpu_percent(interval=1)
|
||||
|
||||
# 内存使用情况
|
||||
memory = psutil.virtual_memory()
|
||||
|
||||
# 磁盘使用情况
|
||||
disk = psutil.disk_usage('/')
|
||||
|
||||
# 数据库统计
|
||||
stats = get_database_stats()
|
||||
|
||||
metrics = {
|
||||
'system': {
|
||||
'cpu_usage_percent': cpu_percent,
|
||||
'memory': {
|
||||
'total': memory.total,
|
||||
'available': memory.available,
|
||||
'used': memory.used,
|
||||
'percent': memory.percent
|
||||
},
|
||||
'disk': {
|
||||
'total': disk.total,
|
||||
'used': disk.used,
|
||||
'free': disk.free,
|
||||
'percent': (disk.used / disk.total) * 100
|
||||
}
|
||||
},
|
||||
'database': stats,
|
||||
'timestamp': datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': metrics
|
||||
}), 200
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"获取系统指标失败: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': str(e),
|
||||
'timestamp': datetime.utcnow().isoformat()
|
||||
}), 500
|
||||
|
||||
|
||||
def get_database_stats():
|
||||
"""获取数据库统计信息"""
|
||||
try:
|
||||
# 卡密统计
|
||||
total_licenses = License.query.count()
|
||||
active_licenses = License.query.filter_by(status=1).count()
|
||||
expired_licenses = License.query.filter_by(status=2).count()
|
||||
|
||||
# 产品统计
|
||||
total_products = Product.query.filter_by(status=1).count()
|
||||
|
||||
# 订单统计
|
||||
total_orders = Order.query.count()
|
||||
paid_orders = Order.query.filter_by(status=1).count()
|
||||
pending_orders = Order.query.filter_by(status=0).count()
|
||||
|
||||
# 工单统计
|
||||
total_tickets = Ticket.query.count()
|
||||
open_tickets = Ticket.query.filter_by(status__in=[0, 1]).count()
|
||||
|
||||
# 设备统计
|
||||
total_devices = Device.query.filter_by(status=1).count()
|
||||
|
||||
# 最近24小时的订单
|
||||
yesterday = datetime.utcnow() - timedelta(days=1)
|
||||
recent_orders = Order.query.filter(Order.create_time >= yesterday).count()
|
||||
|
||||
return {
|
||||
'licenses': {
|
||||
'total': total_licenses,
|
||||
'active': active_licenses,
|
||||
'expired': expired_licenses,
|
||||
'inactive': total_licenses - active_licenses - expired_licenses
|
||||
},
|
||||
'products': {
|
||||
'total': total_products
|
||||
},
|
||||
'orders': {
|
||||
'total': total_orders,
|
||||
'paid': paid_orders,
|
||||
'pending': pending_orders,
|
||||
'recent_24h': recent_orders
|
||||
},
|
||||
'tickets': {
|
||||
'total': total_tickets,
|
||||
'open': open_tickets
|
||||
},
|
||||
'devices': {
|
||||
'total': total_devices
|
||||
}
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f"获取数据库统计失败: {str(e)}")
|
||||
return {}
|
||||
|
||||
|
||||
@api_bp.route('/ping', methods=['GET'])
|
||||
def ping():
|
||||
"""
|
||||
简单的ping端点
|
||||
用于快速检查服务是否可用
|
||||
"""
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': 'pong',
|
||||
'timestamp': datetime.utcnow().isoformat()
|
||||
}), 200
|
||||
Reference in New Issue
Block a user