diff --git a/services/comms/atlasbot-deployment.yaml b/services/comms/atlasbot-deployment.yaml index 69b30e4..0685626 100644 --- a/services/comms/atlasbot-deployment.yaml +++ b/services/comms/atlasbot-deployment.yaml @@ -16,7 +16,7 @@ spec: labels: app: atlasbot annotations: - checksum/atlasbot-configmap: manual-atlasbot-48 + checksum/atlasbot-configmap: manual-atlasbot-49 vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "comms" vault.hashicorp.com/agent-inject-secret-turn-secret: "kv/data/atlas/comms/turn-shared-secret" diff --git a/services/comms/scripts/atlasbot/bot.py b/services/comms/scripts/atlasbot/bot.py index f0bf008..e936b95 100644 --- a/services/comms/scripts/atlasbot/bot.py +++ b/services/comms/scripts/atlasbot/bot.py @@ -1268,7 +1268,17 @@ def structured_answer( node_regex = "|".join([n["name"] for n in scoped]) expr = _apply_node_filter(expr, node_regex) res = vm_query(expr, timeout=20) - answer = _format_metric_answer(entry, res) + answer = "" + if op == "top" or "hottest" in (entry.get("panel_title") or "").lower(): + node, val = _primary_series_metric(res) + if node and val is not None: + percent = _metric_expr_uses_percent(entry) + value_fmt = _format_metric_value(val or "", percent=percent) + metric_label = (metric or "").upper() + label = f"{metric_label} node" if metric_label else "node" + answer = f"Hottest {label}: {node} ({value_fmt})." + if not answer: + answer = _format_metric_answer(entry, res) if answer: scope_parts: list[str] = [] if include_hw: @@ -1292,8 +1302,8 @@ def structured_answer( percent = _metric_expr_uses_percent(entry) base_val_fmt = _format_metric_value(base_val or "", percent=percent) overall_note = f" Overall hottest node: {base_node} ({base_val_fmt})." - return f"Among {scope} nodes, {answer}{overall_note}" - return answer + return _format_confidence(f"Among {scope} nodes, {answer}{overall_note}", "high") + return _format_confidence(answer, "high") if metrics_summary: return metrics_summary @@ -1408,7 +1418,7 @@ def _os_mix_line(snapshot: dict[str, Any] | None) -> str: os_name = (node.get("os") or "").strip() if os_name: counts[os_name] += 1 - if not counts: + if not counts or (len(counts) == 1 and "linux" in counts): return "" parts = [f"{os_name}={count}" for os_name, count in sorted(counts.items(), key=lambda item: (-item[1], item[0]))] return "OS mix: " + ", ".join(parts[:5]) + "."