建立回调日志表与外部接口日志表之间的关系
This commit is contained in:
@@ -22,13 +22,14 @@ class CallbackLog(Base):
|
|||||||
request_url = Column(String(500), nullable=False)
|
request_url = Column(String(500), nullable=False)
|
||||||
request_headers = Column(JSON, nullable=False)
|
request_headers = Column(JSON, nullable=False)
|
||||||
request_body = Column(JSON, nullable=False)
|
request_body = Column(JSON, nullable=False)
|
||||||
created_at = Column(DateTime, default=datetime.utcnow)
|
created_at = Column(DateTime, default=datetime.now)
|
||||||
|
|
||||||
|
|
||||||
class ExternalApiLog(Base):
|
class ExternalApiLog(Base):
|
||||||
__tablename__ = "external_api_logs" # 重命名表,更通用
|
__tablename__ = "external_api_logs" # 重命名表,更通用
|
||||||
|
|
||||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
callback_logs_id = Column(Integer, nullable=False)
|
||||||
request_url = Column(String(500), nullable=False)
|
request_url = Column(String(500), nullable=False)
|
||||||
request_headers = Column(JSON, nullable=False)
|
request_headers = Column(JSON, nullable=False)
|
||||||
request_body = Column(JSON, nullable=False)
|
request_body = Column(JSON, nullable=False)
|
||||||
@@ -36,7 +37,7 @@ class ExternalApiLog(Base):
|
|||||||
response_headers = Column(JSON)
|
response_headers = Column(JSON)
|
||||||
response_body = Column(Text)
|
response_body = Column(Text)
|
||||||
retry_count = Column(Integer, default=0) # 重试次数
|
retry_count = Column(Integer, default=0) # 重试次数
|
||||||
created_at = Column(DateTime, default=datetime.utcnow)
|
created_at = Column(DateTime, default=datetime.now)
|
||||||
|
|
||||||
|
|
||||||
# 创建数据库引擎
|
# 创建数据库引擎
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ async def log_callback_request(
|
|||||||
request: Request,
|
request: Request,
|
||||||
site_id: str,
|
site_id: str,
|
||||||
callback_data: CallbackRequest
|
callback_data: CallbackRequest
|
||||||
):
|
) -> Optional[int]:
|
||||||
"""记录回调请求到数据库"""
|
"""记录回调请求到数据库,返回记录ID"""
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# 获取客户端IP地址
|
# 获取客户端IP地址
|
||||||
@@ -97,14 +97,18 @@ async def log_callback_request(
|
|||||||
|
|
||||||
logger.info(f"✅ 回调请求记录成功保存到数据库,ID: {callback_log.id}")
|
logger.info(f"✅ 回调请求记录成功保存到数据库,ID: {callback_log.id}")
|
||||||
|
|
||||||
|
# 返回记录ID
|
||||||
|
return callback_log.id
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"❌ 保存回调请求到数据库失败: {e}", exc_info=True)
|
logger.error(f"❌ 保存回调请求到数据库失败: {e}", exc_info=True)
|
||||||
# 不重新抛出异常,避免影响主业务流程
|
# 不重新抛出异常,避免影响主业务流程
|
||||||
pass
|
return None
|
||||||
|
|
||||||
|
|
||||||
async def log_external_api_request(
|
async def log_external_api_request(
|
||||||
db: AsyncSession,
|
db: AsyncSession,
|
||||||
|
callback_logs_id: int,
|
||||||
request_url: str,
|
request_url: str,
|
||||||
request_headers: Dict[str, Any],
|
request_headers: Dict[str, Any],
|
||||||
request_body: Dict[str, Any],
|
request_body: Dict[str, Any],
|
||||||
@@ -115,6 +119,7 @@ async def log_external_api_request(
|
|||||||
):
|
):
|
||||||
"""记录外部API请求到数据库"""
|
"""记录外部API请求到数据库"""
|
||||||
external_api_log = ExternalApiLog(
|
external_api_log = ExternalApiLog(
|
||||||
|
callback_logs_id=callback_logs_id,
|
||||||
request_url=request_url,
|
request_url=request_url,
|
||||||
request_headers=request_headers,
|
request_headers=request_headers,
|
||||||
request_body=request_body,
|
request_body=request_body,
|
||||||
@@ -130,7 +135,8 @@ async def log_external_api_request(
|
|||||||
async def call_external_api_with_retry(
|
async def call_external_api_with_retry(
|
||||||
db: AsyncSession,
|
db: AsyncSession,
|
||||||
request_body: Dict[str, Any],
|
request_body: Dict[str, Any],
|
||||||
max_retries: int = None
|
max_retries: int = None,
|
||||||
|
callback_logs_id: int = None
|
||||||
) -> tuple[bool, int]:
|
) -> tuple[bool, int]:
|
||||||
"""
|
"""
|
||||||
调用外部API并支持重试机制
|
调用外部API并支持重试机制
|
||||||
@@ -153,7 +159,7 @@ async def call_external_api_with_retry(
|
|||||||
"User-Agent": "AITalkCallbackService/1.0"
|
"User-Agent": "AITalkCallbackService/1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
for attempt in range(max_retries + 1): # +1 因为第一次不算重试
|
for attempt in range(1, max_retries+1):
|
||||||
try:
|
try:
|
||||||
logger.debug(f"📤 第{attempt + 1}次尝试调用外部API")
|
logger.debug(f"📤 第{attempt + 1}次尝试调用外部API")
|
||||||
|
|
||||||
@@ -169,6 +175,7 @@ async def call_external_api_with_retry(
|
|||||||
# 记录每次尝试的结果
|
# 记录每次尝试的结果
|
||||||
await log_external_api_request(
|
await log_external_api_request(
|
||||||
db=db,
|
db=db,
|
||||||
|
callback_logs_id=callback_logs_id,
|
||||||
request_url=settings.external_api_url,
|
request_url=settings.external_api_url,
|
||||||
request_headers=headers,
|
request_headers=headers,
|
||||||
request_body=request_body,
|
request_body=request_body,
|
||||||
@@ -200,6 +207,7 @@ async def call_external_api_with_retry(
|
|||||||
# 记录网络错误
|
# 记录网络错误
|
||||||
await log_external_api_request(
|
await log_external_api_request(
|
||||||
db=db,
|
db=db,
|
||||||
|
callback_logs_id=callback_logs_id,
|
||||||
request_url=settings.external_api_url,
|
request_url=settings.external_api_url,
|
||||||
request_headers=headers,
|
request_headers=headers,
|
||||||
request_body=request_body,
|
request_body=request_body,
|
||||||
@@ -235,7 +243,7 @@ async def ai_talk_callback(
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# 记录回调请求(包含siteId)
|
# 记录回调请求(包含siteId)
|
||||||
await log_callback_request(db, request, siteId, callback_data)
|
callback_log_id = await log_callback_request(db, request, siteId, callback_data)
|
||||||
|
|
||||||
# 判断count是否大于等于阈值,如果是直接返回
|
# 判断count是否大于等于阈值,如果是直接返回
|
||||||
if callback_data.count >= settings.count_threshold:
|
if callback_data.count >= settings.count_threshold:
|
||||||
@@ -259,7 +267,8 @@ async def ai_talk_callback(
|
|||||||
success, retry_count = await call_external_api_with_retry(
|
success, retry_count = await call_external_api_with_retry(
|
||||||
db=db,
|
db=db,
|
||||||
request_body=request_body,
|
request_body=request_body,
|
||||||
max_retries=settings.external_api_retry_max
|
max_retries=settings.external_api_retry_max,
|
||||||
|
callback_logs_id=callback_log_id
|
||||||
)
|
)
|
||||||
|
|
||||||
if success:
|
if success:
|
||||||
|
|||||||
Reference in New Issue
Block a user