atlasbot: include snapshot signals
This commit is contained in:
parent
0476edae6a
commit
e3c68af679
@ -103,9 +103,25 @@ def build_summary(snapshot: dict[str, Any] | None) -> dict[str, Any]:
|
|||||||
summary.update(_build_cluster_watchlist(summary))
|
summary.update(_build_cluster_watchlist(summary))
|
||||||
summary.update(_build_workloads(snapshot))
|
summary.update(_build_workloads(snapshot))
|
||||||
summary.update(_build_flux(snapshot))
|
summary.update(_build_flux(snapshot))
|
||||||
|
_merge_cluster_summary(snapshot, summary)
|
||||||
return summary
|
return summary
|
||||||
|
|
||||||
|
|
||||||
|
def _merge_cluster_summary(snapshot: dict[str, Any], summary: dict[str, Any]) -> None:
|
||||||
|
cluster_summary = snapshot.get("summary") if isinstance(snapshot.get("summary"), dict) else {}
|
||||||
|
if not cluster_summary:
|
||||||
|
return
|
||||||
|
signals = cluster_summary.get("signals")
|
||||||
|
profiles = cluster_summary.get("profiles")
|
||||||
|
inventory = cluster_summary.get("inventory")
|
||||||
|
if isinstance(signals, list):
|
||||||
|
summary["signals"] = signals
|
||||||
|
if isinstance(profiles, dict):
|
||||||
|
summary["profiles"] = profiles
|
||||||
|
if isinstance(inventory, dict):
|
||||||
|
summary["inventory"] = inventory
|
||||||
|
|
||||||
|
|
||||||
def _nodes_detail(snapshot: dict[str, Any]) -> list[dict[str, Any]]:
|
def _nodes_detail(snapshot: dict[str, Any]) -> list[dict[str, Any]]:
|
||||||
items = snapshot.get("nodes_detail")
|
items = snapshot.get("nodes_detail")
|
||||||
return items if isinstance(items, list) else []
|
return items if isinstance(items, list) else []
|
||||||
@ -1335,6 +1351,64 @@ def _append_flux(lines: list[str], summary: dict[str, Any]) -> None:
|
|||||||
lines.append("flux_not_ready_items: " + "; ".join(parts))
|
lines.append("flux_not_ready_items: " + "; ".join(parts))
|
||||||
|
|
||||||
|
|
||||||
|
def _append_signals(lines: list[str], summary: dict[str, Any]) -> None:
|
||||||
|
signals = summary.get("signals") if isinstance(summary.get("signals"), list) else []
|
||||||
|
if not signals:
|
||||||
|
return
|
||||||
|
lines.append("signals:")
|
||||||
|
for entry in signals[:8]:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
scope = entry.get("scope") or ""
|
||||||
|
target = entry.get("target") or ""
|
||||||
|
metric = entry.get("metric") or ""
|
||||||
|
current = entry.get("current")
|
||||||
|
delta = entry.get("delta_pct")
|
||||||
|
severity = entry.get("severity") or ""
|
||||||
|
detail = f"{scope}:{target} {metric}={current}"
|
||||||
|
if delta is not None:
|
||||||
|
detail += f" delta={delta}%"
|
||||||
|
if severity:
|
||||||
|
detail += f" severity={severity}"
|
||||||
|
lines.append(f"- {detail}")
|
||||||
|
|
||||||
|
|
||||||
|
def _append_profiles(lines: list[str], summary: dict[str, Any]) -> None:
|
||||||
|
profiles = summary.get("profiles") if isinstance(summary.get("profiles"), dict) else {}
|
||||||
|
if not profiles:
|
||||||
|
return
|
||||||
|
nodes = profiles.get("nodes") if isinstance(profiles.get("nodes"), list) else []
|
||||||
|
namespaces = profiles.get("namespaces") if isinstance(profiles.get("namespaces"), list) else []
|
||||||
|
workloads = profiles.get("workloads") if isinstance(profiles.get("workloads"), list) else []
|
||||||
|
if nodes:
|
||||||
|
lines.append("node_profiles:")
|
||||||
|
for entry in nodes[:3]:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
lines.append(
|
||||||
|
f"- {entry.get('node')}: load={entry.get('load_index')} cpu={entry.get('cpu')} ram={entry.get('ram')} "
|
||||||
|
f"pods={entry.get('pods_total')} hw={entry.get('hardware')}"
|
||||||
|
)
|
||||||
|
if namespaces:
|
||||||
|
lines.append("namespace_profiles:")
|
||||||
|
for entry in namespaces[:3]:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
lines.append(
|
||||||
|
f"- {entry.get('namespace')}: pods={entry.get('pods_total')} cpu={entry.get('cpu_usage')} "
|
||||||
|
f"mem={entry.get('mem_usage')} primary={entry.get('primary_node')}"
|
||||||
|
)
|
||||||
|
if workloads:
|
||||||
|
lines.append("workload_profiles:")
|
||||||
|
for entry in workloads[:3]:
|
||||||
|
if not isinstance(entry, dict):
|
||||||
|
continue
|
||||||
|
lines.append(
|
||||||
|
f"- {entry.get('namespace')}/{entry.get('workload')}: pods={entry.get('pods_total')} "
|
||||||
|
f"running={entry.get('pods_running')} node={entry.get('primary_node')}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _append_units_windows(lines: list[str], summary: dict[str, Any]) -> None:
|
def _append_units_windows(lines: list[str], summary: dict[str, Any]) -> None:
|
||||||
metrics = summary.get("metrics") if isinstance(summary.get("metrics"), dict) else {}
|
metrics = summary.get("metrics") if isinstance(summary.get("metrics"), dict) else {}
|
||||||
units = metrics.get("units") if isinstance(metrics.get("units"), dict) else {}
|
units = metrics.get("units") if isinstance(metrics.get("units"), dict) else {}
|
||||||
@ -1587,5 +1661,7 @@ def summary_text(snapshot: dict[str, Any] | None) -> str:
|
|||||||
_append_cluster_watchlist(lines, summary)
|
_append_cluster_watchlist(lines, summary)
|
||||||
_append_hardware_usage(lines, summary)
|
_append_hardware_usage(lines, summary)
|
||||||
_append_flux(lines, summary)
|
_append_flux(lines, summary)
|
||||||
|
_append_signals(lines, summary)
|
||||||
|
_append_profiles(lines, summary)
|
||||||
_append_units_windows(lines, summary)
|
_append_units_windows(lines, summary)
|
||||||
return "\n".join(lines)
|
return "\n".join(lines)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user