main:删除 Grafana 仪表板配置文件

更新内容:
- 移除 `dashboard.json` 文件,清理不再需要的 Grafana 仪表板配置。
- 简化项目目录结构,删除多余的监控配置以优化维护。
This commit is contained in:
2026-02-02 18:40:16 +08:00
parent 3e1d850954
commit 683bf8a6ca
20 changed files with 2103 additions and 18 deletions

View File

@@ -2,7 +2,7 @@
from fastapi import Header, HTTPException
from typing import Optional
from ..core.tracing import set_request_id, generate_request_id
from ..core.tracing import set_request_id, generate_request_id, get_request_id as get_current_request_id
async def get_request_id(x_request_id: Optional[str] = Header(None)) -> str:
@@ -15,6 +15,12 @@ async def get_request_id(x_request_id: Optional[str] = Header(None)) -> str:
Returns:
str: 请求ID
"""
# 先检查 ContextVar 中是否已经有 request_id由中间件设置
existing_request_id = get_current_request_id()
if existing_request_id:
return existing_request_id
# 如果没有,则从请求头获取或生成新的
request_id = x_request_id or generate_request_id()
set_request_id(request_id)
return request_id

View File

@@ -23,6 +23,8 @@ class Settings(BaseSettings):
# 日志配置
log_level: str = "INFO"
log_format: str = "json"
log_file_enabled: bool = False
log_file_path: str = "/var/log/app/app.log"
# 指标配置
metrics_enabled: bool = True

View File

@@ -2,14 +2,39 @@
import logging
import sys
from pathlib import Path
from typing import Optional
from logging.handlers import RotatingFileHandler
from pythonjsonlogger.json import JsonFormatter
from .tracing import get_request_id
class RequestIdFilter(logging.Filter):
"""自动添加 request_id 到日志记录的过滤器"""
def filter(self, record: logging.LogRecord) -> bool:
"""
为日志记录添加 request_id 字段
Args:
record: 日志记录
Returns:
bool: 总是返回 True不过滤任何日志
"""
# 从 ContextVar 中获取 request_id
request_id = get_request_id()
# 添加到日志记录中,如果没有则设置为 None
record.request_id = request_id if request_id else "-"
return True
def setup_logging(
level: str = "INFO",
format_type: str = "json",
logger_name: Optional[str] = None,
file_path: Optional[str] = None,
) -> logging.Logger:
"""
配置日志系统
@@ -18,6 +43,7 @@ def setup_logging(
level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
format_type: 日志格式 ('json''text')
logger_name: 日志器名称None表示根日志器
file_path: 日志文件路径None表示不写入文件
Returns:
logging.Logger: 配置好的日志器
@@ -28,23 +54,45 @@ def setup_logging(
# 清除现有处理器
logger.handlers.clear()
# 创建控制台处理器
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(getattr(logging, level.upper()))
# 设置格式
if format_type == "json":
formatter = JsonFormatter(
"%(asctime)s %(name)s %(levelname)s %(message)s",
"%(asctime)s %(name)s %(levelname)s %(message)s %(request_id)s",
timestamp=True,
)
else:
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"%(asctime)s - %(name)s - %(levelname)s - [%(request_id)s] - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
handler.setFormatter(formatter)
logger.addHandler(handler)
# 创建 RequestIdFilter
request_id_filter = RequestIdFilter()
# 创建控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(getattr(logging, level.upper()))
console_handler.setFormatter(formatter)
console_handler.addFilter(request_id_filter)
logger.addHandler(console_handler)
# 创建文件处理器(如果指定了文件路径)
if file_path:
# 确保日志目录存在
log_dir = Path(file_path).parent
log_dir.mkdir(parents=True, exist_ok=True)
# 创建 RotatingFileHandler
# 最大 100MB保留 5 个备份
file_handler = RotatingFileHandler(
file_path,
maxBytes=100 * 1024 * 1024, # 100MB
backupCount=5,
encoding="utf-8",
)
file_handler.setLevel(getattr(logging, level.upper()))
file_handler.setFormatter(formatter)
file_handler.addFilter(request_id_filter)
logger.addHandler(file_handler)
return logger

View File

@@ -9,6 +9,7 @@ import time
from .api import router
from .config import settings
from .core.logging import setup_logging
from .core.tracing import generate_request_id, set_request_id, get_request_id
from .core.metrics_unified import (
get_metrics_manager,
incr,
@@ -20,7 +21,11 @@ from .core.metrics_unified import (
from .core.job_manager import get_job_manager, shutdown_job_manager
# 设置日志
setup_logging(level=settings.log_level, format_type=settings.log_format)
setup_logging(
level=settings.log_level,
format_type=settings.log_format,
file_path=settings.log_file_path if settings.log_file_enabled else None,
)
logger = logging.getLogger(__name__)
# 创建 FastAPI 应用
@@ -47,6 +52,10 @@ app.add_middleware(
@app.middleware("http")
async def log_requests(request: Request, call_next):
"""记录所有HTTP请求"""
# 从请求头获取或生成 request_id
request_id = request.headers.get("x-request-id") or generate_request_id()
set_request_id(request_id)
logger.info(f"Request: {request.method} {request.url.path}")
response = await call_next(request)
logger.info(f"Response: {response.status_code}")