fix: optimize summary count query and refine row keys for external api logs

This commit is contained in:
SmartUp Developer
2026-07-02 15:07:32 +08:00
parent e2129d3796
commit ea3fd64686
4 changed files with 195 additions and 9 deletions
+90 -4
View File
@@ -625,13 +625,13 @@ def test_route_summary_hours_window(session):
# hours=1 → only recent
result = get_external_api_log_summary(
slow_ms=None, hours=1, limit=50, db=session, _=None,
slow_ms=None, hours=1, limit=50, offset=0, db=session, _=None,
)
assert len(result) == 1 and result[0].path == "/recent"
# hours=72 → both
result = get_external_api_log_summary(
slow_ms=None, hours=72, limit=50, db=session, _=None,
slow_ms=None, hours=72, limit=50, offset=0, db=session, _=None,
)
assert len(result) == 2
@@ -648,7 +648,7 @@ def test_route_summary_limit(session):
session.commit()
result = get_external_api_log_summary(
slow_ms=None, hours=24, limit=3, db=session, _=None,
slow_ms=None, hours=24, limit=3, offset=0, db=session, _=None,
)
assert len(result) == 3
@@ -670,8 +670,94 @@ def test_route_summary_slow_threshold(session):
session.commit()
result = get_external_api_log_summary(
slow_ms=1000, hours=24, limit=50, db=session, _=None,
slow_ms=1000, hours=24, limit=50, offset=0, db=session, _=None,
)
slow_paths = [r for r in result if r.slow_count > 0]
assert len(slow_paths) == 1
assert slow_paths[0].path == "/slow"
def test_route_summary_offset_pagination(session):
"""get_external_api_log_summary respects offset parameter."""
from app.routers.external_api_logs import get_external_api_log_summary
now = datetime.now(timezone.utc)
for i in range(10):
session.add(ExternalApiLog(direction="upstream", target_type="upstream",
method="GET", path=f"/path-{i}", url_host="h",
status_code=200, success=True, duration_ms=50 + i, created_at=now))
session.commit()
# Page 1: first 4
page1 = get_external_api_log_summary(
slow_ms=None, hours=24, limit=4, offset=0, db=session, _=None,
)
assert len(page1) == 4
assert page1[0].path == "/path-9" # sorted by sum(duration_ms) desc
# Page 2: next 4
page2 = get_external_api_log_summary(
slow_ms=None, hours=24, limit=4, offset=4, db=session, _=None,
)
assert len(page2) == 4
assert page2[0].path == "/path-5"
# Page 3: last 2
page3 = get_external_api_log_summary(
slow_ms=None, hours=24, limit=4, offset=8, db=session, _=None,
)
assert len(page3) == 2
# Beyond end
page4 = get_external_api_log_summary(
slow_ms=None, hours=24, limit=4, offset=20, db=session, _=None,
)
assert len(page4) == 0
def test_route_summary_count(session):
"""count_external_api_log_summary returns group count, not raw row count."""
from app.routers.external_api_logs import count_external_api_log_summary
now = datetime.now(timezone.utc)
# 3 calls to same path (should be 1 group)
for i in range(3):
session.add(ExternalApiLog(direction="upstream", target_type="upstream",
method="GET", path="/grouped", url_host="h",
status_code=200, success=True, duration_ms=100, created_at=now))
# 2 calls to different path (another group)
for i in range(2):
session.add(ExternalApiLog(direction="upstream", target_type="upstream",
method="POST", path="/other", url_host="h",
status_code=201, success=True, duration_ms=200, created_at=now))
session.commit()
# Should be 2 groups, not 5 raw rows
result = count_external_api_log_summary(
slow_ms=None, hours=24, db=session, _=None,
)
assert result == {"total": 2}
def test_route_summary_count_respects_hours(session):
"""count_external_api_log_summary respects hours filter."""
from app.routers.external_api_logs import count_external_api_log_summary
now = datetime.now(timezone.utc)
session.add(ExternalApiLog(direction="upstream", target_type="upstream",
method="GET", path="/recent", url_host="h",
status_code=200, success=True, duration_ms=50,
created_at=now - timedelta(minutes=30)))
session.add(ExternalApiLog(direction="upstream", target_type="upstream",
method="GET", path="/old", url_host="h",
status_code=200, success=True, duration_ms=50,
created_at=now - timedelta(hours=48)))
session.commit()
# hours=1 → 1 group
r1 = count_external_api_log_summary(slow_ms=None, hours=1, db=session, _=None)
assert r1 == {"total": 1}
# hours=72 → 2 groups
r2 = count_external_api_log_summary(slow_ms=None, hours=72, db=session, _=None)
assert r2 == {"total": 2}