建立回调日志表与外部接口日志表之间的关系

This commit is contained in:
mark.tian
2025-12-02 22:32:05 +08:00
parent f2bc3ae9bd
commit 5fc68ddb58
2 changed files with 19 additions and 9 deletions

View File

@@ -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)
# 创建数据库引擎 # 创建数据库引擎

View File

@@ -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: