diff --git a/lib/towerops_web/live/site_live/show.ex b/lib/towerops_web/live/site_live/show.ex index 8c5a3fef..6f85120c 100644 --- a/lib/towerops_web/live/site_live/show.ex +++ b/lib/towerops_web/live/site_live/show.ex @@ -3,6 +3,7 @@ defmodule ToweropsWeb.SiteLive.Show do use ToweropsWeb, :live_view alias Towerops.Devices + alias Towerops.Monitoring alias Towerops.Sites @impl true @@ -15,11 +16,49 @@ defmodule ToweropsWeb.SiteLive.Show do organization = socket.assigns.current_organization site = Sites.get_organization_site!(organization.id, id) device = Devices.list_site_devices(site.id) + latency_chart_data = load_site_latency_chart_data(device) {:noreply, socket |> assign(:page_title, site.name) |> assign(:site, site) - |> assign(:device, device)} + |> assign(:device, device) + |> assign(:latency_chart_data, latency_chart_data)} + end + + defp load_site_latency_chart_data(devices) do + if Enum.empty?(devices) do + nil + else + twenty_four_hours_ago = DateTime.add(DateTime.utc_now(), -24, :hour) + + datasets = + devices + |> Enum.map(fn device -> + checks = + device.id + |> Monitoring.get_latency_data(since: twenty_four_hours_ago, limit: 1000) + |> Enum.reverse() + + %{ + label: device.name, + data: Enum.map(checks, &latency_check_to_data_point/1) + } + end) + |> Enum.reject(fn dataset -> Enum.empty?(dataset.data) end) + + if Enum.empty?(datasets) do + nil + else + Jason.encode!(%{datasets: datasets}) + end + end + end + + defp latency_check_to_data_point(check) do + %{ + x: DateTime.to_unix(check.checked_at, :millisecond), + y: check.response_time_ms + } end end diff --git a/lib/towerops_web/live/site_live/show.html.heex b/lib/towerops_web/live/site_live/show.html.heex index c87b645d..f4e24576 100644 --- a/lib/towerops_web/live/site_live/show.html.heex +++ b/lib/towerops_web/live/site_live/show.html.heex @@ -120,4 +120,28 @@ <% end %> + + <%= if @latency_chart_data do %> +
+
+
+

+ Site Latency - Last 24 Hours +

+
+
+
+ +
+
+
+
+ <% end %>