ling / app /api /dashboard.py
linchuans's picture
Upload 76 files
3e35e18 verified
from fastapi import APIRouter
from datetime import datetime, timedelta
import time
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,
FAKE_STREAMING,
FAKE_STREAMING_INTERVAL,
RANDOM_STRING,
RANDOM_STRING_LENGTH,
MAX_REQUESTS_PER_MINUTE,
MAX_REQUESTS_PER_DAY_PER_IP,
CACHE_EXPIRY_TIME,
MAX_CACHE_ENTRIES,
REMOVE_CACHE_AFTER_USE,
ENABLE_RECONNECT_DETECTION,
version
)
from app.services import GeminiClient
# 创建路由器
dashboard_router = APIRouter(prefix="/api", tags=["dashboard"])
# 全局变量引用,将在init_dashboard_router中设置
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()
# 计算过去24小时的调用总数
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密钥使用统计
api_key_stats = []
for api_key in key_manager.api_keys:
# 获取API密钥前8位作为标识
api_key_id = api_key[:8]
# 计算24小时内的调用次数和按模型分类的调用次数
calls_24h = 0
model_stats = {}
if 'by_endpoint' in api_call_stats['last_24h'] and api_key in api_call_stats['last_24h']['by_endpoint']:
# 遍历所有模型
for model, model_data in api_call_stats['last_24h']['by_endpoint'][api_key].items():
model_calls = sum(model_data.values())
calls_24h += model_calls
model_stats[model] = model_calls
# 计算使用百分比
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),
'model_stats': model_stats # 添加按模型分类的统计数据
})
# 按使用百分比降序排序
api_key_stats.sort(key=lambda x: x['usage_percent'], reverse=True)
# 获取最近的日志
recent_logs = log_manager.get_recent_logs(500) # 获取最近500条日志
# 获取缓存统计
total_cache = len(response_cache_manager.cache)
valid_cache = sum(1 for _, data in response_cache_manager.cache.items()
if time.time() < data.get('expiry_time', 0))
cache_by_model = {}
# 分析缓存数据
for _, cache_data in response_cache_manager.cache.items():
if time.time() < cache_data.get('expiry_time', 0):
# 按模型统计缓存
model = cache_data.get('response', {}).model
if model:
if model in cache_by_model:
cache_by_model[model] += 1
else:
cache_by_model[model] = 1
# 获取请求历史统计
history_count = len(client_request_history)
# 获取活跃请求统计
active_count = len(active_requests_manager.active_requests)
active_done = sum(1 for task in active_requests_manager.active_requests.values() if task.done())
active_pending = active_count - active_done
# 返回JSON格式的数据
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,
# 添加配置信息
"max_requests_per_minute": MAX_REQUESTS_PER_MINUTE,
"max_requests_per_day_per_ip": MAX_REQUESTS_PER_DAY_PER_IP,
# 添加版本信息
"local_version": version["local_version"],
"remote_version": version["remote_version"],
"has_update": version["has_update"],
# 添加流式响应配置
"fake_streaming": FAKE_STREAMING,
"fake_streaming_interval": FAKE_STREAMING_INTERVAL,
# 添加随机字符串配置
"random_string": RANDOM_STRING,
"random_string_length": RANDOM_STRING_LENGTH,
# 添加缓存信息
"cache_entries": total_cache,
"valid_cache": valid_cache,
"expired_cache": total_cache - valid_cache,
"cache_expiry_time": CACHE_EXPIRY_TIME,
"max_cache_entries": MAX_CACHE_ENTRIES,
"cache_by_model": cache_by_model,
"request_history_count": history_count,
"enable_reconnect_detection": ENABLE_RECONNECT_DETECTION,
"remove_cache_after_use": REMOVE_CACHE_AFTER_USE,
# 添加活跃请求池信息
"active_count": active_count,
"active_done": active_done,
"active_pending": active_pending
}