{# alerts/list.html — the Alerts page (#5315): the verdict and what is active (alerts/_active.html, polled), then every rule: what it is doing now and when it last fired, what it fires on, and its History and Disable. The whole row opens the rule (.row-link, its name is the link); deleting one is on its own page, behind the confirm dialog. A rule covering hosts (#5464) lists its per-host rules under it, closed behind its "N hosts" toggle unless one of them isn't quiet (#5483); each opens its history. #} {% extends "base.html" %} {% block title %}Alerts — Steward{% endblock %} {% from "_macros.html" import page_header, status_badge, empty_state %} {% block content %} {% set can_edit = session.user_role in ('operator', 'admin') %} {% set rules_total = rules|length %} {% set rules_off = rules|rejectattr("enabled")|list|length %} {% call page_header("Alerts") %} History Anomalies Maintenance {% if can_edit %}New rule{% endif %} {% endcall %} {# The verdict and Active section re-read themselves, so an alert that clears or starts shows without a reload. #}
{% include "alerts/_active.html" %}

Rules

{% if rules %}
{% for rule in rules %} {% set kids = (children or {}).get(rule.id, []) %} {% set fired = (last_fired or {}).get(rule.id) %} {% set restless = (uneasy or {}).get(rule.id, []) %} {% if kids %} {% for kid in kids %} {% set kid_label = (rule_state or {}).get(kid.id) %} {% set kid_fired = (last_fired or {}).get(kid.id) %} {% endfor %} {% endif %} {% endfor %}
Name Now Fires when
{{ rule.name }}
{{ source_label(rule.source_module) }} {%- if rule.covers != "resource" %} · {% endif %}
{%- set now_label = (rule_state or {}).get(rule.id) %} {%- if not rule.enabled %}off {%- elif now_label and now_label not in ('inactive', 'resolved') %}{{ status_badge(now_label) }} {%- else %}quiet{% endif -%}
{%- if restless %}on {{ restless|join(", ") }} {%- elif fired %}last fired {{ fired|ago }}{% else %}never fired{% endif %}
{% if rule.covers == "group" %}every host in {{ rule.cover_group }}{% elif rule.covers == "all_hosts" %}every host{% else %}{{ rule.resource_name }}{% endif %} · {{ rule_condition(rule) }}
{%- set n_fire, n_ok = rule.consecutive_failures_required, rule.consecutive_ok_required %} {%- if n_fire > 1 %}after {{ n_fire }} checks in a row{% else %}on the first check{% endif %} {%- if n_ok > 1 %}; clears after {{ n_ok }} good ones{% endif -%}
{% if rule.covers == "resource" %}History{% endif %} {% if can_edit %}
{{ csrf_field() }}
{% endif %}
{% else %}
{{ empty_state("No alert rules yet.", "New rule" if can_edit else none, "/alerts/rules/new" if can_edit else none) }}
{% endif %} {% endblock %}