feat(ui): alerts, monitors, hosts, schedules and maintenance lists put problems first, with since-times (#5210)
#5210 "Problems first, with since-time, across every list" (milestone 477), first batch. - Alerts: the Active list reads firing, no data, acknowledged, pending, the longest-running first, and re-polls itself. An acknowledged alert says how long it has been breaching (from the alert's events; acknowledging moves last_transition_at) and, apart from that, who acknowledged it and when. Rules show what each is doing now; disabled rules sort last. The current value reads the latest-value table (#5208) instead of plugin_metrics. - Monitors: a down monitor says "Down 12m · connection refused" in the list. - Hosts: sorted down, agent gone quiet, pending, healthy. The agent column shows "—" for a missing reading (was 0%) and a Stale badge with its age. agent_metrics_by_host is gone; the list reads agent_overview_by_host. - Schedules: failing first (failed or interrupted run, or a firing that could not start one), then running, then the rest, paused last; status badge from the shared states. - Maintenance windows: active (ending soonest), then upcoming (starting soonest), with expired folded away; each says when it ends/starts/ended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -51,7 +51,8 @@ def test_an_up_or_down_metric_says_the_word():
|
||||
now = datetime.now(timezone.utc)
|
||||
says = alert_sentence(_rule("is_up", AlertOperator.lt, 1.0, "nas"), "acknowledged", 0.0,
|
||||
now - timedelta(hours=2, minutes=5), now)
|
||||
assert _said(says) == "nas is down, acknowledged for 2h 5m"
|
||||
# Acknowledged is still breaching: the sentence says for how long (#5210).
|
||||
assert _said(says) == "nas is down, breaching for 2h 5m"
|
||||
|
||||
|
||||
def test_no_reading_yet_is_said_not_shown_as_a_number():
|
||||
@@ -132,3 +133,35 @@ async def test_no_count_for_a_fragment_or_a_logged_out_page(app, monkeypatch):
|
||||
async with app.test_request_context("/alerts/"):
|
||||
logged_out = await render_template("alerts/list.html", active=[], rules=[], operators=[])
|
||||
assert "count-badge" not in fragment and "count-badge" not in logged_out
|
||||
|
||||
|
||||
async def test_an_acknowledged_alert_says_who_and_when_apart_from_the_breach(app):
|
||||
rule = _rule("is_up", AlertOperator.lt, 1.0, "nas")
|
||||
now = datetime.now(timezone.utc)
|
||||
st = SimpleNamespace(state=AlertStateEnum.acknowledged, no_data_since=None, last_sample_at=None,
|
||||
last_transition_at=now - timedelta(minutes=3),
|
||||
acknowledged_at=now - timedelta(minutes=3))
|
||||
row = {"state": st, "rule": rule, "label": "acknowledged", "url": None, "acked_by": "bryan",
|
||||
"says": alert_sentence(rule, "acknowledged", 0.0, now - timedelta(hours=1), now)}
|
||||
async with app.test_request_context("/alerts/active"):
|
||||
session["user_role"] = "operator"
|
||||
page = await render_template("alerts/_active.html", active=[row])
|
||||
page = " ".join(page.split())
|
||||
assert "<strong>nas</strong> is down, breaching for 1h" in page
|
||||
assert "Acknowledged by bryan <time" in page and ">3m ago</time>" in page
|
||||
assert "/acknowledge" not in page # already taken
|
||||
|
||||
|
||||
async def test_rules_say_what_each_is_doing_now(app):
|
||||
firing, quiet, off = _rule(rid="r1"), _rule(rid="r2", resource="db"), _rule(rid="r3", resource="old")
|
||||
off.enabled = False
|
||||
async with app.test_request_context("/alerts/"):
|
||||
session["user_role"] = "viewer"
|
||||
page = await render_template("alerts/list.html", active=[], rules=[firing, quiet, off],
|
||||
rule_state={"r1": "firing", "r2": "inactive"}, operators=[])
|
||||
page = " ".join(page.split())
|
||||
rules = page[page.index(">Rules</h2>"):]
|
||||
assert '<span class="badge badge-crit">Firing</span>' in rules
|
||||
assert 'title="Within its threshold">quiet</span>' in rules
|
||||
assert '<span class="tone-dim" style="font-size:0.8rem;">off</span>' in rules
|
||||
assert 'hx-get="/alerts/active"' in page
|
||||
|
||||
Reference in New Issue
Block a user