|
|
from fastapi import APIRouter
|
|
|
from datetime import datetime, timedelta
|
|
|
from app.utils import (
|
|
|
log_manager,
|
|
|
ResponseCacheManager,
|
|
|
ActiveRequestsManager,
|
|
|
clean_expired_stats
|
|
|
)
|
|
|
from app.config.settings import (
|
|
|
api_call_stats,
|
|
|
client_request_history,
|
|
|
API_KEY_DAILY_LIMIT
|
|
|
)
|
|
|
from app.services import GeminiClient
|
|
|
|
|
|
|
|
|
dashboard_router = APIRouter(prefix="/api", tags=["dashboard"])
|
|
|
|
|
|
|
|
|
key_manager = None
|
|
|
response_cache_manager = None
|
|
|
active_requests_manager = None
|
|
|
|
|
|
def init_dashboard_router(
|
|
|
key_mgr,
|
|
|
cache_mgr,
|
|
|
active_req_mgr
|
|
|
):
|
|
|
"""初始化仪表盘路由器"""
|
|
|
global key_manager, response_cache_manager, active_requests_manager
|
|
|
key_manager = key_mgr
|
|
|
response_cache_manager = cache_mgr
|
|
|
active_requests_manager = active_req_mgr
|
|
|
return dashboard_router
|
|
|
|
|
|
@dashboard_router.get("/dashboard-data")
|
|
|
async def get_dashboard_data():
|
|
|
"""获取仪表盘数据的API端点,用于动态刷新"""
|
|
|
|
|
|
clean_expired_stats(api_call_stats)
|
|
|
response_cache_manager.clean_expired()
|
|
|
active_requests_manager.clean_completed()
|
|
|
|
|
|
|
|
|
now = datetime.now()
|
|
|
|
|
|
|
|
|
last_24h_calls = sum(api_call_stats['last_24h']['total'].values())
|
|
|
|
|
|
|
|
|
one_hour_ago = now - timedelta(hours=1)
|
|
|
hourly_calls = 0
|
|
|
for hour_key, count in api_call_stats['hourly']['total'].items():
|
|
|
try:
|
|
|
hour_time = datetime.strptime(hour_key, '%Y-%m-%d %H:00')
|
|
|
if hour_time >= one_hour_ago:
|
|
|
hourly_calls += count
|
|
|
except ValueError:
|
|
|
continue
|
|
|
|
|
|
|
|
|
one_minute_ago = now - timedelta(minutes=1)
|
|
|
minute_calls = 0
|
|
|
for minute_key, count in api_call_stats['minute']['total'].items():
|
|
|
try:
|
|
|
minute_time = datetime.strptime(minute_key, '%Y-%m-%d %H:%M')
|
|
|
if minute_time >= one_minute_ago:
|
|
|
minute_calls += count
|
|
|
except ValueError:
|
|
|
continue
|
|
|
|
|
|
|
|
|
api_key_stats = []
|
|
|
for api_key in key_manager.api_keys:
|
|
|
|
|
|
api_key_id = api_key[:8]
|
|
|
|
|
|
|
|
|
calls_24h = 0
|
|
|
if 'by_endpoint' in api_call_stats['last_24h'] and api_key in api_call_stats['last_24h']['by_endpoint']:
|
|
|
calls_24h = sum(api_call_stats['last_24h']['by_endpoint'][api_key].values())
|
|
|
|
|
|
|
|
|
usage_percent = (calls_24h / API_KEY_DAILY_LIMIT) * 100 if API_KEY_DAILY_LIMIT > 0 else 0
|
|
|
|
|
|
|
|
|
api_key_stats.append({
|
|
|
'api_key': api_key_id,
|
|
|
'calls_24h': calls_24h,
|
|
|
'limit': API_KEY_DAILY_LIMIT,
|
|
|
'usage_percent': round(usage_percent, 2)
|
|
|
})
|
|
|
|
|
|
|
|
|
api_key_stats.sort(key=lambda x: x['usage_percent'], reverse=True)
|
|
|
|
|
|
|
|
|
recent_logs = log_manager.get_recent_logs(50)
|
|
|
|
|
|
|
|
|
return {
|
|
|
"key_count": len(key_manager.api_keys),
|
|
|
"model_count": len(GeminiClient.AVAILABLE_MODELS),
|
|
|
"retry_count": len(key_manager.api_keys),
|
|
|
"last_24h_calls": last_24h_calls,
|
|
|
"hourly_calls": hourly_calls,
|
|
|
"minute_calls": minute_calls,
|
|
|
"current_time": datetime.now().strftime('%H:%M:%S'),
|
|
|
"logs": recent_logs,
|
|
|
"api_key_stats": api_key_stats
|
|
|
} |