From 91468a48b4ce6319d5f43b9bc3d554a4e666bc51 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Thu, 29 Jan 2026 03:03:01 -0300 Subject: [PATCH] atlasbot: surface node age summary --- atlasbot/snapshot/builder.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/atlasbot/snapshot/builder.py b/atlasbot/snapshot/builder.py index c622ab1..60246fb 100644 --- a/atlasbot/snapshot/builder.py +++ b/atlasbot/snapshot/builder.py @@ -74,6 +74,7 @@ def build_summary(snapshot: dict[str, Any] | None) -> dict[str, Any]: summary.update(_build_nodes(snapshot)) summary.update(_build_pressure(snapshot)) summary.update(_build_hardware(nodes_detail)) + summary.update(_build_node_ages(nodes_detail)) summary.update(_build_capacity(metrics)) summary.update(_build_pods(metrics)) summary.update(_build_namespace_pods(snapshot)) @@ -135,6 +136,19 @@ def _build_hardware(nodes_detail: list[dict[str, Any]]) -> dict[str, Any]: return {"hardware": {key: sorted(value) for key, value in hardware.items()}} +def _build_node_ages(nodes_detail: list[dict[str, Any]]) -> dict[str, Any]: + ages: list[dict[str, Any]] = [] + for node in nodes_detail or []: + if not isinstance(node, dict): + continue + name = node.get("name") + age = node.get("age_hours") + if name and isinstance(age, (int, float)): + ages.append({"name": name, "age_hours": age}) + ages.sort(key=lambda item: -(item.get("age_hours") or 0)) + return {"node_ages": ages[:5]} if ages else {} + + def _build_pods(metrics: dict[str, Any]) -> dict[str, Any]: pods = { "running": metrics.get("pods_running"), @@ -355,6 +369,22 @@ def _append_hardware(lines: list[str], summary: dict[str, Any]) -> None: lines.append("hardware: " + "; ".join(sorted(parts))) +def _append_node_ages(lines: list[str], summary: dict[str, Any]) -> None: + ages = summary.get("node_ages") if isinstance(summary.get("node_ages"), list) else [] + if not ages: + return + parts = [] + for entry in ages[:3]: + if not isinstance(entry, dict): + continue + name = entry.get("name") + age = entry.get("age_hours") + if name and isinstance(age, (int, float)): + parts.append(f"{name}={_format_float(age)}h") + if parts: + lines.append("node_age_top: " + "; ".join(parts)) + + def _append_pressure(lines: list[str], summary: dict[str, Any]) -> None: pressure = summary.get("pressure_nodes") if not isinstance(pressure, dict) or not pressure: @@ -767,6 +797,7 @@ def summary_text(snapshot: dict[str, Any] | None) -> str: _append_nodes(lines, summary) _append_pressure(lines, summary) _append_hardware(lines, summary) + _append_node_ages(lines, summary) _append_capacity(lines, summary) _append_pods(lines, summary) _append_namespace_pods(lines, summary)