From e95e988965b0d55b61e4848913b0906ce191c411 Mon Sep 17 00:00:00 2001 From: iris Date: Fri, 18 Sep 2026 01:48:30 +0200 Subject: [PATCH] swarm-grafana: distinct subagents by agent, over time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mara: "the subagent should already stamp the agent on the metric. so i want to see count of distinct subagent names per agent name over time" — it does. New timeseries panel-46 on the subagents tab: one line per parent agent, counting distinct subagent label values with a turn in the trailing $__rate_interval at each point. Rolling, not cumulative — can fall as well as rise, same shape as any other rate()-derived panel here. Placed at y:15, below where #4491's panel-45 (stat tile, y:11-15) sits once merged, and numbered panel-46 rather than reusing panel-45 — argus caught that this PR and #4491 both independently added a panel-45 in the same grid slot from a shared unmerged base, which would have collided on whichever merged second. Narrower than a true concurrency gauge (subagents open at this exact instant) — that needs hive-subagent-mcp to publish its own metric, which nothing does today; noted as a separate, harder ask on #4488. --- .../swarm-grafana/dashboards/agents.json | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/nix/host-modules/swarm-grafana/dashboards/agents.json b/nix/host-modules/swarm-grafana/dashboards/agents.json index c4e80216..02b9ec35 100644 --- a/nix/host-modules/swarm-grafana/dashboards/agents.json +++ b/nix/host-modules/swarm-grafana/dashboards/agents.json @@ -1404,6 +1404,80 @@ } } } + }, + "panel-46": { + "kind": "Panel", + "spec": { + "id": 46, + "title": "Distinct subagents by agent, over time", + "description": "mara: \"the subagent should already stamp the agent on the metric. so i want to see count of distinct subagent names per agent name over time\" — it does (claude_code.session.count carries both agent and subagent labels on a subagent's own turns). One line per parent agent: at each point, how many differently-named subagents had at least one turn in the trailing $__rate_interval window. This is a ROLLING distinct count, not a running total — it can go back down once a batch of subagents stops running, same shape as any other rate()-style panel on this board. A true concurrent-right-now count (subagents open at this exact instant, able to rise and fall between scrapes) would need hive-subagent-mcp to publish its own gauge on start/stop; nothing does today, and that's a different, harder ask than this one.", + "links": [], + "data": { + "kind": "QueryGroup", + "spec": { + "queries": [ + { + "kind": "PanelQuery", + "spec": { + "query": { + "kind": "DataQuery", + "group": "prometheus", + "version": "v0", + "datasource": { + "name": "@datasourceUid@" + }, + "spec": { + "expr": "count by (agent) (count by (agent, subagent) (increase({__name__=\"claude_code.session.count\", hive=~\"$hive\", agent=~\"$agent\", subagent!=\"\"}[$__rate_interval]) > 0))", + "legendFormat": "{{agent}}" + } + }, + "refId": "A", + "hidden": false + } + } + ], + "transformations": [], + "queryOptions": {} + } + }, + "vizConfig": { + "kind": "VizConfig", + "group": "timeseries", + "version": "", + "spec": { + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "fieldConfig": { + "defaults": { + "unit": "short", + "decimals": 0, + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisSoftMin": 0, + "drawStyle": "line", + "fillOpacity": 0, + "lineWidth": 1, + "showPoints": "never", + "spanNulls": false + } + }, + "overrides": [] + } + } + } + } } }, "layout": { @@ -1690,6 +1764,19 @@ "name": "panel-45" } } + }, + { + "kind": "GridLayoutItem", + "spec": { + "x": 0, + "y": 15, + "width": 24, + "height": 8, + "element": { + "kind": "ElementReference", + "name": "panel-46" + } + } } ] }