diff --git a/atlasbot/snapshot/builder.py b/atlasbot/snapshot/builder.py index 6b99a37..c47a071 100644 --- a/atlasbot/snapshot/builder.py +++ b/atlasbot/snapshot/builder.py @@ -80,6 +80,7 @@ def build_summary(snapshot: dict[str, Any] | None) -> dict[str, Any]: summary.update(_build_namespace_nodes(snapshot)) summary.update(_build_node_pods(snapshot)) summary.update(_build_pod_issues(snapshot)) + summary.update(_build_workload_health(snapshot)) summary.update(_build_events(snapshot)) summary.update(_build_postgres(metrics)) summary.update(_build_hottest(metrics)) @@ -190,6 +191,24 @@ def _build_pod_issues(snapshot: dict[str, Any]) -> dict[str, Any]: return {"pod_issues": pod_issues} +def _build_workload_health(snapshot: dict[str, Any]) -> dict[str, Any]: + health = snapshot.get("workloads_health") + if not isinstance(health, dict) or not health: + return {} + deployments = health.get("deployments") + statefulsets = health.get("statefulsets") + daemonsets = health.get("daemonsets") + if not isinstance(deployments, dict) or not isinstance(statefulsets, dict) or not isinstance(daemonsets, dict): + return {} + return { + "workloads_health": { + "deployments": deployments, + "statefulsets": statefulsets, + "daemonsets": daemonsets, + } + } + + def _build_events(snapshot: dict[str, Any]) -> dict[str, Any]: events = snapshot.get("events") if not isinstance(events, dict) or not events: @@ -496,6 +515,25 @@ def _format_pod_issue_top(pod_issues: dict[str, Any]) -> str: return "pod_issues_top: " + "; ".join(top) if top else "" +def _append_workload_health(lines: list[str], summary: dict[str, Any]) -> None: + health = summary.get("workloads_health") if isinstance(summary.get("workloads_health"), dict) else {} + if not health: + return + deployments = health.get("deployments") if isinstance(health.get("deployments"), dict) else {} + statefulsets = health.get("statefulsets") if isinstance(health.get("statefulsets"), dict) else {} + daemonsets = health.get("daemonsets") if isinstance(health.get("daemonsets"), dict) else {} + total_not_ready = 0 + for entry in (deployments, statefulsets, daemonsets): + total_not_ready += int(entry.get("not_ready") or 0) + lines.append( + "workloads_not_ready: " + f"deployments={deployments.get('not_ready', 0)}, " + f"statefulsets={statefulsets.get('not_ready', 0)}, " + f"daemonsets={daemonsets.get('not_ready', 0)} " + f"(total={total_not_ready})" + ) + + def _append_node_usage_stats(lines: list[str], summary: dict[str, Any]) -> None: metrics = summary.get("metrics") if isinstance(summary.get("metrics"), dict) else {} stats = metrics.get("node_usage_stats") if isinstance(metrics.get("node_usage_stats"), dict) else {} @@ -690,6 +728,7 @@ def summary_text(snapshot: dict[str, Any] | None) -> str: _append_namespace_nodes(lines, summary) _append_node_pods(lines, summary) _append_pod_issues(lines, summary) + _append_workload_health(lines, summary) _append_events(lines, summary) _append_node_usage_stats(lines, summary) _append_namespace_usage(lines, summary)