{# host_agent widget — fleet glance. One horizontal row per host, zebra-striped so adjacent hosts read as distinct groupings: health dot + host name on the left, metric cells (cpu/mem/disk/load) each with a trend sparkline laid out horizontally on the right. The name wraps (never hard-truncated) but the row stays horizontal. #} {% if rows %} {% macro metric_cell(label, value, fmt, svg, style="", title="") %}
{{ label }}
{% if value is not none %}{{ fmt|format(value) }}{% else %}—{% endif %}
{{ svg | safe }}
{% endmacro %} {# Human-readable throughput, matching the host-detail page. #} {% macro fmt_bps(v) %} {%- if v is none -%}— {%- elif v >= 1048576 -%}{{ "%.1f"|format(v / 1048576) }} MB/s {%- elif v >= 1024 -%}{{ "%.1f"|format(v / 1024) }} KB/s {%- else -%}{{ "%.0f"|format(v) }} B/s {%- endif -%} {% endmacro %} {# Two-line down/up (or read/write) throughput cell. #} {% macro io_cell(label, down_sym, down_val, up_sym, up_val, title="") %}
{{ label }}
{{ down_sym }} {{ fmt_bps(down_val) }}
{{ up_sym }} {{ fmt_bps(up_val) }}
{% endmacro %}
{% for r in rows %} {% set stale = r.stale %}
{# Left — health dot + full host name (wraps, never truncated) + last seen #}
{% if session.user_id %} {{ r.host.name }} {% else %} {{ r.host.name }} {% endif %} {{ r.reg.last_seen_at.strftime("%H:%M:%S") if r.reg.last_seen_at else "never" }}
{# Right — metric cells with value + trend, laid out horizontally #}
{{ metric_cell("cpu", r.cpu_pct, "%.0f%%", r.sparks.cpu, threshold_style(r.cpu_pct, 'cpu'), "Average CPU utilization") }} {{ metric_cell("mem", r.mem_used_pct, "%.0f%%", r.sparks.mem, threshold_style(r.mem_used_pct, 'mem'), "Memory in use") }} {{ metric_cell("disk /", r.disk_root, "%.0f%%", r.sparks.disk, threshold_style(r.disk_root, 'disk'), "Root filesystem (/) usage") }} {{ metric_cell("load", r.load_1m, "%.2f", r.sparks.load, "", "Load average (1m)") }} {# Extra agent metrics — shown only when the host reports them (VMs/containers often have no temp sensor, etc.) so absent data doesn't clutter the row. #} {% if r.net_rx_bps is not none or r.net_tx_bps is not none %} {{ io_cell("net", "↓", r.net_rx_bps, "↑", r.net_tx_bps, "Network throughput (down / up)") }} {% endif %} {% if r.disk_read_bps is not none or r.disk_write_bps is not none %} {{ io_cell("disk i/o", "rd", r.disk_read_bps, "wr", r.disk_write_bps, "Disk I/O (read / write)") }} {% endif %} {% if r.temp_max is not none %} {{ metric_cell("temp", r.temp_max, "%.0f°C", "", threshold_style(r.temp_max, 'temp'), "Hottest sensor") }} {% endif %}
{% endfor %}
{% else %}

No hosts with agent data yet.

{% endif %}