优化系统健康评分与缓存监测
This commit is contained in:
@@ -30,6 +30,24 @@ async def test_cache_metrics():
|
||||
assert metrics.miss_rate == pytest.approx(25.0, 0.1)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_cache_metrics_one_hour_window_and_cache_types():
|
||||
monitor = PermissionMonitor()
|
||||
monitor.record_cache_hit("project_permissions")
|
||||
monitor.record_cache_miss("project_permissions")
|
||||
monitor.record_cache_hit("member_roles")
|
||||
|
||||
stats = monitor.metrics.cache_metrics.window_stats(3600)
|
||||
|
||||
assert stats["total_accesses"] == 3
|
||||
assert stats["hit_rate"] == pytest.approx(66.67, 0.01)
|
||||
assert stats["scope"] == "sliding_window"
|
||||
assert stats["by_cache"]["project_permissions"]["total_accesses"] == 2
|
||||
assert stats["by_cache"]["project_permissions"]["hit_rate"] == 50
|
||||
assert stats["by_cache"]["member_roles"]["total_accesses"] == 1
|
||||
assert stats["by_cache"]["member_roles"]["hit_rate"] == 100
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_cache_invalidation_tracking():
|
||||
"""测试缓存失效追踪"""
|
||||
|
||||
@@ -258,9 +258,14 @@ async def test_permission_system_health_degraded(db_session):
|
||||
assert "status" in data
|
||||
assert "health_score" in data
|
||||
assert "issues" in data
|
||||
assert "权限检查响应时间过长" in data["issues"]
|
||||
assert "权限拒绝率过高" in data["issues"]
|
||||
assert "缓存命中率过低" in data["issues"]
|
||||
assert any("权限检查平均响应时间过长" in issue for issue in data["issues"])
|
||||
assert any("权限拒绝率偏高" in issue for issue in data["issues"])
|
||||
assert any("缓存命中率偏低" in issue for issue in data["issues"])
|
||||
assert data["status"] == "unhealthy"
|
||||
assert data["health_score"] == 30
|
||||
assert data["score_breakdown"]["performance"]["deduction"] == 25
|
||||
assert data["score_breakdown"]["deny_rate"]["deduction"] == 20
|
||||
assert data["score_breakdown"]["cache"]["deduction"] == 25
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@@ -272,10 +277,33 @@ async def test_permission_system_health_includes_metrics(db_session):
|
||||
data = await permission_monitoring.permission_system_health(db=db_session, _=AdminUserStub())
|
||||
assert "last_hour" in data
|
||||
assert "cache_stats" in data
|
||||
assert "score_breakdown" in data
|
||||
assert "sample_sufficient" in data
|
||||
assert "total_checks" in data["last_hour"]
|
||||
assert "cache_metrics" in data["cache_stats"]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_permission_system_health_ignores_small_cache_sample(db_session):
|
||||
"""缓存样本不足时不应因为低命中率扣分"""
|
||||
monitor = PermissionMonitor()
|
||||
set_permission_monitor(monitor)
|
||||
|
||||
for _ in range(3):
|
||||
monitor.record_cache_miss()
|
||||
|
||||
data = await permission_monitoring.permission_system_health(db=db_session, _=AdminUserStub())
|
||||
|
||||
assert data["score_breakdown"]["cache"]["sample_sufficient"] is False
|
||||
assert data["score_breakdown"]["cache"]["deduction"] == 0
|
||||
non_cache_deductions = sum(
|
||||
item["deduction"]
|
||||
for name, item in data["score_breakdown"].items()
|
||||
if name != "cache"
|
||||
)
|
||||
assert data["health_score"] == 100 - non_cache_deductions
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_ip_locations_counts_unique_users_per_location(db_session, monkeypatch):
|
||||
"""IP 属地统计应按省市聚合访问次数、来源 IP 数和访问用户数。"""
|
||||
|
||||
Reference in New Issue
Block a user