feat(report): add 24h slow-sql dashboard and metrics api
This commit is contained in:
@@ -14,6 +14,7 @@ from flask import jsonify, session
|
||||
from routes.admin_api import admin_api_bp
|
||||
from routes.decorators import admin_required
|
||||
from services.request_metrics import get_request_metrics_snapshot
|
||||
from services.slow_sql_metrics import get_slow_sql_metrics_snapshot
|
||||
from services.time_utils import BEIJING_TZ, get_beijing_now
|
||||
|
||||
logger = get_logger("app")
|
||||
@@ -30,6 +31,10 @@ _REQUEST_METRICS_CACHE_TTL = max(1.0, float(os.environ.get("ADMIN_REQUEST_METRIC
|
||||
_request_metrics_cache: dict[str, object] = {"expires_at_monotonic": 0.0, "data": None}
|
||||
_request_metrics_cache_lock = threading.Lock()
|
||||
|
||||
_SLOW_SQL_METRICS_CACHE_TTL = max(1.0, float(os.environ.get("ADMIN_SLOW_SQL_METRICS_CACHE_TTL_SECONDS", "3")))
|
||||
_slow_sql_metrics_cache: dict[str, object] = {"expires_at_monotonic": 0.0, "data": None}
|
||||
_slow_sql_metrics_cache_lock = threading.Lock()
|
||||
|
||||
|
||||
def _get_system_stats_cached() -> dict:
|
||||
now = time.monotonic()
|
||||
@@ -65,6 +70,23 @@ def _get_request_metrics_cached() -> dict:
|
||||
return dict(fresh_data)
|
||||
|
||||
|
||||
def _get_slow_sql_metrics_cached() -> dict:
|
||||
now = time.monotonic()
|
||||
with _slow_sql_metrics_cache_lock:
|
||||
expires_at = float(_slow_sql_metrics_cache.get("expires_at_monotonic") or 0.0)
|
||||
cached_data = _slow_sql_metrics_cache.get("data")
|
||||
if isinstance(cached_data, dict) and now < expires_at:
|
||||
return dict(cached_data)
|
||||
|
||||
fresh_data = get_slow_sql_metrics_snapshot() or {}
|
||||
|
||||
with _slow_sql_metrics_cache_lock:
|
||||
_slow_sql_metrics_cache["data"] = dict(fresh_data)
|
||||
_slow_sql_metrics_cache["expires_at_monotonic"] = now + _SLOW_SQL_METRICS_CACHE_TTL
|
||||
|
||||
return dict(fresh_data)
|
||||
|
||||
|
||||
@admin_api_bp.route("/stats", methods=["GET"])
|
||||
@admin_required
|
||||
def get_system_stats():
|
||||
@@ -86,6 +108,18 @@ def get_request_metrics():
|
||||
return jsonify({"error": "获取请求级监控指标失败"}), 500
|
||||
|
||||
|
||||
@admin_api_bp.route("/slow_sql_metrics", methods=["GET"])
|
||||
@admin_required
|
||||
def get_slow_sql_metrics():
|
||||
"""获取慢 SQL 监控指标"""
|
||||
try:
|
||||
metrics = _get_slow_sql_metrics_cached()
|
||||
return jsonify(metrics)
|
||||
except Exception as e:
|
||||
logger.exception(f"获取慢 SQL 监控指标失败: {e}")
|
||||
return jsonify({"error": "获取慢 SQL 监控指标失败"}), 500
|
||||
|
||||
|
||||
@admin_api_bp.route("/browser_pool/stats", methods=["GET"])
|
||||
@admin_required
|
||||
def get_browser_pool_stats():
|
||||
|
||||
Reference in New Issue
Block a user