feat(health): Steward records its own health and Settings → System shows it (#5467)
#5467 "Steward's own health: metrics, rules can watch them, a page that shows them". The self-monitor tick now records, under source "steward", resource "process": ingest_posts / ingest_failed / ingest_slowest_ms (the host-agent posts since the last tick, tallied in steward/core/health.py), db_roundtrip_ms (a timed SELECT 1), and unwatched_secs (the gap before this tick past watch.GAP_S, from Steward's own last sample). The hourly cleanup records cleanup_secs. The open-file pair is still recorded, and is now only skipped on its own where /proc is absent. All of these are in CORE_METRICS, so an alert rule can watch them under "Steward itself". Settings → System (/settings/system/, admin) shows a verdict first (failed posts, a gap in watching, open files near the limit), then each measure now and over the last day, with a sparkline scaled to its own peak. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -414,8 +414,14 @@ def _register_core_tasks(app: Quart) -> None:
|
||||
await run_due_monitors(app)
|
||||
|
||||
async def run_cleanup():
|
||||
import time
|
||||
from .core.cleanup import run_cleanup as _cleanup
|
||||
from .core.self_monitor import record_cleanup_secs
|
||||
started = time.monotonic()
|
||||
await _cleanup(app)
|
||||
# How long it took, as Steward's own metric (#5467); a failed run
|
||||
# raises past this and records nothing.
|
||||
await record_cleanup_secs(app, time.monotonic() - started)
|
||||
|
||||
async def run_alert_reconcile():
|
||||
from .alerts.service import reconcile_covering_rules
|
||||
|
||||
Reference in New Issue
Block a user