{% extends "base.html" %} {% block title %}Dashboard{% endblock %} {% block content %}
{% if not daemon_ok %} ⚠ MONITOR OFFLINE {% endif %} {% if summary.critical %} ● {{ summary.critical }} CRITICAL {% endif %} {% if summary.warning %} ● {{ summary.warning }} WARNING {% endif %} {% if daemon_ok and not summary.critical and not summary.warning %} ✔ ALL SYSTEMS NOMINAL {% endif %} {% set followups = (stale_tickets | length) + (stale_alerts or 0) %} {% if followups %} ⏳ {{ followups }} TO FOLLOW UP {% endif %}
{{ last_check }}
{{ summary.critical or 0 }} Critical
{{ summary.warning or 0 }} Warning
{{ snapshot.hosts | length }} Hosts
{{ recent_resolved | length }} Resolved 24h

Active Alerts

{{ (summary.critical or 0) + (summary.warning or 0) }}
╚ ╝
Alert Queue
{% if events %} {% if total_active is defined and total_active > events|length %}
Showing {{ events|length }} of {{ total_active }} active alerts. Use the search box to filter, or export all as JSON
{% endif %}
{% for e in events %} {% if e.severity != 'info' %} {% endif %} {% else %} {% endfor %}
Active network alerts
Sev Type Target Detail Description First Seen Last Seen Failures Ticket Actions
{{ e.severity }} {% if e.is_suppressed %}🔕 sup{% endif %} {% if e.stale_days is not none %}⏳ {{ e.stale_days }}d{% endif %} {% if e.ticket_closed %}ticket closed{% endif %} {{ e.event_type | replace('_', ' ') }} {{ e.target_name }} {{ e.target_detail or '-' }} {{ e.description | truncate(60) }} {{ e.first_seen }} {{ e.last_seen }} {{ e.consecutive_failures }} {% if e.ticket_id %} #{{ e.ticket_id }} {% else %}-{% endif %}
✔
No active alerts
{% else %}
✔
No active alerts
{% endif %}

Needs Follow-up

{{ stale_tickets | length }}

These tickets are still open in Tinker, but their alert cleared over a day ago. Close them if the problem is fixed.

╚ ╝
Tickets Left Open
{% for t in stale_tickets %} {% endfor %}
Tickets still open after their alert cleared
TicketTargetAlertClearedAlerts on ticket
#{{ t.ticket_id }} {{ t.target_name }} {{ t.event_type | replace('_', ' ') }}{% if t.target_detail %} {{ t.target_detail }}{% endif %} {{ t.cleared_at }} {{ t.events }}
{% include "_modem_panel.html" %}

Hosts

{%- set has_global_sup = suppressions | selectattr('target_type', 'equalto', 'all') | list | length > 0 -%} {% for name, host in snapshot.hosts.items() %} {% set suppressed = suppressions | selectattr('target_name', 'equalto', name) | list %}
{{ name }} {% if suppressed or has_global_sup %} 🔕 {% endif %}
{{ host.ip }} {{ host.source }}
{% if host.interfaces %}
{% for iface, state in host.interfaces.items() | sort %}
{{ iface }} {{ state }}
{% endfor %}
{% else %}
{% if host.source == 'ping' %}ping-only / no node_exporter{% else %}no metrics from node_exporter{% endif %}
{% endif %}
↗ Details
{% else %}
⌛
No host data yet
The monitor daemon may still be starting up.
{% endfor %}
{% if snapshot.unifi %}

UniFi Devices

╚ ╝
Device Inventory
{% for d in snapshot.unifi %} {% endfor %}
UniFi network devices
Status Name Type Model IP Actions
{{ 'ONLINE' if d.connected else 'OFFLINE' }} {{ d.name }} {{ d.type }} {{ d.model }} {{ d.ip }} {% if not d.connected %} {% endif %}
{% endif %} {% if recent_resolved %}

Recently Resolved

{{ recent_resolved | length }} in last 24h
{% for e in recent_resolved %} {%- set dot_cls = 'lt-timeline-item--green' if e.severity == 'info' else 'lt-timeline-item--dim' -%}
{{ e.target_name }} {% if e.target_detail %}· {{ e.target_detail }}{% endif %} {{ e.resolved_at }}
{{ e.event_type | replace('_', ' ') }}  ·  {{ e.severity }}  ·  duration -
{% endfor %}
{% endif %} {% endblock %} {% block scripts %} {% endblock %}