main:重构指标系统并切换为 Redis 方案

变更内容:
- 重构指标系统实现,支持基于 Redis 的多实例指标管理。
- 替换原有的 Pushgateway 和 Redis Exporter 方案。
- 更新 Prometheus 配置,适配新的指标抓取方式。
- 添加 Redis 指标相关配置和告警规则文件。
- 更新 Dockerfile 和 docker-compose 文件,移除多余服务,精简配置。
- 编写 `metrics_unified.py` 模块及单元测试。
- 修复部分代码中的冗余和格式问题。
This commit is contained in:
2026-02-02 13:30:28 +08:00
parent 5921f71756
commit 3254fdc3f0
11 changed files with 1047 additions and 94 deletions

View File

@@ -3,14 +3,20 @@
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
import logging
import time
from .api import router
from .config import settings
from .core.logging import setup_logging
from .core.metrics import metrics_registry, request_counter, request_latency, in_progress_requests
from .core.metrics_unified import (
get_metrics_manager,
incr,
observe,
gauge_incr,
gauge_decr,
export,
)
# 设置日志
setup_logging(level=settings.log_level, format_type=settings.log_format)
@@ -57,7 +63,7 @@ async def track_metrics(request: Request, call_next):
if request.url.path == "/metrics":
return await call_next(request)
in_progress_requests.inc()
gauge_incr("http_requests_in_progress")
start_time = time.time()
status = "success"
@@ -72,16 +78,16 @@ async def track_metrics(request: Request, call_next):
raise e
finally:
elapsed = time.time() - start_time
request_counter.labels(
method=request.method,
endpoint=request.url.path,
status=status
).inc()
request_latency.labels(
method=request.method,
endpoint=request.url.path
).observe(elapsed)
in_progress_requests.dec()
incr(
"http_requests_total",
{"method": request.method, "endpoint": request.url.path, "status": status},
)
observe(
"http_request_duration_seconds",
{"method": request.method, "endpoint": request.url.path},
elapsed,
)
gauge_decr("http_requests_in_progress")
# 注册路由
@@ -105,8 +111,8 @@ async def metrics():
return Response(content="Metrics disabled", status_code=404)
return Response(
content=generate_latest(metrics_registry),
media_type=CONTENT_TYPE_LATEST,
content=export(),
media_type="text/plain; version=0.0.4; charset=utf-8",
)
@@ -118,6 +124,14 @@ async def startup_event():
logger.info(f"Environment: {settings.app_env}")
logger.info(f"Metrics enabled: {settings.metrics_enabled}")
# 初始化指标管理器
if settings.metrics_enabled:
manager = get_metrics_manager()
if manager.is_available():
logger.info("Redis 指标收集已启用")
else:
logger.warning("Redis 不可用,指标将不会被收集")
# 关闭事件
@app.on_event("shutdown")