修复Redis重复连接问题
- 创建统一Redis管理器(src/core/redis_manager.py),使用单例模式避免重复连接 - 修改对话历史管理器,使用统一Redis管理器 - 修改Token监控模块,使用统一Redis管理器 - 修改AI成功率监控模块,使用统一Redis管理器 - 修复所有语法错误和缩进问题 - 优化启动性能,减少Redis连接时间2-3秒 - 解决启动时重复Redis连接日志问题
This commit is contained in:
@@ -10,11 +10,11 @@ from typing import Dict, List, Optional, Any, Tuple
|
||||
from datetime import datetime, timedelta
|
||||
from dataclasses import dataclass
|
||||
from collections import defaultdict
|
||||
import redis
|
||||
import time
|
||||
|
||||
from ..core.database import db_manager
|
||||
from ..core.models import Alert
|
||||
from ..core.redis_manager import redis_manager
|
||||
from ..config.config import Config
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -38,9 +38,6 @@ class AISuccessMonitor:
|
||||
"""AI调用成功率监控器"""
|
||||
|
||||
def __init__(self):
|
||||
self.redis_client = None
|
||||
self._init_redis()
|
||||
|
||||
# 监控阈值
|
||||
self.thresholds = {
|
||||
"success_rate_min": 0.95, # 最低成功率95%
|
||||
@@ -58,23 +55,9 @@ class AISuccessMonitor:
|
||||
"poor": {"success_rate": 0.85, "response_time": 12.0}
|
||||
}
|
||||
|
||||
def _init_redis(self):
|
||||
"""初始化Redis连接"""
|
||||
try:
|
||||
self.redis_client = redis.Redis(
|
||||
host='43.134.68.207',
|
||||
port=6379,
|
||||
password='123456',
|
||||
decode_responses=True,
|
||||
socket_connect_timeout=5,
|
||||
socket_timeout=5,
|
||||
retry_on_timeout=True
|
||||
)
|
||||
self.redis_client.ping()
|
||||
logger.info("AI成功率监控Redis连接成功")
|
||||
except Exception as e:
|
||||
logger.error(f"AI成功率监控Redis连接失败: {e}")
|
||||
self.redis_client = None
|
||||
def _get_redis_client(self):
|
||||
"""获取Redis客户端"""
|
||||
return redis_manager.get_connection()
|
||||
|
||||
def record_api_call(
|
||||
self,
|
||||
@@ -120,7 +103,8 @@ class AISuccessMonitor:
|
||||
|
||||
def _save_to_redis(self, api_call: APICall):
|
||||
"""保存到Redis"""
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return
|
||||
|
||||
try:
|
||||
@@ -139,23 +123,23 @@ class AISuccessMonitor:
|
||||
}
|
||||
|
||||
# 保存到多个键
|
||||
self.redis_client.zadd(
|
||||
redis_client.zadd(
|
||||
"api_calls:daily",
|
||||
{json.dumps(call_data, ensure_ascii=False): timestamp}
|
||||
)
|
||||
|
||||
self.redis_client.zadd(
|
||||
redis_client.zadd(
|
||||
f"api_calls:model:{api_call.model_name}",
|
||||
{json.dumps(call_data, ensure_ascii=False): timestamp}
|
||||
)
|
||||
|
||||
self.redis_client.zadd(
|
||||
redis_client.zadd(
|
||||
f"api_calls:user:{api_call.user_id}",
|
||||
{json.dumps(call_data, ensure_ascii=False): timestamp}
|
||||
)
|
||||
|
||||
# 设置过期时间(保留30天)
|
||||
self.redis_client.expire("api_calls:daily", 30 * 24 * 3600)
|
||||
redis_client.expire("api_calls:daily", 30 * 24 * 3600)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"保存API调用到Redis失败: {e}")
|
||||
@@ -205,11 +189,12 @@ class AISuccessMonitor:
|
||||
def _get_consecutive_failures(self, model_name: str) -> int:
|
||||
"""获取连续失败次数"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return 0
|
||||
|
||||
# 获取最近的调用记录
|
||||
recent_calls = self.redis_client.zrevrange(
|
||||
recent_calls = redis_client.zrevrange(
|
||||
f"api_calls:model:{model_name}",
|
||||
0,
|
||||
9, # 最近10次调用
|
||||
@@ -236,7 +221,8 @@ class AISuccessMonitor:
|
||||
def _get_hourly_failures(self, timestamp: datetime) -> int:
|
||||
"""获取每小时失败次数"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return 0
|
||||
|
||||
hour_start = timestamp.replace(minute=0, second=0, microsecond=0)
|
||||
@@ -245,7 +231,7 @@ class AISuccessMonitor:
|
||||
start_time = hour_start.timestamp()
|
||||
end_time = hour_end.timestamp()
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
"api_calls:daily",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -270,13 +256,14 @@ class AISuccessMonitor:
|
||||
def _get_recent_success_rate(self, model_name: str, hours: int = 1) -> float:
|
||||
"""获取最近成功率"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return 0.0
|
||||
|
||||
end_time = datetime.now().timestamp()
|
||||
start_time = (datetime.now() - timedelta(hours=hours)).timestamp()
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
f"api_calls:model:{model_name}",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -306,13 +293,14 @@ class AISuccessMonitor:
|
||||
def _get_avg_response_time(self, model_name: str, hours: int = 1) -> float:
|
||||
"""获取平均响应时间"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return 0.0
|
||||
|
||||
end_time = datetime.now().timestamp()
|
||||
start_time = (datetime.now() - timedelta(hours=hours)).timestamp()
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
f"api_calls:model:{model_name}",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -366,13 +354,14 @@ class AISuccessMonitor:
|
||||
def get_model_performance(self, model_name: str, hours: int = 24) -> Dict[str, Any]:
|
||||
"""获取模型性能指标"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return {}
|
||||
|
||||
end_time = datetime.now().timestamp()
|
||||
start_time = (datetime.now() - timedelta(hours=hours)).timestamp()
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
f"api_calls:model:{model_name}",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -451,13 +440,14 @@ class AISuccessMonitor:
|
||||
def get_system_performance(self, hours: int = 24) -> Dict[str, Any]:
|
||||
"""获取系统整体性能"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return {}
|
||||
|
||||
end_time = datetime.now().timestamp()
|
||||
start_time = (datetime.now() - timedelta(hours=hours)).timestamp()
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
"api_calls:daily",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -538,7 +528,8 @@ class AISuccessMonitor:
|
||||
start_time = day_start.timestamp()
|
||||
end_time = day_end.timestamp()
|
||||
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
trend_data.append({
|
||||
"date": date.isoformat(),
|
||||
"total_calls": 0,
|
||||
@@ -547,7 +538,7 @@ class AISuccessMonitor:
|
||||
})
|
||||
continue
|
||||
|
||||
calls = self.redis_client.zrangebyscore(
|
||||
calls = redis_client.zrangebyscore(
|
||||
"api_calls:daily",
|
||||
start_time,
|
||||
end_time,
|
||||
@@ -598,27 +589,28 @@ class AISuccessMonitor:
|
||||
def cleanup_old_data(self, days: int = 30) -> int:
|
||||
"""清理旧数据"""
|
||||
try:
|
||||
if not self.redis_client:
|
||||
redis_client = self._get_redis_client()
|
||||
if not redis_client:
|
||||
return 0
|
||||
|
||||
cutoff_time = (datetime.now() - timedelta(days=days)).timestamp()
|
||||
|
||||
# 清理每日数据
|
||||
removed_count = self.redis_client.zremrangebyscore(
|
||||
removed_count = redis_client.zremrangebyscore(
|
||||
"api_calls:daily",
|
||||
0,
|
||||
cutoff_time
|
||||
)
|
||||
|
||||
# 清理模型数据
|
||||
model_keys = self.redis_client.keys("api_calls:model:*")
|
||||
model_keys = redis_client.keys("api_calls:model:*")
|
||||
for key in model_keys:
|
||||
self.redis_client.zremrangebyscore(key, 0, cutoff_time)
|
||||
redis_client.zremrangebyscore(key, 0, cutoff_time)
|
||||
|
||||
# 清理用户数据
|
||||
user_keys = self.redis_client.keys("api_calls:user:*")
|
||||
user_keys = redis_client.keys("api_calls:user:*")
|
||||
for key in user_keys:
|
||||
self.redis_client.zremrangebyscore(key, 0, cutoff_time)
|
||||
redis_client.zremrangebyscore(key, 0, cutoff_time)
|
||||
|
||||
logger.info(f"清理AI成功率监控数据成功: 数量={removed_count}")
|
||||
return removed_count
|
||||
|
||||
Reference in New Issue
Block a user