feat(alerts): pick the host, then its part, and see what the metric reads (#5475)
#5475 "Rule form: pick the host, then its part; metrics that part reports; a link to groups; a preview of the metric", from the operator's review of the New rule page: hosts and their parts shared one long picker. - Host agent rules pick a Host, then a Part: "The whole host", then its mounts, CPU cores, disks, interfaces and sensors under a heading each, cores in number order. A part that reports nothing a rule can watch (an interface's traffic) isn't offered. - The Metric list holds what the picked resource reports, in catalog order. - Under it, a preview: the reading now, and the last 24 h low to high with an hourly sparkline drawn from zero (UI ruling 8), read from one series. - The group picker links to Ansible > Inventory to make a group, in a new tab, and re-reads the groups when the tab comes back into view. - Picking a host or part swaps the pickers alone (/alerts/api/rule_target); picking a metric swaps the preview (/alerts/api/metric_preview). - A rule's own resource and metric stay on offer after they go quiet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -119,7 +119,8 @@ async def test_deleting_a_rule_is_on_its_own_page_and_says_what_goes(app):
|
||||
listing = await render_template("alerts/list.html", active=[], rules=[rule], operators=[])
|
||||
page = await render_template(
|
||||
"alerts/rules_form.html", rule=rule, operators=[], source_modules=["host_agent"],
|
||||
initial_source="host_agent", resources=["web-1"], metrics=["cpu_pct"], ansible_sources=[],
|
||||
initial_source="host_agent", resources=["web-1"], resource="web-1", metrics=["cpu_pct"],
|
||||
metric="cpu_pct", ansible_sources=[],
|
||||
catalog={}, history_count=12, fired=None, notify=[])
|
||||
assert "/delete" not in listing
|
||||
assert 'action="/alerts/rules/r1/delete"' in page
|
||||
@@ -138,7 +139,8 @@ async def test_the_rule_page_is_named_for_the_rule(app):
|
||||
session["user_role"] = "admin"
|
||||
page = await render_template(
|
||||
"alerts/rules_form.html", rule=rule, operators=[(">", ">")], source_modules=["host_agent"],
|
||||
initial_source="host_agent", resources=["VDNT-Docker02"], metrics=["seconds_since_seen"],
|
||||
initial_source="host_agent", resources=["VDNT-Docker02"], resource="VDNT-Docker02",
|
||||
metrics=["seconds_since_seen"], metric="seconds_since_seen",
|
||||
ansible_sources=[], catalog={}, history_count=10,
|
||||
fired=datetime.now(timezone.utc) - timedelta(hours=6), notify=["email to me@example.com"])
|
||||
page = " ".join(page.split())
|
||||
@@ -265,8 +267,8 @@ async def test_the_rule_form_speaks_in_names_and_units(app):
|
||||
session["user_role"] = "operator"
|
||||
page = await render_template(
|
||||
"alerts/rules_form.html", rule=rule, operators=_OPERATORS,
|
||||
source_modules=["http", "host_agent"], initial_source="http", resources=["nas"],
|
||||
metrics=["is_up", "response_ms"], ansible_sources=[],
|
||||
source_modules=["http", "host_agent"], initial_source="http", resources=["nas"], resource="nas",
|
||||
metrics=["is_up", "response_ms"], metric="is_up", ansible_sources=[],
|
||||
catalog={"http": ["is_up", "response_ms"], "snmp": []})
|
||||
assert ">HTTP monitors</option>" in page and ">Host agent</option>" in page
|
||||
assert ">Up or down</option>" in page and 'data-unit="ms"' in page
|
||||
@@ -294,7 +296,8 @@ async def test_a_rule_covering_hosts_lists_its_hosts_under_it(app):
|
||||
page = await render_template(
|
||||
"alerts/rules_form.html", rule=parent, operators=[], source_modules=["host_agent"],
|
||||
initial_source="host_agent", resources=[], metrics=["seconds_since_seen"],
|
||||
ansible_sources=[], catalog={}, history_count=0, fired=None, notify=[],
|
||||
metric="seconds_since_seen", ansible_sources=[], catalog={}, history_count=0,
|
||||
fired=None, notify=[],
|
||||
covered=["node-a", "node-b"], host_source=True, groups=["swarm"],
|
||||
current_covers="group", current_group="swarm", covers_locked=True)
|
||||
listing, page = " ".join(listing.split()), " ".join(page.split())
|
||||
|
||||
Reference in New Issue
Block a user