feat(traffic): a host's top senders, on its page and as get_host_senders (#6115)
CI / lint (push) Successful in 2s
CI / unit (push) Successful in 1m29s
CI / integration (push) Successful in 1m39s
CI / publish (push) Successful in 1m4s

The host page gains a "Who's sending" panel, and the MCP a tool, that
put the host's outbound (or inbound) traffic down to its containers and
NFS mounts: read in shared time buckets, so the host's busiest bucket
says who was sending in it. A swarm service's tasks add up under its
name; what none of them accounts for is the host itself.

Also fixes CI 9488: per-container net_rx_bps / net_tx_bps join the
docker alert catalog, so a rule can catch a container flooding the
uplink.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 14:38:28 -04:00
co-authored by Claude Opus 5.5
parent 613ed4e78b
commit 26bc57ce04
11 changed files with 319 additions and 7 deletions
+3 -1
View File
@@ -19,10 +19,12 @@ def test_plugin_exposes_the_mcp_hooks():
reg = MagicMock()
agent_plugin.register_mcp_tools(reg)
assert [c.args[0].__name__ for c in reg.call_args_list] == [
"list_agents", "list_maintenance_plans", "get_maintenance_job", "run_maintenance"]
"list_agents", "list_maintenance_plans", "get_maintenance_job", "get_host_senders",
"run_maintenance"]
roles = {c.args[0].__name__: c.kwargs["role"] for c in reg.call_args_list}
assert roles["run_maintenance"].value == "admin" # as Update now on the page
assert roles["get_maintenance_job"].value == "viewer"
assert roles["get_host_senders"].value == "viewer"
assert callable(agent_plugin.mcp_overview)