defmodule DalaDev.Server.ObserverLive.Tracing do @moduledoc """ LiveView for process tracing and message flow analysis. """ use Phoenix.LiveView, layout: {DalaDev.Server.Layouts, :app} # alias DalaDev.{Observer, Tracing} - currently unused @refresh_interval 5_000 def mount(_params, _session, socket) do if connected?(socket), do: :timer.send_interval(@refresh_interval, self(), :refresh) socket = socket |> assign(:node, Node.self()) |> assign(:available_nodes, [Node.self() | Node.list()]) |> assign(:traces, []) |> assign(:error, nil) |> assign(:loading, false) {:ok, fetch_traces(socket)} end def handle_params(%{"node" => node_str}, _uri, socket) do try do node = String.to_existing_atom(":#{node_str}") {:noreply, assign(socket, :node, node) |> fetch_traces()} rescue _ -> {:noreply, assign(socket, :error, "Invalid node name: #{node_str}")} end end def handle_params(_params, _uri, socket), do: {:noreply, socket} def handle_info(:refresh, socket), do: {:noreply, fetch_traces(socket)} def handle_event("refresh", _params, socket), do: {:noreply, fetch_traces(socket)} def handle_event("select_node", %{"node" => node_str}, socket) do try do node = String.to_existing_atom(node_str) {:noreply, assign(socket, :node, node) |> fetch_traces()} rescue _ -> {:noreply, assign(socket, :error, "Invalid node: #{node_str}")} end end def render(assigns) do ~H"""
<%= @error %>
No active traces. Start a trace by selecting a process from the Processes tab.
<% else %>| Trace ID | Process | Actions |
|---|---|---|
| <%= trace.id %> | <%= trace.process || "-" %> |