New features: stale banner, tab title alerts, health checks, DB housekeeping
static/app.js: - Browser tab title updates to show alert count: '(3 CRIT) GANDALF' or '(2 WARN) GANDALF' - Stale monitoring banner: injected into .main if last_check > 15 min old, warns operator that the monitor daemon may be down static/style.css: - .stale-banner: amber top-border warning strip app.py: - /health now checks DB connectivity and monitor freshness (last_check age) Returns 503 + degraded status if DB unreachable or monitor stale >20min db.py: - cleanup_expired_suppressions(): marks time-limited suppressions inactive when expires_at <= NOW() (was only filtered in SELECTs, never marked inactive) - purge_old_resolved_events(days=90): deletes old resolved events to prevent unbounded table growth monitor.py: - Calls cleanup_expired_suppressions() and purge_old_resolved_events() each cycle Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
31
db.py
31
db.py
@@ -269,6 +269,37 @@ def deactivate_suppression(sup_id: int) -> None:
|
||||
)
|
||||
|
||||
|
||||
def cleanup_expired_suppressions() -> int:
|
||||
"""Mark expired time-limited suppressions as inactive. Returns count deactivated."""
|
||||
with get_conn() as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""UPDATE suppression_rules
|
||||
SET active=FALSE
|
||||
WHERE active=TRUE AND expires_at IS NOT NULL AND expires_at <= NOW()"""
|
||||
)
|
||||
n = cur.rowcount
|
||||
if n:
|
||||
logger.info(f'Deactivated {n} expired suppression(s)')
|
||||
return n
|
||||
|
||||
|
||||
def purge_old_resolved_events(days: int = 90) -> int:
|
||||
"""Delete resolved events older than `days` days. Returns count deleted."""
|
||||
with get_conn() as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""DELETE FROM network_events
|
||||
WHERE resolved_at IS NOT NULL
|
||||
AND resolved_at < DATE_SUB(NOW(), INTERVAL %s DAY)""",
|
||||
(days,),
|
||||
)
|
||||
n = cur.rowcount
|
||||
if n:
|
||||
logger.info(f'Purged {n} old resolved event(s) (>{days}d)')
|
||||
return n
|
||||
|
||||
|
||||
def check_suppressed(suppressions: list, target_type: str, target_name: str, target_detail: str = '') -> bool:
|
||||
"""Check suppression against a pre-loaded list (avoids per-call DB queries)."""
|
||||
for s in suppressions:
|
||||
|
||||
Reference in New Issue
Block a user