show cloud poller device count

This commit is contained in:
Graham McIntire 2026-02-01 13:41:01 -06:00
parent 2a5622d95a
commit b241d9df91
No known key found for this signature in database
2 changed files with 39 additions and 0 deletions

View file

@ -32,6 +32,18 @@ defmodule ToweropsWeb.AgentLive.Index do
{token.id, %{direct: direct, total: total}} {token.id, %{direct: direct, total: total}}
end) end)
# device counts for cloud pollers (if superuser)
cloud_poller_counts =
if is_superuser do
Map.new(cloud_pollers, fn token ->
direct = Agents.count_assigned_devices(token.id)
total = length(Agents.list_agent_polling_targets(token.id))
{token.id, %{direct: direct, total: total}}
end)
else
%{}
end
# Get organization-wide agent health statistics # Get organization-wide agent health statistics
agent_health_stats = Stats.get_organization_agent_health(organization.id) agent_health_stats = Stats.get_organization_agent_health(organization.id)
assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id) assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id)
@ -50,6 +62,7 @@ defmodule ToweropsWeb.AgentLive.Index do
|> assign(:global_default_cloud_poller_id, global_default_cloud_poller_id) |> assign(:global_default_cloud_poller_id, global_default_cloud_poller_id)
|> assign(:selected_global_default, global_default_cloud_poller_id || "") |> assign(:selected_global_default, global_default_cloud_poller_id || "")
|> assign(:device_counts, equipment_counts) |> assign(:device_counts, equipment_counts)
|> assign(:cloud_poller_counts, cloud_poller_counts)
|> assign(:agent_health_stats, agent_health_stats) |> assign(:agent_health_stats, agent_health_stats)
|> assign(:assignment_breakdown, assignment_breakdown) |> assign(:assignment_breakdown, assignment_breakdown)
|> assign(:offline_agents, offline_agents) |> assign(:offline_agents, offline_agents)
@ -162,6 +175,8 @@ defmodule ToweropsWeb.AgentLive.Index do
{token.id, %{direct: direct, total: total}} {token.id, %{direct: direct, total: total}}
end) end)
cloud_poller_counts = calculate_cloud_poller_counts(cloud_pollers)
# Refresh health statistics # Refresh health statistics
agent_health_stats = Stats.get_organization_agent_health(organization.id) agent_health_stats = Stats.get_organization_agent_health(organization.id)
assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id) assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id)
@ -174,6 +189,7 @@ defmodule ToweropsWeb.AgentLive.Index do
|> assign(:global_default_cloud_poller_id, global_default_cloud_poller_id) |> assign(:global_default_cloud_poller_id, global_default_cloud_poller_id)
|> assign(:selected_global_default, global_default_cloud_poller_id || "") |> assign(:selected_global_default, global_default_cloud_poller_id || "")
|> assign(:device_counts, equipment_counts) |> assign(:device_counts, equipment_counts)
|> assign(:cloud_poller_counts, cloud_poller_counts)
|> assign(:agent_health_stats, agent_health_stats) |> assign(:agent_health_stats, agent_health_stats)
|> assign(:assignment_breakdown, assignment_breakdown) |> assign(:assignment_breakdown, assignment_breakdown)
|> assign(:offline_agents, offline_agents) |> assign(:offline_agents, offline_agents)
@ -258,6 +274,7 @@ defmodule ToweropsWeb.AgentLive.Index do
cloud_pollers = load_cloud_pollers_if_superuser(socket.assigns.current_scope) cloud_pollers = load_cloud_pollers_if_superuser(socket.assigns.current_scope)
equipment_counts = calculate_device_counts(agent_tokens) equipment_counts = calculate_device_counts(agent_tokens)
cloud_poller_counts = calculate_cloud_poller_counts(cloud_pollers)
agent_health_stats = Stats.get_organization_agent_health(organization.id) agent_health_stats = Stats.get_organization_agent_health(organization.id)
assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id) assignment_breakdown = Stats.get_device_assignment_breakdown(organization.id)
@ -270,6 +287,7 @@ defmodule ToweropsWeb.AgentLive.Index do
|> assign(:agent_tokens, agent_tokens) |> assign(:agent_tokens, agent_tokens)
|> assign(:cloud_pollers, cloud_pollers) |> assign(:cloud_pollers, cloud_pollers)
|> assign(:device_counts, equipment_counts) |> assign(:device_counts, equipment_counts)
|> assign(:cloud_poller_counts, cloud_poller_counts)
|> assign(:agent_health_stats, agent_health_stats) |> assign(:agent_health_stats, agent_health_stats)
|> assign(:assignment_breakdown, assignment_breakdown) |> assign(:assignment_breakdown, assignment_breakdown)
|> assign(:offline_agents, offline_agents) |> assign(:offline_agents, offline_agents)
@ -291,6 +309,14 @@ defmodule ToweropsWeb.AgentLive.Index do
end) end)
end end
defp calculate_cloud_poller_counts(cloud_pollers) do
Map.new(cloud_pollers, fn t ->
direct = Agents.count_assigned_devices(t.id)
total = length(Agents.list_agent_polling_targets(t.id))
{t.id, %{direct: direct, total: total}}
end)
end
defp get_success_message(is_cloud_poller) do defp get_success_message(is_cloud_poller) do
if is_cloud_poller, if is_cloud_poller,
do: "Cloud poller created successfully", do: "Cloud poller created successfully",

View file

@ -214,6 +214,19 @@
</span> </span>
</:col> </:col>
<:col :let={agent} label="Device">
<% counts = Map.get(@cloud_poller_counts, agent.id, %{direct: 0, total: 0}) %>
<div class="text-sm text-gray-900 dark:text-white">
{counts.total} total
</div>
<div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5">
{counts.direct} direct
<%= if counts.total > counts.direct do %>
· {counts.total - counts.direct} inherited
<% end %>
</div>
</:col>
<:col :let={agent} label="Last Seen"> <:col :let={agent} label="Last Seen">
<div class="text-sm text-gray-900 dark:text-white"> <div class="text-sm text-gray-900 dark:text-white">
<.timestamp datetime={agent.last_seen_at} timezone={@timezone} /> <.timestamp datetime={agent.last_seen_at} timezone={@timezone} />