feat: ping/DNS status and latency in hosts list and dashboard summary

This commit is contained in:
2026-03-18 23:09:49 -04:00
parent c26552b670
commit 791af2d58f
4 changed files with 181 additions and 27 deletions
+39 -2
View File
@@ -1,8 +1,9 @@
from __future__ import annotations
from quart import Blueprint, render_template, request, redirect, url_for, current_app
from sqlalchemy import select
from sqlalchemy import select, func
from fablednetmon.auth.middleware import require_role
from fablednetmon.models.hosts import Host, ProbeType
from fablednetmon.models.monitors import PingResult, DnsResult
from fablednetmon.models.users import UserRole
hosts_bp = Blueprint("hosts", __name__, url_prefix="/hosts")
@@ -14,7 +15,43 @@ async def list_hosts():
async with current_app.db_sessionmaker() as db:
result = await db.execute(select(Host).order_by(Host.name))
hosts = result.scalars().all()
return await render_template("hosts/list.html", hosts=hosts)
# Latest ping result per host
latest_ping_subq = (
select(PingResult.host_id, func.max(PingResult.probed_at).label("max_at"))
.group_by(PingResult.host_id)
.subquery()
)
pr = await db.execute(
select(PingResult).join(
latest_ping_subq,
(PingResult.host_id == latest_ping_subq.c.host_id)
& (PingResult.probed_at == latest_ping_subq.c.max_at),
)
)
latest_pings = {r.host_id: r for r in pr.scalars()}
# Latest DNS result per host
latest_dns_subq = (
select(DnsResult.host_id, func.max(DnsResult.resolved_at).label("max_at"))
.group_by(DnsResult.host_id)
.subquery()
)
dr = await db.execute(
select(DnsResult).join(
latest_dns_subq,
(DnsResult.host_id == latest_dns_subq.c.host_id)
& (DnsResult.resolved_at == latest_dns_subq.c.max_at),
)
)
latest_dns = {r.host_id: r for r in dr.scalars()}
return await render_template(
"hosts/list.html",
hosts=hosts,
latest_pings=latest_pings,
latest_dns=latest_dns,
)
@hosts_bp.get("/new")