Build lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Handler 共享工具"""
|
||||
import logging
|
||||
from typing import Any, Dict
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def format_size(size_bytes: int) -> str:
|
||||
"""格式化字节大小"""
|
||||
if not size_bytes:
|
||||
return "0 bytes"
|
||||
if size_bytes >= 1073741824:
|
||||
return f"{size_bytes / 1073741824:.2f} GB"
|
||||
if size_bytes >= 1048576:
|
||||
return f"{size_bytes / 1048576:.2f} MB"
|
||||
if size_bytes >= 1024:
|
||||
return f"{size_bytes / 1024:.2f} KB"
|
||||
return f"{size_bytes} bytes"
|
||||
|
||||
|
||||
def serialize_row(row: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""序列化行数据"""
|
||||
for key, value in row.items():
|
||||
if hasattr(value, "isoformat"):
|
||||
row[key] = value.isoformat()
|
||||
elif isinstance(value, bytes):
|
||||
row[key] = value.decode("utf-8", errors="replace")
|
||||
elif isinstance(value, (set, frozenset)):
|
||||
row[key] = list(value)
|
||||
return row
|
||||
|
||||
|
||||
def format_connection_error(exc: Exception) -> str:
|
||||
"""将驱动异常转为可读的错误详情"""
|
||||
if exc is None:
|
||||
return "未知错误"
|
||||
msg = str(exc).strip()
|
||||
if msg:
|
||||
return msg
|
||||
return exc.__class__.__name__
|
||||
|
||||
|
||||
def log_database_connect_failure(
|
||||
*,
|
||||
db_type: str,
|
||||
host: str,
|
||||
port: int,
|
||||
user: str = "",
|
||||
database: str = "",
|
||||
db_name: str = "",
|
||||
detail: str,
|
||||
action: str = "connect",
|
||||
) -> None:
|
||||
"""记录数据库连接失败详情到后台日志"""
|
||||
logger.error(
|
||||
"Database connection failed [%s]: db_name=%s db_type=%s target=%s:%s "
|
||||
"database=%s user=%s error=%s",
|
||||
action,
|
||||
db_name or "-",
|
||||
db_type,
|
||||
host,
|
||||
port,
|
||||
database or "-",
|
||||
user or "-",
|
||||
detail,
|
||||
)
|
||||
Reference in New Issue
Block a user