feat(db): table-health readout — per-table bloat metrics in admin card
You can't decide what to maintain without seeing what's bloating. Adds a read-only health panel driven by Postgres' own statistics views. - services/db_maintenance.py: get_table_health() queries pg_stat_user_tables + pg_total_relation_size + pg_database_size — per-table size, live/dead tuples, dead-tuple ratio (the bloat signal), and last (auto)vacuum/(auto)analyze. - routes/admin.py: admin-only GET /api/admin/db-maintenance/health. - SettingsView.vue: 'Table health' table in the maintenance card, all tables sorted by dead tuples, rows >=20% dead-ratio flagged; total DB size shown; refreshes after a Run-now so the dead-tuple drop is visible. - Tests: health row/size shaping + null-timestamp passthrough; route + service surface. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,12 @@
|
||||
|
||||
def test_admin_handlers_callable():
|
||||
from scribe.routes import admin as admin_routes
|
||||
for name in ("get_db_maintenance", "update_db_maintenance", "run_db_maintenance_now"):
|
||||
for name in (
|
||||
"get_db_maintenance",
|
||||
"update_db_maintenance",
|
||||
"run_db_maintenance_now",
|
||||
"get_db_maintenance_health",
|
||||
):
|
||||
assert callable(getattr(admin_routes, name))
|
||||
|
||||
|
||||
@@ -13,6 +18,7 @@ def test_db_maintenance_routes_registered():
|
||||
rules = {r.rule for r in app.url_map.iter_rules()}
|
||||
assert "/api/admin/db-maintenance" in rules
|
||||
assert "/api/admin/db-maintenance/run" in rules
|
||||
assert "/api/admin/db-maintenance/health" in rules
|
||||
|
||||
|
||||
def test_scheduler_surface():
|
||||
@@ -28,8 +34,13 @@ def test_scheduler_surface():
|
||||
|
||||
|
||||
def test_service_surface_and_allowlist():
|
||||
from scribe.services.db_maintenance import MAINTENANCE_TABLES, get_last_run, run_maintenance
|
||||
assert callable(run_maintenance) and callable(get_last_run)
|
||||
from scribe.services.db_maintenance import (
|
||||
MAINTENANCE_TABLES,
|
||||
get_last_run,
|
||||
get_table_health,
|
||||
run_maintenance,
|
||||
)
|
||||
assert callable(run_maintenance) and callable(get_last_run) and callable(get_table_health)
|
||||
# The allowlist is a closed tuple covering exactly the high-churn tables.
|
||||
assert isinstance(MAINTENANCE_TABLES, tuple)
|
||||
assert set(MAINTENANCE_TABLES) == {
|
||||
|
||||
Reference in New Issue
Block a user